机器学习基础——特征提取(笔记一)

1.机器学习简介

定义:机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测

数据集的构成:特征值+目标值

对于每一行的数据可以成为样本,有些数据集可以没有目标值

机器学习算法分类:

       目标值:类别——分类问题

              算法:K-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归

       目标值:连续型的数据——回归问题

              算法:线性回归,岭回归

       目标值:无——无监督学习

              算法:K-means

机器学习开发流程:

  1. 获取数据
  2. 数据处理
  3. 特征工程
  4. 机器学习算法训练——模型
  5. 模型评估
  6. 应用

2..数据集

可用数据集

1.Sklean:http://scikit-learn.org/stable/datasets/index.html#datasets(0.19.1)

2.Kaggle:https://www.kaggle.com/datasets

3.UCI:http://archive.ics.uci.edu/ml/

Scikit-learn数据集API介绍:

       Sklearn.datasets

              Datasets.load_*()——获取小规模数据集

              Datasets.fetch_*(data_home=None)——获取大规模数据集

              Data_home表示数据集下载的目录,默认是~/scikit_learn_data/

数据集的返回值:

Datasets.base.Bunch(继承自字典)

Dist[“keys”]=values

Bunch.key=values

获取数据集

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

def datasets_demo():
    """
    sklearn数据集使用
    :return:
    """
    #获取数据集
    iris=load_iris()
    print("鸢尾花数据集:\n",iris)
    print("查看数据集描述:\n",iris["DESCR"])
    print("查看特征值的名字:\n",iris.feature_names)
    print("查看特征值:\n",iris.data,iris.data.shape)

    #数据集划分
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
    print("训练集的特征值:\n",x_train,x_train.shape)
    return None

数据集的划分:

       训练数据:用于训练,构建模型

       测试数据:在模型检验时使用,用于评估模型是否有效(20%-30%)

Sklearn.model_selection.train_test_split(arrays,*options)

       X数据集的特征值

       Y数据集的标签值

       Test_size测试集的大小一般为float

       Random_state随机数种子,不同造成不同随机采样结果,相同采样结果相同

       Return训练集特征值。测试集特征值,训练集目标值,测试集目标值

3.特征工程

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。

意义:会直接影响机器学习的效果

特征工程包含内容:

       特征抽取/提取

       特征预处理

       特征降维

特征提取:

       将任意数据(如文本或图像)转换为可用于机器学习的数字特征

              字典特征提取(特征离散化)

              文本特征提取

              图像特征提取(深度学习)

API:sklearn.feature_extraction

流程:

       (1)、实例化类CountVectorizer

       (2)、调用fit_transforrm方法输入数据并转换

对字典数据进行特征提取:

Sklearn.feature_extraction.DictVectorize(spare=True,…)

       DictVectorizer.fit_transform(X):X:字典或者包含字典的迭代器返回值,返回sparse矩阵

       DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式

       DictVectorizer.get_feature_names() 返回类别名称

Sparse矩阵:将非零值 按位置表示出来——节省内存、提高加载效率

from sklearn.feature_extraction import DictVectorizer

def dict_demo():
    """
    字典特征提取
    :return:
    """
    data=[{"name:":"李昌茂","old:":22},{"name:":"张三","old:":32},{"name:":"王五","old:":45}]
    #1.实例化一个转换器类
    transfer=DictVectorizer(sparse=False)
    #2.调用fit_transform()
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    print("特征名字:\n",transfer.get_feature_names())
    return None

对文本特征提取(单词)

方法一:Sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象,返回值:返回sparse矩阵

CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式

方法一、CountVectorizer.get_feature_names()返回值:单词列表

       统计每个样本特征词出现的个数

       Stop_words停用的词表

关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer

def count_demo():
    """
    文本特征提取  CountVectorizer
    :return:
    """
    data=["my name is lichangmao","small name is is maomao"]
    #1.实例化一个转换器类
    transfer=CountVectorizer()
    #2.调用fit_transform
    data_new=transfer.fit_transform(data)
    print("特征名字:\n",transfer.get_feature_names())
    print("data_new:\n",data_new.toarray())
    return None
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba

def cut_world(text):
    """
    进行中文分词
    :param text:
    :return:
    """
    text=" ".join(list(jieba.cut(text)))
    return text

def count_Chinese_demo():
    """
    中文文本特征提取,自动分词
    :return:
    """
    data=["晋太元中,武陵人捕鱼为业。太元,缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷,渔人甚异之。"
          "复前行,欲穷其林。林尽水源,便得一山,山有小口,仿佛若有光。"
          "桃花源记"]
    #1.将中文文本分词
    data_new=[]
    for sent in data:
        data_new.append(cut_world(sent))
    print(data_new)
    # 1.实例化一个转换器类
    transfer = CountVectorizer()
    # 2.调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("特征名字:\n", transfer.get_feature_names())
    print("data_new:\n", data_final.toarray())
    return None

 

方法二、Sklearn.feature_extraction.text.TfidfVectorizer

       TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

       TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度

公式:

                                                              

词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率

逆向文档频率(inverse document frequency, idf)是一个词语普遍重要性的度量。某一特定词语的dif,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取义10为底的对数得到

tfidfi,j=tfi,j*idfi

最终得出结果可以理解为重要程度

API:sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None)

       返回词的权重矩阵

              TfidfVectorizer.fit_transform(X)

                     X:文本或者包含文本字符串的可迭代对象

                     返回值:返回sparse矩阵

              TfidVectorizer.inverse_transform(X)

                     X:array数组或者sparse矩阵

                     返回值:转换之前数据格式

              TfidfVectorizer.get_feature_names()

                     返回值:单词列表

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer


def tfidf_demo():
    """
    用TF-DIF的方法进行文本特征提取
    :return:
    """
    data = ["晋太元中,武陵人捕鱼为业。太元,缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷,渔人甚异之。"
            "复前行,欲穷其林。林尽水源,便得一山,山有小口,仿佛若有光。"
            "桃花源记"]
    # 1.将中文文本分词
    data_new = []
    for sent in data:
        data_new.append(cut_world(sent))
    print(data_new)
    # 1.实例化一个转换器类
    transfer = TfidfVectorizer()
    # 2.调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("特征名字:\n", transfer.get_feature_names())
    print("data_new:\n", data_final.toarray())
    return None

最后逐个在主函数中调用即可。 

你可能感兴趣的:(机器学习,python,机器学习,人工智能)