特征工程之特征提取
- 一、什么是特征工程
- 二、特征提取
- 1,字典特征提取
- 2,文本特征提取
- (1)英文文本特征提取
- (2)中文文本特征提取
- (3)Tf-idf 文本特征提取
一、什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程,直接影响机器学习的效果。特征工程包括:特征提取,特征预处理,特征降维。
二、特征提取
# 特征提取api
sklearn.feature_extraction
1,字典特征提取
对字典数据进行特征值化,特征当中存在类别信息的做one-hot编码处理
# DictVectorizer
# sparse 决定返回的是否为稀疏矩阵
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
# 常见的方法
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称
实操:对 data 字典数据进行特征提取
from sklearn.feature_extraction import DictVectorizer
data = [{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
# 实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 调用fit_transform
data = transfer.fit_transform(data)
print("返回的结果:\n", data)
# 打印特征名字
print("特征名字:\n", transfer.get_feature_names_out())
可以自行运行没有加上 sparse=False 参数的结果
2,文本特征提取
对数据进行特征值化
# CountVectorizer
# stop_words:停用词表
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
# 常见的方法
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
CountVectorizer.get_feature_names() 返回值:单词列表
(1)英文文本特征提取
实操:对 data 英文文本数据进行特征提取
from sklearn.feature_extraction.text import CountVectorizer
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 实例化一个转换器类
transfer = CountVectorizer()
# 调用 fit_transform
data = transfer.fit_transform(data)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())
(2)中文文本特征提取
问题:中文数据该怎么处理?
英文默认是以空格分开的,其实就达到了一个分词的效果,但是中文空格隔开的是句子,在特征提取时会按句子来划分特征列表,所以要先用 jieba 对中文进行分词处理
# 下载 jieba 库
pip3 install jieba
实操:对 data 中文文本进行特征提取
from sklearn.feature_extraction.text import CountVectorizer
import jieba
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
text_list = []
for d in data:
text_list.append(" ".join(jieba.cut(d)))
# 1、实例化一个转换器类
transfer = CountVectorizer()
# 2、调用 fit_transform
data = transfer.fit_transform(text_list)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())
(3)Tf-idf 文本特征提取
又一问题:该如何处理某个词或短语在多篇文章中出现的次数高这种情况
如果把一些把文章类型无关但是出现多次的词语作为特征,那对于文章分类的判断就会产生干扰。这里用到了 Tf-idf 文本特征提取来解决这个问题。
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
公式
- 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
例:一篇文件的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数,再将得到的商取以10为底的对数。所以,如果"非常"一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg (10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的 tf-idf 的分数为 0.05 * 3 = 0.15
实操:对 data 中文数据进行 Tf-idf 文本特征提取
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
text_list = []
for d in data:
text_list.append(" ".join(jieba.cut(d)))
# 实例化一个转换器类
transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])
# 调用 fit_transform
data = transfer.fit_transform(text_list)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())