前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文详解数据归约的四种途径

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

作者头像
石晓文
发布2020-05-26 14:56:01
2K0
发布2020-05-26 14:56:01
举报
文章被收录于专栏:小小挖掘机小小挖掘机

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

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

经验筛选特征

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

有一次笔者在处理医疗检验结果时,获取了五种检验单,共七十多个指标,而进一步的数据分析需要人工整理历史数据,指标太多使工作量倍增。于是通过前期提取数据训练GBDT模型,选取了模型输出的特征贡献度最高的前20个特征,再代入模型训练,但训练后效果变差很多。之后与医生讨论该问题时,医生从中筛选了不到10个重要特征,训练之后,效果只略有下降,最终使用了医生的经验特征方案。

在特征较多的情况下,很多时候无效特征或者相关特征干扰了模型,如果使用一些专家经验,能节约大量的算力和时间成本,特征选择是人类经验和算法结合的重点之一。

该方法的效果主要取决于开发人员和专业人士对业务的理解程度。

统计学方法筛选特征

利用统计学方法筛选特征包括:去除缺失数据较多的特征,去除取值无差异的特征,以及通过数据分析,保留与目标变量相关性强的连续特征,有统计显著性的分类特征。

筛选特征时使用最多的统计方法是假设检验,其核心思想是对比每个自变量x的不同取值时因变量y的差异。对于自变量和因变量同为连继性特征的情况,一般分析其是否为线性相关,即具有同增同减的性质,该方法也用于去掉相关性强的自变量,若两个自变量功能相似,则去掉其中一个。

对于自变量或者因变量是离散值的情况,可用离散值分类,统计每一类别的数据是否具有统计性差异,例如:当自变量为性别、因变量为身高时,可对比男性身高与女性身高的差异,对比其均值是最简单的方法,还需要考虑不同类别实例个数的差异,以及不同类别的分布差异,是否为高斯分布,方差等等,具体方法将在第七章数据分析中详细介绍。

统计分析可通过Python三方库提供的方法实现,比较简单快捷,可以一次性处理多个特征。但也有一些问题,例如在相关性分析中不能识别非线性相关,有可能去掉有意义的特征。

模型筛选特征

大多数模型在训练之后都会反馈特征优先级feature_importance,可以通过保留其重要性最高的前N个特征,去掉其它特征的方法进行数据筛选,但由于算法不同,模型计算出的特征重要性也不尽相同,筛选之后需要再代入模型,在保证去掉的特征不影响预测效果的提下做筛选。当数据量较大时,可以先选择一部分数据代入模型,进行特征选择。

另一种利用模型筛选特征的方法是随机选取特征或者随机去除特征,不断尝试,以近乎穷举的方式做特征筛选,该方法一般用于小数据集,且算力足够的情况下。

本例使用了Sklearn自带的鸢尾花数据集,代入决策树模型,训练数据之后,通过模型中的feature_importance_查看各个特征对应权重。

代码语言:javascript
复制
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工具绘图。

代码语言:javascript
复制
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对该矩阵做热力图。

代码语言:javascript
复制
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以外,其它三个特征均呈现较强的正相关,因此,将四维变量降成二维。

代码语言:javascript
复制
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大数据与机器学习》一书,略有改动。经出版社授权刊登于此。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小小挖掘机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档