赞
踩
文末有赠书福利!!!
数据归约是在保证数据信息量的基础上,尽可能精简数据量。筛选和降维是数据归约的重要手段,尤其在数据量大且维度高的情况下,可以有效地节约存储空间和计算时间。反之,当数据量不多,或者现有存储和计算资源能满足分析和预测时不一定需要降维,因为任何的归约都会造成数据损失。
除了减少数据量,特征筛选的另一个好处是去掉干扰特征,有时候加入了新特征后,在训练集上的准确率提高了,而在测试集上的准确率却降低了,这种情况在小数据集中最为常见,主要由于无效特征的干扰使模型对训练集过拟合,反而使模型效果变差。可见,特征并不是越多越好。总之,降维不是数据预处理的必经过程,是否降维主要取决于数据量,以及降维后对预测效果的影响。本文章主要介绍数据归约的四种途径。
经验筛选特征
根据经验筛选特征是利用行业专家的经验筛选有效特征,去掉无关特征,或者在更早期数据采集阶段在特征重要性和广度之间取舍。
有一次笔者在处理医疗检验结果时,获取了五种检验单,共七十多个指标,而进一步的数据分析需要人工整理历史数据,指标太多使工作量倍增。于是通过前期提取数据训练GBDT模型,选取了模型输出的特征贡献度最高的前20个特征,再代入模型训练,但训练后效果变差很多。之后与医生讨论该问题时,医生从中筛选了不到10个重要特征,训练之后,效果只略有下降,最终使用了医生的经验特征方案。
在特征较多的情况下,很多时候无效特征或者相关特征干扰了模型,如果使用一些专家经验,能节约大量的算力和时间成本,特征选择是人类经验和算法结合的重点之一。
该方法的效果主要取决于开发人员和专业人士对业务的理解程度。
统计学方法筛选特征
利用统计学方法筛选特征包括:去除缺失数据较多的特征,去除取值无差异的特征,以及通过数据分析,保留与目标变量相关性强的连续特征,有统计显著性的分类特征。
筛选特征时使用最多的统计方法是假设检验,其核心思想是对比每个自变量x的不同取值时因变量y的差异。对于自变量和因变量同为连继性特征的情况,一般分析其是否为线性相关,即具有同增同减的性质,该方法也用于去掉相关性强的自变量,若两个自变量功能相似,则去掉其中一个。
对于自变量或者因变量是离散值的情况,可用离散值分类,统计每一类别的数据是否具有统计性差异,例如:当自变量为性别、因变量为身高时,可对比男性身高与女性身高的差异,对比其均值是最简单的方法,还需要考虑不同类别实例个数的差异,以及不同类别的分布差异,是否为高斯分布,方差等等,具体方法将在第七章数据分析中详细介绍。
统计分析可通过Python三方库提供的方法实现,比较简单快捷,可以一次性处理多个特征。但也有一些问题,例如在相关性分析中不能识别非线性相关,有可能去掉有意义的特征。
模型筛选特征
大多数模型在训练之后都会反馈特征优先级feature_importance,可以通过保留其重要性最高的前N个特征,去掉其它特征的方法进行数据筛选,但由于算法不同,模型计算出的特征重要性也不尽相同,筛选之后需要再代入模型,在保证去掉的特征不影响预测效果的提下做筛选。当数据量较大时,可以先选择一部分数据代入模型,进行特征选择。
另一种利用模型筛选特征的方法是随机选取特征或者随机去除特征,不断尝试,以近乎穷举的方式做特征筛选,该方法一般用于小数据集,且算力足够的情况下。
本例使用了Sklearn自带的鸢尾花数据集,代入决策树模型,训练数据之后,通过模型中的feature_importance_查看各个特征对应权重。
- 01 from sklearn.datasetsimport load_iris
- 02 from sklearn import tree
- 03
- 04 iris = load_iris()
- 05 clf =tree.DecisionTreeClassifier()
- 06 clf = clf.fit(iris.data,iris.target)
- 07 print(clf.feature_importances_)
- 08
- 09 # 运行结果
- 10 # [0.02666667 0. 0.05072262 0.92261071]
从运行结果可以看出,第四维特征重要性最高,第二维特征对预测因变量iris.target的重要性为0。
数学方法降维
使用PCA和SVD等数学方法也是降维的常用手段,它的主要思想是将相关性强的多个特征合成一个特征,在损失信息较少的情况下,有效减少了维度,主要用于降低数据量。使用该方法的问题在于,转换后的特征与原特征意义不同,损失了原特征的业务含义。
本例中使用Sklearn自带的PCA工具实现PCA降维,数据为Sklearn自带的鸢尾花数据集,利用Matplotlib和Seaborn工具绘图。
- 01 fromsklearn.decomposition import PCA
- 02 from sklearn importdatasets
- 03 import pandas as pd
- 04 import numpy as np
- 05 import matplotlib.pyplotas plt
- 06 import seaborn as sns
- 07 %matplotlib inline # 仅在 jupyter notebook 中使用
鸢尾花数据集包含四维自变量,使用DataFrame的corr函数生成特征间的皮尔森相关系数矩阵,然后使用Seaborn对该矩阵做热力图。
- 01 iris =datasets.load_iris()
- 02 data =pd.DataFrame(iris.data, columns=['SpealLen', 'SpealWid',
- 03 'PetalLen','PetalWid'])
- 04 mat = data.corr()
- 05 sns.heatmap(mat,annot=True, vmax=1, vmin=-1, xticklabels= True,
- 06 yticklabels= True, square=True,cmap="gray")
热力图结果如图1所示。
图1 鸢尾花特征相关系数热力图
相关系数取值范围在[-1,1]之间,趋近于1为正相关,趋近-1为负相关,趋近零为非线性相关,可以看出其中除了Speal Width以外,其它三个特征均呈现较强的正相关,因此,将四维变量降成二维。
- 01 pca = PCA(n_components=2)
- 02 data1 =pca.fit_transform(data)
- 03 print(data1.shape)
- 04 print(pca.explained_variance_ratio_,
- 05 pca.explained_variance_ratio_.sum())
- 06 plt.scatter(data1[:,0],data1[:,1], c = np.array(iris.target),
- 07 cmap=plt.cm.copper)
通过PCA方法降维后,从data1.shape可以看到原来150记录,4特征数据转换成为150记录,2特征,explained_variance_ratio_显示降维后各维成份的方差值占总方差值的比例,该占比越大,该成份越重要,explained_variance_ratio_.sum累加了降维后所有成份之和,它越趋近1,说明降维带来的数据损失越小。用两维数据作图,颜色标出其分类,可以看到降维后的数据对因变量iris.target成功分类,如图2所示。
图2 降维后的两维数据对因变量分类
当数据维度很多,不能确定降成多少维度合适时,可将n_components的值设置为0-1之间,程序将自动选择维度,使得降维后各成份的explained_variance_ratio_之和不低于该比例。将n_component设置为1以上的值,则是设定转换后的维度。
本文选自电子工业出版社出版的《python大数据与机器学习》一书,略有改动。经出版社授权刊登于此。
赠书福利
点亮在看按钮!
1.在留言区留言,说出关于“机器学习”的相关话题(30字以上),选择走心的留言送给幸运读者~
2.抽4名粉丝可以各获得一本书哦~
3.活动时间结束我会第一时间联系中奖用户,书是出版社大大统一寄出,包邮!包邮!包邮!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。