特征工程
1.定义
1.1为什么需要特征工程
- 样本数据中的特征有可能会存在缺失值,重复值,异常值等,需要对特征中的相关的噪点数据进行处理
- 处理目的:有一个更纯净的样本集,让模型基于这组数据可以有更好的预测能力…
1.2什么是特征工程
- 特征工程是将原始数据转换为更好的代表预测模型的潜在问题的特征过程,从而提高对未知数据预测的准确性
- 比如:AlphaGo学习的数据中既有棋谱,又有食谱和歌词,一些干扰数据绝对会影响AlphaGo的学习
1.3特征工程的意义
1.4实现特征工程
- 工具:
sklearn sklearn 介绍
- 是python语言中的机器学习工具,包含了很多知名的机器学习算法的实现,其文档完善,容易上手
- 功能
2.特征提取
2.1目的
-
采集到的样本中的特征数据往往很多时候为字符串或者其他类型的数据,电脑只可以识别二进制数值型的数据,如果把字符串给电脑,电脑不能识别【如果不是数值型数据,识别不了】 -
效果演示【将字符串转换为数字】 from sklearn.feature_extraction.text import CountVectorizer
vector=CountVectorizer()
res=vector.fit_transform(['lift is short,I love python','lift is too long,I hate python'])
print(res.toarray())
-
结论
- 特征抽取对文本等数据进行特征值化【将数据转为数值型数据】,特征值化是为了让机器更好的理解数据
2.2特征提取的方式
2.2.1字典特征提取
from sklearn.feature_extraction import DictVectorizer
fit_transform(X)
inverse_transform(X)
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)
print(feature)
print(d.get_feature_names())
print(feature.toarray())
-
补充,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())
print(feature)
2.2.2 文本特征提取
-
作用:对文本数据进行特征值化 from sklearn.feature_extraction.text import CountVectorizer
fit_transform(X)
inverse_transform(X)
toarray()
-
示例代码 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)
print(vector.get_feature_names())
print(res.toarray())
-
中文文本特征提取【对有标点符号的中文文本进行特征提取】 from sklearn.feature_extraction.text import CountVectorizer
vector=CountVectorizer()
res=vector.fit_transform(['人生苦短 我用python','人生满长,不用python'])
print(res)
print(vector.get_feature_names())
['不用python', '人生满长', '人生苦短', '我用python']
print(res.toarray())
-
中文文本特征提取【对有标点符合且有空格分隔的中文文本进行特征提取】【注意:单个汉字不统计】 from sklearn.feature_extraction.text import CountVectorizer
vector=CountVectorizer()
res=vector.fit_transform(['人生 苦短, 我 用python','人生 漫长, 不用 python'])
print(res)
print(vector.get_feature_names())
print(res.toarray())
-
目前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)
jb2=jieba.cut('人生满长,不用python,你说我说的对不对?')
ct2=" ".join(list(jb2))
print(ct2)
vector=CountVectorizer()
res=vector.fit_transform([ct1,ct2])
print(res)
print(vector.get_feature_names())
print(res.toarray())
2.3onhot编码
-
sparse矩阵中的0和1就是onehot 编码 -
为什么需要onehot 编码
-
特征抽取主要目的就是对非数值型的数据进行特征值化!如果现在需要对下图中的human和alien进行手动特征值化Alien为4,human为1。则1和4有没有优先级或者权重大小之分呢? -
就需要用onehot 编码 -
基于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']
pd.get_dummies(df['color'])
3.特征值的预处理
- 如果认为每一个特征具有同等大小的权重都同等重要,则必须要对其进行归一化处理
- 可以使用KNN算法对特征影响进行说明。
3.1归一化实现
from sklearn.preprocessing import MinMaxScaler
参数:feature_range表示缩放范围,通常使用(0,1)
作用:使得某一个特征对最终结果不会造成很大的影响
from sklearn.preprocessing import MinMaxScaler
mm=MinMaxScaler(feature_range=(0,1))
data=[[90,2,10,40],[60,5,15,45],[73,3,13,45]]
data=mm.fit_transform(data)
print(data)
3.2标准化处理
3.3 归一化和标准化总结
- 归一化,如果出现了异常值则会影响特征的最大值最小值,那么最终结果会受到比较大影响
- 标准化,如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而标准差改变比较少
3.4StandardScaler 和MinMaxSclaer 选哪个?
- 大多数机器学习算法中,会选择
StandardSclaer 来进行特征缩放,因为MinMaxSclaer 对异常值非常敏感。在CPA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardSclaer 往往是最好的选择。 MinMaxScaler 在不涉及距离度量,梯度,协方差计算以及数据需要被压缩到特定区间时,使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler 将数据压缩于[0,1]区间之中- 建议先用
StandardScaler ,效果不好换MinMaxScaler
4.特征选择
4.1定义
4.2特征选择的原因
- 冗余:部分特征的相关度高,容易消耗计算机的性能【数据相似度高】【例如:房价预测数据中有楼层和高度,这两个特征相关度高】
- 噪点:部分特征对预测结果有偏执影响【预测无关的数据】【例如:房价预测,数据中有购买房子的人的身高,跟预测无关的数据】
4.3特征选择的实现
4.4特征选择工具
4.4.1Filter过滤式(方差过滤):
-
原理:这是通过特征本身的方差来筛选特征的类,比如:一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有作用,所以无论接下来特征工程要做什么,都要优先消除方差为0或方差较低的特征
-
API from sklearn.feature_selection import VarianceThreshold
VarianceThreshold(threshold=x)
fit_transform(X)
-
示例 from sklearn.feature_selection import VarianceThreshold
v=VarianceThreshold(threshold=1)
v.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]])
-
如果将方差为0或方差极低的特征取出后,剩余特征还有很多且模型的效果没有显著提升,则可以用方差将特征选择【一步到位】。留下一半的特征,那可以设定一个让特征总数减半的方差阈值,即找到特征方差的中位数,将中位数作为参数threshold的值即可 from sklearn.feature_selection import VarianceThreshold
v=VarianceThreshold(threshold=np.median(X.var().values))
v.fit_transform(X)
-
方差过滤对模型的影响
-
例如:KNN在方差过滤前和方差过滤后运行的效果和运行时间的对比。KNN是K近邻算法中的分类算法,其原理非常简单,是利用每个样本到其他样本点的距离来判断每个样本点的相似度,然后对样本进行分类。KNN必须遍历每个特征和每个样本,因而特征越多,KNN的计算也就会越缓慢,以下是代码运行时间对比。 -
方差过滤前 -
方差过滤后 -
可以看出,对于KNN,过滤后的效果十分明显:准确率稍有提升,但平均运行时间减少了10分钟,特征选择过后算 法的效率上升了1/3. -
注意:方差过滤主要服务对象是:需要遍历特征的算法模型,而过滤的主要目的是在维持算法表现的前提下,帮助算法降低计算成本
4.4.2PCA降维(主成分分析)
-
定义
- PCA降维(主成分分析):是一种分析,简化数据集的技术
-
降维的维度值就是特征的种类 -
思想:如何跟好的对一个立体的物体用二维表示 -
当然,第四张二维图片可以比较好的标识一个立体三维的水壶。但是也要清楚,用一个低纬度去表示高纬度的物体时,一定会造成一些信息的差异。可以让低纬度也可以能正确的表示高纬度的事物,或者信息差异最小。 -
目的:特征数量达到上百,上千的时候,考虑数据的优化。使数据维度压缩,尽可能降低源数据的维度(复杂度),损失少量信息。 -
作用:可以削减回归分析或者聚类分析中特征的数量 -
PCA大致原理 -
红色为原始的样本特征,为二维的特征,如果降为一维,则可以将5个红色的原始特征,映射到一维的线段上就变成了4个特征。 -
PCA语法 from sklearn.decomposition import PCA
pca=PCA(n_components=None)
pca.fit_transform(X)
-
示例 from sklearn.decomposition import PCA
pca=PCA(n_components=2)
pca.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]])
|