特征工程之特征提取

Dear 丶 2022-12-28 11:26 272阅读 0赞

特征工程之特征提取

  • 应用DictVectorizer实现对类别特征进行数值化、离散化
    • 应用
    • 流程分析
  • 应用CountVectorizer实现对文本特征进行数值化
    • 应用
    • 流程分析
    • jieba 分词处理
      • 案例分析
  • 应用TfidfVectorizer实现对文本特征进行数值化
    • Tf-idf文本特征提取
    • 公式
    • API
    • Tf-idf 的重要性

特征提取即将任意数据(如文本或图像)转换为可用于机器学习的数字特征
:特征值化是为了计算机更好的去理解数据

  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取(深度学习将介绍)

特征提取API

  1. sklearn.feature_extraction

应用DictVectorizer实现对类别特征进行数值化、离散化

  • sklearn.feature_extraction.DictVectorizer(sparse=True,...)

    • DictVectorizer.fit_transform(X), X : 字典或者包含字典的迭代器,返回值:返回sparse矩阵
    • DictVectorizer.inverse_transform(X): X : array数组或者sparse矩阵 返回值:转换之前数据格式
    • DictVectorizer.get_feature_names() 返回类别名称

应用

我们对以下数据进行特征提取

  1. data = [
  2. {
  3. 'city': '北京', 'value' : 150},
  4. {
  5. 'city': '浙江', 'value': 10},
  6. {
  7. 'city': '上海', 'value': 50}
  8. ]

流程分析

  • 实例化类 DictVectorizer
  • 调用 fit_transform 方法输入数据并转化 (注意返回格式)

    from sklearn.feature_extraction import DictVectorizer

  1. if __name__ == '__main__':
  2. data = [
  3. {
  4. 'city': '北京', 'value' : 150},
  5. {
  6. 'city': '浙江', 'value': 10},
  7. {
  8. 'city': '上海', 'value': 50}
  9. ]
  10. # 示例化一个转化器类
  11. transfer = DictVectorizer(sparse=False)
  12. # 调用 transfer.fit_transform
  13. data = transfer.fit_transform(data)
  14. print('返回结果为:', data)
  15. # 输出特征名字
  16. print('特征名字为:', transfer.get_feature_names())
  17. # 输出结果为
  18. '''
  19. 返回结果为: [[ 0. 1. 0. 150.]
  20. [ 0. 0. 1. 10.]
  21. [ 1. 0. 0. 50.]]
  22. 特征名字为: ['city=上海', 'city=北京', 'city=浙江', 'value']
  23. '''

注意观察没有加上 sparse=False 参数的结果

  1. from sklearn.feature_extraction import DictVectorizer
  2. if __name__ == '__main__':
  3. data = [
  4. {
  5. 'city': '北京', 'value' : 150},
  6. {
  7. 'city': '浙江', 'value': 10},
  8. {
  9. 'city': '上海', 'value': 50}
  10. ]
  11. # 示例化一个转化器类
  12. transfer = DictVectorizer()
  13. # 调用 transfer.fit_transform
  14. data = transfer.fit_transform(data)
  15. print('返回结果为:', data)
  16. # 输出特征名字
  17. print('特征名字为:', transfer.get_feature_names())
  18. # 输出结果为
  19. '''
  20. 返回结果为: (0, 1) 1.0
  21. (0, 3) 150.0
  22. (1, 2) 1.0
  23. (1, 3) 10.0
  24. (2, 0) 1.0
  25. (2, 3) 50.0
  26. 特征名字为: ['city=上海', 'city=北京', 'city=浙江', 'value']
  27. '''

可以看到没有加上 sparse=False 参数的结果为 sparse 矩阵,sparse 稀疏,将非零值 按位置表示出来,可以节省内存,提高加载效果

应用CountVectorizer实现对文本特征进行数值化

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

    • 返回词频矩阵
    • stop_words 参数表示停用的词
  • CountVectorizer.fit_transform(X)

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

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

    • 返回值:单词列表
  • sklearn.feature_extraction.text.TfidfVectorizer

应用

我们对以下数据进行特征提取

  1. data = [
  2. 'Everyone is fighting their own battle.',
  3. 'To be free from their past.',
  4. 'To live in their present.',
  5. 'And to create their future.'
  6. ]

流程分析

  • 实例化类 CountVectorizer
  • 调用 fit_transform 方法输入数据并转化 (注意返回格式,利用 toarray() 进行 sparse 矩阵转化为 array 数组)

    from sklearn.feature_extraction.text import CountVectorizer

  1. if __name__ == '__main__':
  2. data = [
  3. 'Everyone is fighting their own battle.',
  4. 'To be free from their past.',
  5. 'To live in their present.',
  6. 'And to create their future.'
  7. ]
  8. # 示例化一个转化器类
  9. transfer = CountVectorizer()
  10. # 调用 transfer.fit_transform
  11. data_new = transfer.fit_transform(data)
  12. print('返回结果为:', data_new.toarray())
  13. # 输出特征名字
  14. print('特征名字为:', transfer.get_feature_names())
  15. # 输出结果为
  16. '''
  17. 返回结果为: [[0 1 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0]
  18. [0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 1 1]
  19. [0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 1]
  20. [1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1]]
  21. 特征名字为: ['and', 'battle', 'be', 'create', 'everyone', 'fighting', 'free', 'from', 'future', 'in', 'is', 'live', 'own', 'past', 'present', 'their', 'to']
  22. '''

然而,当文本为中文时,由于每个字之间没有空格,所以在面对中文文本的时候,我们需要先进行分词:

jieba 分词处理

  • jieba.cut()

    • 返回词语组成的生成器

需要安装 jieba

  1. pip install jieba

案例分析

我们对python 之禅 进行特征提取

  1. data = [
  2. '优美胜于丑陋(Python以编写优美的代码为目标)',
  3. '明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)',
  4. '简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)',
  5. '复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)',
  6. '扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)',
  7. '间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)',
  8. '可读性很重要(优美的代码是可读的)',
  9. '即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)',
  10. '不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)',
  11. '当存在多种可能,不要尝试去猜测',
  12. '而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)',
  13. '做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)',
  14. '如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)',
  15. '命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)'
  16. ]
  • 分析

    • 准备句子,利用 jieba.cut 进行分词
    • 实例化 CountVectorizer
    • 将分词结果变成字符串当作fit_transform的输入值

    import jieba
    from sklearn.feature_extraction.text import CountVectorizer

  1. def cut_word(text):
  2. return ' '.join(list(jieba.cut(text)))
  3. if __name__ == '__main__':
  4. data = [
  5. '优美胜于丑陋(Python以编写优美的代码为目标)',
  6. '明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)',
  7. '简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)',
  8. '复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)',
  9. '扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)',
  10. '间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)',
  11. '可读性很重要(优美的代码是可读的)',
  12. '即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)',
  13. '不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)',
  14. '当存在多种可能,不要尝试去猜测',
  15. '而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)',
  16. '做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)',
  17. '如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)',
  18. '命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)'
  19. ]
  20. data_new = [cut_word(sent) for sent in data]
  21. # print(data_new)
  22. # 示例化一个转化器类
  23. transfer = CountVectorizer(stop_words=['except', 'pass', '(', ')'])
  24. # 调用 transfer.fit_transform
  25. data_final = transfer.fit_transform(data)
  26. print('返回结果为:', data_final.toarray())
  27. # 输出特征名字
  28. print('特征名字为:', transfer.get_feature_names())

应用TfidfVectorizer实现对文本特征进行数值化

Tf-idf文本特征提取

  • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

公式

  • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
  • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
  • tfidf = tf * idf
  • 最终结果可以理解为重要程度

API

  • sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None,...)

    • 返回词的权重矩阵
  • TfidfVectorizer.fit_transform(X)

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

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

    • 返回值:单词列表

    import jieba
    from sklearn.feature_extraction.text import TfidfVectorizer

  1. def cut_word(text):
  2. return ' '.join(list(jieba.cut(text)))
  3. if __name__ == '__main__':
  4. data = [
  5. '优美胜于丑陋(Python以编写优美的代码为目标)',
  6. '明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)',
  7. '简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)',
  8. '复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)',
  9. '扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)',
  10. '间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)',
  11. '可读性很重要(优美的代码是可读的)',
  12. '即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)',
  13. '不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)',
  14. '当存在多种可能,不要尝试去猜测',
  15. '而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)',
  16. '做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)',
  17. '如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)',
  18. '命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)'
  19. ]
  20. data_new = [cut_word(sent) for sent in data]
  21. # print(data_new)
  22. # 示例化一个转化器类
  23. transfer = TfidfVectorizer(stop_words=['except', 'pass', '(', ')'])
  24. # 调用 transfer.fit_transform
  25. data_final = transfer.fit_transform(data)
  26. print('返回结果为:', data_final.toarray())
  27. # 输出特征名字
  28. print('特征名字为:', transfer.get_feature_names())

Tf-idf 的重要性

分类机器学习算法进行文章分类中前期数据处理方式

发表评论

表情:
评论列表 (有 0 条评论,272人围观)

还没有评论,来说两句吧...

相关阅读