当前位置:   article > 正文

机器学习文本特征提取_kbinsdiscretizer

kbinsdiscretizer

1.特征工程直接影响模型预测结果。python用sklearn库做特征工程

两种文本特征抽取方法(Count,  tf-idf)

(1)特征抽取API(统计单词次数)

sklearn.feature_extraction

python调用sklearn.feature_extraction 的DictVectorizer实现字典特征抽取

  1. # 字典特征抽取
  2. def dictvec():
  3. # 特征数据是字符串的话不能输入到算法里面,是要进行特征,转换的转换成OneHot编码。有利于机器学习算法分析。
  4. # 字典数据抽取,把字典中的一些类别特征,转换乘特征(数字),但是字典里面的数字不会进行转换,因为本来就是数据。
  5. # 如果是数组形式,有类别的这些特征,我们要先转换成字典,再进行数据抽取。
  6. # 实例化
  7. dict = DictVectorizer()
  8. # 返回的data是一个sparse矩阵格式
  9. # sparse节约内存,方便数据处理
  10. data = dict.fit_transform([{"city": "北京", 'temperature': 100}, {"city": "上海", 'temperature': 60}, {"city": "深圳", 'temperature': 30}])
  11. print(dict.inverse_transform(data))
  12. print(data)
  13. # 返回内容列表
  14. print(dict.get_feature_names())

#文本数据特种抽取

python调用sklearn.feature_extraction.text 的 CountVectorizer实现文本特征抽取

  1. # 文本特征抽取
  2. def countvec():
  3. test = CountVectorizer() # 统计次数
  4. data = test.fit_transform(["life is is short I like python", "life is too long,I dislike python"])
  5. # 词去重,放在一个列表中
  6. print(test.get_feature_names())
  7. # 返回的是sparse格式,toarray手动转成二元组形式,对每篇文章在词的列表里面统计每个词出现的次数(单个字母不统计)
  8. print(data.toarray())
  9. # ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
  10. # [[0 1 1 1 0 1 1 0]
  11. # [1 1 1 0 1 1 0 1]]
  12. # 中文特征抽取
  13. # 中文因为没有像英文一样进行分词,所以在做特征抽取前要先用jieba进行分词
  14. def cutword():
  15. # 用jieba分词
  16. cont1 = jieba.cut("今天很残酷,明天很残酷,后天很美好")
  17. cont2 = jieba.cut("我们看到的从很远星系来的光是几百万年前发出的")
  18. cont3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解他")
  19. # 转换成列表
  20. content1 = list(cont1)
  21. content2 = list(cont2)
  22. content3 = list(cont3)
  23. # print(content3)
  24. # ['如果', '只用', '一种', '方式', '了解', '某样', '事物', ',', '你', '就', '不会', '真正', '了解', '他']
  25. # 把列表转换成字符串
  26. c1 = ' '.join(content1)
  27. c2 = ' '.join(content2)
  28. c3 = ' '.join(content3)
  29. # print(c1)
  30. # 今天 很 残酷 , 明天 很 残酷 , 后天 很 美好
  31. return c1, c2, c3
  32. def hanzivec():
  33. test = CountVectorizer()
  34. c1, c2 ,c3 = cutword()
  35. data = test.fit_transform([c1, c2, c3])
  36. print(test.get_feature_names())
  37. print(data.toarray())

注:对英文和中文特征抽取过程是不一样的,因为英文单词与单词之间是有空格的,所以不用进行分词。

但是对于中文,词与词之间是没有空格的,所以需要先用jieba进行分词处理,再做特征抽取。

英文特征抽取结果:

['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 2 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

中文特征抽取结果:
['一种', '不会', '了解', '事物', '今天', '光是', '几百万年', '发出', '只用', '后天', '如果', '我们', '方式', '明天', '星系', '某样', '残酷', '看到', '真正', '美好']
[[0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 2 0 0 1]
 [0 0 0 0 0 1 1 1 0 0 0 1 0 0 1 0 0 1 0 0]
 [1 1 2 1 0 0 0 0 1 0 1 0 1 0 0 1 0 0 1 0]]

(2)对于以上用统计每个单词数量的方法来做文章的比较,有一个问题就是,每篇文章假如出现了大量的中性词(所以,因为,如果,那么等等),用统计的方法就不再合适。

TF-IDF

Tf:term frequency(词的频率)

idf:inverse document frequency(逆文档频率)

统计词每篇文章出现的次数 * log(总文档数量/该词出现的文档数量)=重要性

举例:

假如有三篇文章c1, c2, c3

“所以”一词出现在两篇文章中,c1出现了5次,c2出现了2次

那么对于第一篇文档TF-IDF就是5*log(3/2)

那么对于第二篇文档TF-IDF就是2*log(3/2)

对于原本出现次数比较多的此压缩了权重

对于原本出现次数比较少的此增加了权重

可以得出每个词对于这篇文章的重要性

具体意思就是如果一些词在一篇文章出现频率较高,在其他文章出现频率较低,那么说明这些词对于这篇文章重要程度较高。而对于一些所有文章都出现的词那么重要程度较低。
 

from sklearn.feature_extraction.text import TfidfVectorizer

  1. # TFIDF特征抽取
  2. def tfidfvec():
  3. test = TfidfVectorizer()
  4. c1, c2, c3 = cutword()
  5. data = test.fit_transform([c1, c2, c3])
  6. print(test.get_feature_names())
  7. print(data.toarray())

一共三篇文章,结果是每个词在其所在的文章所占的比重。

目标值标签编码

sklearn必须导入数值型。不能是字符串(可以导入一维数组)。

所以我们需要对目标值进行处理

  1. from sklearn.preprocessing import LabelEncoder
  2. #去除最后一列,用LabelEncoder转换成编码(0,1,2)
  3. data.iloc[:, -1] = LabelEncoder().fit_transform(data.iloc[:, -1])

类别型特征做独热编码OneHotEncoder

例如:

有两列特征性别(男,女)、学历(初中,高中,大学)

小明是男生,大学。那么做完独热编码后小明的特征就转换成

1,0,0,0,1

  1. # 取所有行的第一列到倒数第二列
  2. X = data.iloc[:, 1:-1]
  3. #auto,自动识别有几类
  4. enc = OneHotEncoder(categories='auto')
  5. # toarray,将结果转换成一个array数组
  6. result = enc.fit_transform(X).toarray()
  7. # 将OneHot编码后的结果还原
  8. pd.DataFrame(enc.inverse_transform(result))
  9. # 换回OneHot编码后的分类对照结果
  10. # enc.get_feature_names()

Binarizer处理对特征做二值化处理

  1. # 所有对列处理的方法传入的数值都不能是一维,要转成二维数组
  2. X = data_2.ilco[:, 0].values.reshape(-1, 1)
  3. transformer = Binarizer(threshold=30).fit_transform(X)
  4. # 将转换后的0,1数值替换掉原来的列
  5. data_2.iloc[:, 0] = transformer

KBinsDiscretizer对数值做多值化处理

  1. from sklearn.preprocessing import KBinsDiscretizer
  2. # 分成3箱,用独热编码,等宽
  3. est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/688143
推荐阅读
相关标签
  

闽ICP备14008679号