特征工程
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。
在机器学习中如果存在重复值是不需要进行去重处理的。
在机器学习中如果有文本数据机器是不能识别的,我们得进行相关的转换,让机器可以进行相关的学习。满足相关的数据处理。这就是属于特征工程
比如给了一片文章,进行文章分类的时候,要把文章转换成相关的数字特征,然后对相关特征进行分类。
这里我们先采用scikit-learn库
scikit-learn相关介绍:
- python语言的机器学习工具
- scikit-learn包括许多知名的机器学习算法的实现
- 学习文档完善,容易上手,丰富的API,在学术界颇受欢迎。
- 目前稳定版0.19
注意:安装scikit-learn中需要pandas和numpy相关库
特征抽取
前面说过将文本数据转换为数值类型,就是特征抽取的一种方式。将文本,字符转进行转换。
#特征抽取例子
from sklearn.feature_extraction.text import CountVectorizer
#实例化对象
vector=CountVectorizer()
#调用相关函数,输入数据进行转换
res=vector.fit_transform(['today is a beautiful day','i love this day'])
#打印结果
print(vector.get_feature_names())
print(res.toarray())
#结果:
['beautiful', 'day', 'is', 'love', 'this', 'today']
[[1 1 1 0 0 1]
[0 1 0 1 1 0]]
将’today is a beautiful day’ 和 'i love this day’进行了相关的转换分别转换成了[1 1 1 0 0 1]和[0 1 0 1 1 0]这就是对相关文本进行特征值化让机器可以去识别。
特征抽取的API:sklearn.feature_extraction
字典特征抽取:
作用: 对字典数据进行特征值化
API: sklearn.feature_extraction.DictVectorizer
DictVectorizer语法:
DictVectorizer(sparse=True,…)
-DictVectorizer.fit_transform(X)
-X:字典或者包含字典的迭代器
-返回值:返回sparse矩阵
-DictVectorizer.inverse_transform(X)
-X:array数组或者sparse矩阵
-返回值:转换之前数据格式
-DictVectorizer.get_feature_names()
-返回类别名称
-DictVectorizer.transform(X)
-按照原先的标准转换
相关流程:
1.实例化DictVectorizer
2.调用fit_transform 输入数据并转换 注意数据的格式
from sklearn.feature_extraction import DictVectorizer
def dictvec():
"""
字典数据抽取
:return:
"""
#实例化
dict=DictVectorizer()
#调用fit_transformn 列表里面套字典
data=dict.fit_transform([{'city': '重庆','temperature':100},
{'city': '成都','temperature':60},
{'city': '武汉','temperature':30}]
)
print(data)
return None
if __name__ == '__main__':
dictvec()
这就是sparse的数据格式,节约内存,方便读取处理。
可以在实例化中将 dict=DictVectorizer(saprse=Flase)改为Flase就可以打印数组。
跟前面的对比:比如说(0,2) 1.0 就是在第1行的第三个值是1.0,如果值为0时默认是没有的。
在上面加入print(dict.get_feature_names())
字典数据抽取:把字典中的一些类别的数据,分别转换为特征,如果是数值类型可以不进行转换
注意:不是什么特征都需要,对需要的特征进行选择
one-hot编码分析
这个格式也叫作one-hot编码
one-hot编码介绍:对类别进行处理,处理过后的数据
比如说上面的这个表,有7个样本,每个样本有自己的类别。比如说1是human,2是penguin,那么这些数据会不会有一个优先级的排序,所有说为了让数据进行公平的处理,所以说有了one-hot编码。
这样有利于机器学习的算法。
文本特征抽取
作用:对文本数据进行特征值化
类:sklearn.feature_extraction.text.CountVectorizer
- CountVectorizer语法
-CountVectorizer(max_df=1.0,min_df=1,…)
- 返回词频矩阵
-CountVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
-CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
-CountVectorizer.get_feature_names()
返回值:单词列表
from sklearn.feature_extraction.text import CountVectorizer
def countvec():
"""
对文本进行特征值化
:return: None
"""
cv=CountVectorizer()
data=cv.fit_transform(['today is a beautiful day','i love this day'])
print(data)#这里打印出sparse矩阵
print(cv.get_feature_names())#打印单词列表
print(data.toarray())#这里打印出数组通过toarray()方法
if __name__ == '__main__':
countvec()
这里解释一下:这里把前面两句话统计为6个词,判断每个词在每句话中出现的次数,就是下面打印的相关的数组。beautiful在第一句话中出现一次所有打印出来是1。
print(cv.get_feature_names())#打印单词列表
这里是统计文章中所有的值,重复的只看做一次
对每篇文章在词的列表里面进行统计每个词的出现次数
单个 字母,汉子 不统计:单个字母没有情感的趋向,还有分类的依据
文本特征抽取:Count 用于文本分类还有情感分析
对中文进行特征值化:运用分词工具jieba
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word():
co1=jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天")
co2=jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去")
co3=jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系")
#转换成列表
content1=list(co1)
content2=list(co2)
content3=list(co3)
# 把列表转成字符串
c1=' '.join(content1)
c2=' '.join(content2)
c3=' '.join(content3)
return c1,c2,c3
def hanzivec():
"""中文特征值化"""
c1,c2,c3=cut_word()
print(c1,c2,c3)
cv=CountVectorizer()
data=cv.fit_transform([c1,c2,c3])
print(data.toarray())
print(cv.get_feature_names())
return None
if __name__ == '__main__':
hanzivec()
通过比较每篇文章得出的列表得出每篇文章属于的类别。
文本分析方法二:tf * idf
在一篇文章中,如果出现了一些关键词的次数很多,其实就能够去表明这篇文章的类别,比如说一片文章中反复出现“证券”,“共享,车”等这些词汇我们其实就可以大概判断出文章的类别了。
还得注意的是比如有些语气词的反复出现比如说:“我们”,“可以”,“能够”。这些词语容易在很多文章中反复的出现,所以我们不能拿这个去判断一篇文章的类别。
Tf: term frequency: 词的频率
idf:逆文档频率 inverse document frequency
公式:log(总文档数量/该词出现的文档数量)
比如:“所以”这个词在每篇文章中出现次数很多,总文档数不变那么的到的log的值就会很小”
API:sklearn.feature_extraction.text.TfidVectorizer
-TfidfVectorizer(stop_words=None,…)
返回词的权重矩阵
-TfidfVectorizer.fit_transform(X,y)
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():
co1=jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天")
co2=jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去")
co3=jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系")
#转换成列表
content1=list(co1)
content2=list(co2)
content3=list(co3)
# 把列表转成字符串
c1=' '.join(content1)
c2=' '.join(content2)
c3=' '.join(content3)
return c1,c2,c3
def tfidfvec():
"""中文特征值化"""
c1,c2,c3=cut_word()
print(c1,c2,c3)
tf=TfidfVectorizer()
data=tf.fit_transform([c1,c2,c3])
print(data.toarray())
print(tf.get_feature_names())
return None
if __name__ == '__main__':
tfidfvec()
这里可以看到文章哪个词语的重要性。
create by 0125c