一文详解数据归约的四种途径

  • Post author:
  • Post category:其他



文末有赠书福利!!!

数据归约是在保证数据信息量的基础上,尽可能精简数据量。筛选和降维是数据归约的重要手段,尤其在数据量大且维度高的情况下,可以有效地节约存储空间和计算时间。反之,当数据量不多,或者现有存储和计算资源能满足分析和预测时不一定需要降维,因为任何的归约都会造成数据损失。

除了减少数据量,特征筛选的另一个好处是去掉干扰特征,有时候加入了新特征后,在训练集上的准确率提高了,而在测试集上的准确率却降低了,这种情况在小数据集中最为常见,主要由于无效特征的干扰使模型对训练集过拟合,反而使模型效果变差。可见,特征并不是越多越好。总之,降维不是数据预处理的必经过程,是否降维主要取决于数据量,以及降维后对预测效果的影响。本文章主要介绍数据归约的四种途径。

经验筛选特征

根据经验筛选特征是利用行业专家的经验筛选有效特征,去掉无关特征,或者在更早期数据采集阶段在特征重要性和广度之间取舍。

有一次笔者在处理医疗检验结果时,获取了五种检验单,共七十多个指标,而进一步的数据分析需要人工整理历史数据,指标太多使工作量倍增。于是通过前期提取数据训练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.活动时间结束我会第一时间联系中奖用户,书是出版社大大统一寄出,包邮!包邮!包邮!