机器学习之特征工程
目录
1.特征工程的定义
1.1为什么需要特征工程
- 样本数据中的特征有可能会存在缺失值,重复值,异常值等,需要对特征中的相关的噪点数据进行处理
- 处理目的:有一个更纯净的样本集,让模型基于这组数据可以有更好的预测能力…
1.2什么是特征工程
- 特征工程是将原始数据转换为更好能代表预测模型的潜在问题的特征过程,从而提高对未知数据预测的准确性
- 比如:AlphaGo学习的数据中既有棋谱,又有食谱和歌词,一些干扰数据绝对会影响AlphaGo的学习
1.3特征工程的意义
- 直接会影响模型预测的结果
1.4实现特征工程
- 使用工具:
sklearn
sklearn
介绍- 是python语言中的机器学习工具,包含了很多知名的机器学习算法的实现,其文档完善,容易上手
- 功能
- 分类模型,回归模型,聚类模型,特征工程
2.特征提取
2.1目的
- 样本中的特征数据很多时候为字符串或者其他类型的数据,计算机只可以识别二进制数值型的数据,如果把字符串给计算机,计算机不能识别【如果不是数值型数据,识别不了】
- 特征抽取对文本等数据进行特征值化【将数据转为数值型数据】,特征值化是为了让机器更好的理解数据
2.2特征提取的方式
2.2.1字典特征提取
- 作用:对字典数据进行特征值化
from sklearn.feature_extraction import DictVectorizer
fit_transform(X) #X为字典或者包含字典的迭代器,返回值为sparse矩阵
inverse_transform(X) #X为sparse矩阵或者array数组,返回值为转换之前的数据格式
transform(X) #按照原先的标准转换
get_feature_names() #返回类别名称
- 示例代码
from sklearn.feature_extraction import DictVectorizer
alist=[
{"city":'AHui','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
d=DictVectorizer() #实例化一个工具类对象
feature=d.fit_transform(alist) #返回一个sparse矩阵(存储的就是特征值化之后的结果)
print(feature)
# (0, 0) 1.0
# (0, 3) 33.0
# (1, 1) 1.0
# (1, 3) 42.0
# (2, 2) 1.0
# (2, 3) 40.0
print(d.get_feature_names())
# ['city=AHui', 'city=GZ', 'city=SH', 'temp']
print(feature.toarray())
# [[ 1. 0. 0. 33.]
# [ 0. 1. 0. 42.]
# [ 0. 0. 1. 40.]]
-
sparse矩阵的理解
- 在
DictVectorizer
类的构造方法中设定sparse=False,则返回的就不是sparse矩阵,而是一个数组 - sparse矩阵就是一个变相的数组或者列表,目的是为了节省内存
- 在
-
示例代码
from sklearn.feature_extraction import DictVectorizer
alist=[
{"city":'AHui','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
d=DictVectorizer(sparse=False)
#返回一个二维列表
fature=d.fit_transform(alist)
print(d.get_feature_names()) # ['city=AHui', 'city=GZ', 'city=SH', 'temp']
print(feature)
#输出结果:1为是,0为不是
# [[ 1. 0. 0. 33.]
# [ 0. 1. 0. 42.]
# [ 0. 0. 1. 40.]]
2.2.2 文本特征提取
-
作用:对文本数据进行特征值化
from sklearn.feature_extraction.text import CountVectorizer fit_transform(X) #X为文本或者包含文本字符串的可迭代对象,返回sparse矩阵 inverse_transform(X) #X为sparse矩阵或者array数组,返回值为转换之前的数据格式 toarray() #将sparse矩阵转化为数组
-
示例代码
from sklearn.feature_extraction.text import CountVectorizer vector=CountVectorizer() res=vector.fit_transform(['lift is is short,I love python','lift is too long,I hate python']) print(res)#sparse矩阵 # (0, 2) 1 # (0, 1) 2 # (0, 6) 1 # (0, 4) 1 # (0, 5) 1 # (1, 2) 1 # (1, 1) 1 # (1, 5) 1 # (1, 7) 1 # (1, 3) 1 # (1, 0) 1 print(vector.get_feature_names()) #['hate', 'is', 'lift', 'long', 'love', 'python', 'short', 'too'] print(res.toarray())#将sparse矩阵转换成数组 # [[0 2 1 0 1 1 1 0] # [1 1 1 1 0 1 0 1]] #注意:单字母不统计(因为单个字母代表不了实际含义),然后每个数字表示的是单词出现的次数
-
-
中文文本特征提取【对有标点符号的中文文本进行特征提取】
from sklearn.feature_extraction.text import CountVectorizer vector=CountVectorizer() res=vector.fit_transform(['人生苦短 我用python','人生满长,不用python']) print(res) # (0, 2) 1 # (0, 3) 1 # (1, 1) 1 # (1, 0) 1 print(vector.get_feature_names()) ['不用python', '人生满长', '人生苦短', '我用python'] print(res.toarray()) # [[0 0 1 1] # [1 1 0 0]]
-
中文文本特征提取【对有标点符合且有空格分隔的中文文本进行特征提取】【注意:单个汉字不统计】
from sklearn.feature_extraction.text import CountVectorizer vector=CountVectorizer() res=vector.fit_transform(['人生 苦短, 我 用python','人生 漫长, 不用 python']) print(res) # (0, 2) 1 # (0, 5) 1 # (0, 4) 1 # (1, 2) 1 # (1, 3) 1 # (1, 1) 1 # (1, 0) 1 print(vector.get_feature_names()) # ['python', '不用', '人生', '漫长', '用python', '苦短'] print(res.toarray()) # [[0 0 1 0 1 1] # [1 1 1 1 0 0]]
-
目前
CountVectorizer
只可以对有标点符号和用分隔符对应的文本进行特征提取,满足不了需求【在自然语言处理中,我们是需要将一段中文文本中相关的词语,成语,形容词…都要进行提取的】
2.2.3jieba分词
-
对中文文章进行分词处理
-
使用
#基本使用:对文章进行分词 import jieba jb = jieba.cut('我是一个好人') content = list(jb) ct = ' '.join(content) print(ct) #返回空格区分的词语
import jieba from sklearn.feature_extraction.text import CountVectorizer jb1=jieba.cut('人生苦短,我用python,你觉得我说的对吗?') ct1=" ".join(list(jb1)) print(ct1) # 人生 苦短 , 我用 python , 你 觉得 我 说 的 对 吗 ? jb2=jieba.cut('人生满长,不用python,你说我说的对不对?') ct2=" ".join(list(jb2)) print(ct2) # 人生 满长 , 不用 python , 你 说 我 说 的 对 不 对 ? vector=CountVectorizer() res=vector.fit_transform([ct1,ct2]) print(res) # (0, 2) 1 # (0, 5) 1 # (0, 3) 1 # (0, 0) 1 # (0, 6) 1 # (1, 2) 1 # (1, 0) 1 # (1, 4) 1 # (1, 1) 1 print(vector.get_feature_names()) # ['python', '不用', '人生', '我用', '满长', '苦短', '觉得'] print(res.toarray()) # [[1 0 1 1 0 1 1] # [1 1 1 0 1 0 0]]
2.3onhot编码
-
sparse矩阵中的0和1就是
onehot
编码
-
为什么需要
onehot
编码-
特征抽取主要目的就是对非数值型的数据进行特征值化!如果现在需要对下图中的human和alien进行手动特征值化Alien为4,human为1。则1和4有没有优先级或者权重大小之分呢?
-
基于
pandas
实现onehot
编码【pd.get_dummies(df['col']
】import pandas as pd df=pd.DataFrame([ ['green','M',20,'class1'], ['red','L',21,"class2"], ['blue','XL',30,'class3'] ]) df.columns=['color','size','weight','class label'] #将color这一列变成one-hot编码 pd.get_dummies(df['color']) # blue green red # 0 0 1 0 # 1 0 0 1 # 2 1 0 0
-