二、特征工程-2
2.2 特征工程介绍
2.2.1 为什么需要特征工程
2.2.2 什么是特征工程
2.2.3 特征工程的位置与数据处理的比较
pandas:数据清洗、数据处理
sklearn:特征工程
特征工程包含内容
特征抽取
机器学习算法-统计方法-数学公式
文本类型 -> 数值
类别 -> 数值
特征预处理
特征降维
2.3 特征抽取
2.3.1 特征抽取
1 将任意数据转换为机器学习的数字特征
字典特征抽取
文本特征抽取
图像特征抽取
2 特征提取API
sklearn.feature_extraction
2.3.2 字典特征抽取:类别 -> one-hot编码
sklearn.feature_extraction.DictVectorizer(sparse=True)
'''
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称
'''
1 应用
我们我们对一下数据进行特征特征抽取
{'city': '北京', 'temperature': 100}
{'city': '上海', 'temperature': 60}
{'city': '深圳', 'temperature': 30}
2 流程分析
1、实例化转换器类:字典特征抽取
2、 调用fit_transform()
from sklearn.feature_extraction import DictVectorizer
# 字典特征抽取
def dict_demo():
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}
]
# 1、实例化转换器类:字典特征抽取
# 返回稀疏矩阵
transfer = DictVectorizer(sparse=False) # sparse=False,返回稀疏矩阵,默认是二维数组
# 2 调用fit_transform()
data_new = transfer.fit_transform(data)
print('data_new\n', data_new, type(data_new)) # <class 'numpy.ndarray'>
# 稀疏矩阵
# [[ 0. 1. 0. 100.]
# [ 1. 0. 0. 60.]
# [ 0. 0. 1. 30.]]
# 1、实例化转换器类:字典特征抽取
# 返回二维数组
transfer = DictVectorizer(sparse=True)
# 2 调用fit_transform()
data_new = transfer.fit_transform(data)
print('data_new\n', data_new, type(data_new)) # <class 'scipy.sparse.csr.csr_matrix'>
# 二维数组
# (0, 1) 1.0
# (0, 3) 100.0
# (1, 0) 1.0
# (1, 3) 60.0
# (2, 2) 1.0
# (2, 3) 30.0
print('特征名字\n', transfer.get_feature_names())
# ['city=上海', 'city=北京', 'city=深圳', 'temperature']
return None
if __name__ == '__main__':
dict_demo()
2.3.3 文本特征抽取
作用:对文本进行特征值化
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])#返回词频矩阵
'''
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
CountVectorizer.get_feature_names() 返回值:单词列表
'''
sklearn.feature_extraction.text.TfidfVectorize
1 应用
我们我们对一下数据进行特征特征抽取
['life is short, i like like python', 'life is too long, i dislike python']
2 流程分析
from sklearn.feature_extraction.text import CountVectorizer
def text_demo(): # 英文文本抽取
data = ['life is short, i like like python', 'life is too long, i dislike python']
transfer = CountVectorizer(stop_words=["is", "too"]) # 为本特征抽取API 跳过词stop_words=[]
data_new = transfer.fit_transform(data)
print('data_new\n', data_new.toarray(), type(data_new)) # data_new.toarray()将稀疏矩阵变数组
print('特征名字\n', transfer.get_feature_names())
# ['dislike', 'life', 'like', 'long', 'python', 'short']
return None
if __name__ == '__main__':
text_demo()
3 jieba分词处理
jieba.cut() # 返回词语组成的生成器
#安装
pip install jieba
from sklearn.feature_extraction.text import CountVectorizer
import jieba # 导入结巴分词
def cut_word(text):
# 进行中文分词
return ' '.join(list(jieba.cut(text)))
def ch_text_demo(): # 中文文本抽取
data = ['今天很残酷,明天更残酷,后天很美好。',
'我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看宇宙时,我们是在看它的过去。',
'如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的其他事物相联系']
data_new = []
# 将data的句子分词后加入data_new列表
for sent in data:
data_new.append(cut_word(sent))
# 1、实例化转换器类:字典特征抽取
transfer = CountVectorizer(stop_words=[])
'''
CountVectorizer()函数只考虑每个单词出现的频率;然后构成一个特征矩阵,每一行表示一个训练文本的词频统计结果。其思想是,
先根据所有训练文本,不考虑其出现顺序,只将训练文本中每个出现过的词汇单独视为一列特征,构成一个词汇表(vocabulary list),
该方法又称为词袋法(Bag of Words)。
'''
# 2、调用方法
data_final = transfer.fit_transform(data_new)
print('data_new\n', data_final.toarray())
'''
[
[0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 2 0 0 0 1 0 0 0]
[0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 1 3 0 0 1 0 0 1 0 0 0 0 1 1]
[1 1 0 4 3 0 0 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 0 0 2 1 0 1 0 0]
]
'''
print('特征名字\n', transfer.get_feature_names())
# ['一种', '不会', '之前', '了解', '事物', '今天', '光是在', '其他', '几百万年', '发出', '取决于', '只用', '后天', '含义', '如何', '如果', '宇宙', '我们', '方式', '明天', '星系', '某样', '残酷', '看到', '真正', '秘密', '美好', '联系', '过去', '这样']
return None
if __name__ == '__main__':
text_demo()
ch_text_demo()
5 Tf-idf文本特征提取
TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
5.1 公式
词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
两个词:“经济”,“非常”
1000篇文章-语料库
100篇-“非常”
10篇-“经济”
两篇文章
文章A(100词):10次“经济”
tf=10/100=0.1
idf=lg(1000/10)=2
TF-IDF:tf*idf=0.2
文章B(100词):10次 “非常”
tf=10/100=0.1
idf=lg(1000/100)=1
TF-IDF:tf*idf=0.1
5.2 API
sklearn.feature_extraction.text.TfidfVectorizer()#返回词的权重矩阵
'''
TfidfVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
TfidfVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
TfidfVectorizer.get_feature_names() 返回值:单词列表
'''
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cut_word(text):
# 进行中文分词
return ' '.join(list(jieba.cut(text)))
def tfidf_demo():
data = ['今天很残酷,明天更残酷,后天很美好。',
'我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看宇宙时,我们是在看它的过去。',
'如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的其他事物相联系']
data_new = []
for sent in data:
data_new.append(cut_word(sent))
transfer = TfidfVectorizer()
'''
TfidfVectorizer()基于tf-idf算法。此算法包括两部分tf和idf,两者相乘得到tf-idf算法。tf算法统计某训练文本中,某个词的出现次数
'''
data_final = transfer.fit_transform(data_new)
print('data_new\n', data_final.toarray())
'''
[
[0. 0. 0. 0. 0. 0.35355339
0. 0. 0. 0. 0. 0.
0.35355339 0. 0. 0. 0. 0.
0. 0.35355339 0. 0. 0.70710678 0.
0. 0. 0.35355339 0. 0. 0. ]
[0. 0. 0.26532018 0. 0. 0.
0.26532018 0. 0.26532018 0.26532018 0. 0.
0. 0. 0. 0. 0.26532018 0.60534851
0. 0. 0.26532018 0. 0. 0.26532018
0. 0. 0. 0. 0.26532018 0.26532018]
[0.15508369 0.15508369 0. 0.62033475 0.46525106 0.
0. 0.15508369 0. 0. 0.15508369 0.15508369
0. 0.15508369 0.15508369 0.15508369 0. 0.11794514
0.15508369 0. 0. 0.15508369 0. 0.
0.31016737 0.15508369 0. 0.15508369 0. 0. ]
]
'''
print('特征名字\n', transfer.get_feature_names())
# ['一种', '不会', '之前', '了解', '事物', '今天', '光是在', '其他', '几百万年', '发出', '取决于', '只用', '后天', '含义', '如何', '如果', '宇宙', '我们', '方式', '明天', '星系', '某样', '残酷', '看到', '真正', '秘密', '美好', '联系', '过去', '这样']
return None
if __name__ == '__main__':
tfidf_demo()
6 Tf-idf的重要性
分类机器学习算法进行文章分类中前期数据处理方式