机器学习-2.特征工程和文本特征提取

Posted wyply115

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习-2.特征工程和文本特征提取相关的知识,希望对你有一定的参考价值。

1. 数据集的组成

  • 前面讲了,机器学习是从历史数据当中获得规律,那这些历史数据的组成是个什么格式?大都存储在哪里?
    – 在机器学习里大多数数据不会存在数据库中,大都存在文件中(比如csv文件)
    – 不存在数据库原因:1. 读取速度导致存在性能瓶颈。2. 存储的格式不太符合机器学习要求的数据格式。3. 由于我们有pandas,读取文件数据及处理速度非常快。
    – pandas为什么快?1. 基于numpy,numpy非常快,因为numpy释放了GIL锁,它是真正的多线程。
  • 可用的数据集

    – kaggle网址:https://www.kaggle.com/datasets
    – UCI数据集网址:http://archive.ics.uci.edu/ml/
    – scikit-learn网址:https://scikit-learn.org/stable/datasets/index.html#datasets
  • 常用数据集数据的结构组成
    – 结构:特征值+目标值
    – 举例:pandas里的dataFrame由行列索引,其中列索引一般作为特征值数据,依据这些数据进行分析判断得出目标值。比如:根据人的身高,体重,肤色,头发长度等分析这个人的性别。其中性别作为目标值。

2. 特征工程定义

  • 定义:特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高对未知数据预测的准确性。
  • 意义:它会直接影响预测的结果。
  • Scikit-learn工具介绍
    – python语言的机器学习工具
    – 包含很多机器学习算法的实现,文档完善,容易上手,丰富的API,在学术界颇受欢迎。
    – 安装:pip install Scikit-learn,需要提前安装Numpy和pandas库。
    – 导入:import sklearn

3. 特征抽取

  • 特征抽取就是对文本等数据进行特征值化,特征值化是为了计算机更好的去理解数据。
  • sklearn特征抽取api:sklearn.feature_extraction

(1). 字典特征抽取

  • 字典特征抽取:对字典数据进行特征值化,api:sklearn.feature_extraction.DictVectorizer
  • 抽取示例:
from sklearn.feature_extraction import DictVectorizer


def dictvec():
    """
    字典特征抽取示例
    1. 准备数据
    2. 实例化sklearn字典特征抽取类
    3. 调用fit_transform方法进行转换
    4. 输出特征名称
    5. 输出转换后的数据查看效果
    :return: None
    """

    datalist = ['city':'北京','temperature':20, 'city':'上海','temperature':30, 'city':'深圳','temperature':40]  # 准备数据
    dictvec = DictVectorizer(sparse=False)  # 实例化, 默认输出sparse矩阵格式,加上sparse=False后输出正常矩阵格式。
    data = dictvec.fit_transform(datalist)  # 转化数据,字典特征抽取
    print(dictvec.get_feature_names())
    print(data)
 	# print(dictvec.inverse_transform(data)) # 将转化的数据反转成原来的状态,即datalist
    return None


if __name__ == '__main__':
    dictvec()

– sparse矩阵格式:

– 加入sparse=False参数后输出矩阵格式(numpy中的ndarray 二维数组):

  • 由以上示例看出,数值型的数据并没有被转换,因为数值型本身适合进行处理。
  • 那么输出的转换数据[[0. 1. 0. 20.][1. 0. 0. 30.][0. 0. 1. 40.]],如何得来,这里涉及到one-hot编码。
  • one-hot编码分析:
    – 假设要提取特征,把city分类,加入北京为1,上海为2,深圳为3,那么123之间会不会存在优先级之说,起码在含义上是有歧义的,容易误解,为了更加公平所以发明了one-hot编码。看下图:

    上图可以看到,有7个样本,假设第一个样本属于人类型,则human这一列标记为1,其余为0,依次类推即为一个热编码。

(2). 文本特征抽取

第一种方式-CountVectorizer

  • 文本特征抽取就是对文本数据进行特征值化
  • api:sklearn.feature_extraction.text.CountVectorizer
  • 示例:
from sklearn.feature_extraction.text import CountVectorizer

def countvec():
    '''
    文本特征值抽取示例
    1. 准备数据
    2. 实例化sklearn文本特征抽取类
    3. 调用fit_transform方法转换
    4. 输出特征名称
    5. 输出转换后的数据
    :return: None
    '''
    textlist = ["life is short,i like python", "life is too long,i dislike python"]
    cv = CountVectorizer()
    data = cv.fit_transform(textlist)
    print(cv.get_feature_names())
    print(data.toarray())  # 和字典特征抽取不同,没有sparse矩阵设置的参数,因此需要手动toarray()转换为正常数组形式
    return None


if __name__ == '__main__':
    countvec()

– 输出如下图:

由输出结果可以看出:

  1. 统计了所有文章当中所有的词,重复的只做一次
  2. 对每篇文章,在词的列表里面进行统计每个词出现的次数
  3. 单个字母不统计。
  • 对中文的处理
  • 默认sklearn不支持对中文分词处理。需要引入jieba,pip install jieba,然后import jieba,之后jieba.cut(“我是一个程序员”)会返回词语生成器。
  • 示例:
from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cutword():
    '''
    jieba对中文段落进行分词
    :return: c1,c2
    '''
    con1 = jieba.cut("生活苦短,我喜欢python")
    con2 = jieba.cut("人生漫长,我不用python")

    # 转换成列表
    content1 = list(con1)
    content2 = list(con2)

    # 把列表转换为字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)

    return c1,c2

def countvec():
    '''
    文本特征值抽取示例
    1. 获取jieba分词后的字符串
    2. 实例化sklearn文本特征抽取类
    3. 调用fit_transform方法转换
    4. 输出特征名称
    5. 输出转换后的数据
    :return: None
    '''
    c1,c2 = cutword()
    cv = CountVectorizer()
    data = cv.fit_transform([c1,c2])
    print(cv.get_feature_names())
    print(data.toarray())  # 和字典特征抽取不同,没有sparse矩阵设置的参数,因此需要手动toarray()转换为正常数组形式
    return None


if __name__ == '__main__':
    countvec()

– 输出如下图:

第二种方式-TF-IDF(term frequency–inverse document frequency)

  • TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。
  • 主要思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为该词或者短语具有很好的类别区分能力,适合用来分类。
  • 作用:用以评估一个词对于一个文件集或一个语料库中的其中一份文件的重要性。
  • IDF公式:log(总文档数量/该词出现的文档数量)
  • TF*IDF即为 重要性指标
  • API:sklearn.feature_extraction.text.TfidfVectorizer
  • 示例:
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def cutword():
    '''
    jieba对中文段落进行分词
    :return: c1,c2
    '''
    con1 = jieba.cut("生活苦短,我喜欢python")
    con2 = jieba.cut("人生漫长,我不用python")

    # 转换成列表
    content1 = list(con1)
    content2 = list(con2)

    # 把列表转换为字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)

    return c1,c2

def tfidfvec():
    '''
    文本特征值抽取示例
    1. 获取jieba分词后的字符串
    2. 实例化sklearn文本特征抽取类
    3. 调用fit_transform方法转换
    4. 输出特征名称
    5. 输出转换后的数据
    :return: None
    '''
    c1,c2 = cutword()
    tf = TfidfVectorizer()
    data = tf.fit_transform([c1,c2])
    print(tf.get_feature_names())
    print(data.toarray())  # 和字典特征抽取不同,没有sparse矩阵设置的参数,因此需要手动toarray()转换为正常数组形式
    return None

if __name__ == '__main__':
    tfidfvec()
  • 输出如下图:

    根据上图中输出数字的大小找到重要词汇,并根据这些词汇可对文章进行分类,输出的数字是tf*idf得来的。
  • 针对文本的特征提取就是以上内容,目前记录的仍是相对过时的技术,但还是需要理解,为后边打下基础。

以上是关于机器学习-2.特征工程和文本特征提取的主要内容,如果未能解决你的问题,请参考以下文章

机器学习基础教程笔记---特征工程

机器学习算法:特征工程-特征提取

机器学习-2.特征工程和文本特征提取

机器学习特征提取

[机器学习与scikit-learn-43]:特征工程-特征提取(编码)-2-什么是特征提取以及文本词频向量

人工智能_1_初识_机器学习介绍_特征工程和文本特征提取