Travel Tips
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
第 3 章 11 条数据化运营不得不知道的数据预处理经验三
数据降维就是降低数据的维度数量,数据降维是维数归约的一个重要课题。
1 需要数据降维的情况
数据降维可以降低模型的计算量并减少模型运行时间、降低噪音变量信息对于模型结果的影响、便于通过可视化方式展示归约后的维度信息并减少数据存储空间。因此,大多数情况下,当我们面临高维数据时,都需要对数据做降维处理。是否进行降维主要考虑以下方面:
1 ) 维度数量 。降维的基本前提是高维,假如模型只有几个维度,那就不一定需要降维,具体取决于维度本身的重要性、共线性以及其他排除关系,而不是出于高维的考虑。
2 ) 建模输出是否必须保留原始维度 。某些场景下,我们需要完整保留参与建模的原始维度并在最终建模输出时能够得以分析、解释和应用,这种情况下不能进行转换方式降维,只能选择特征筛选的方式降维。
3 ) 对模型的计算效率与建模时效性有要求 。当面临高维数据建模时,数据模型的消耗将呈几何倍数增长,这种增长带来的结果便是运算效率慢、耗时长。如果对建模时间和时效性有要求,那么降维几乎是必要步骤。
4 ) 是否要保留完整数据特征 。数据降维的基本出发点是在尽量(或最大化)保留原始数据特征的前提下,降低参与建模的维度数。在降维过程中,无论未被表示出来的特征是噪音还是正常分布,这部分信息都无法参与建模。如果某些场景下需要所有数据集的完整特征,那么通常不选择降维。
注意:
数据降维只是处理高维数据的思路和方法之一,除此之外,国内外学者也在研究其他高维数据建模的方法。以高维数据聚类为例,除了可以通过降维来应对之外,其他思路还包括基于超图的聚类、基于子空间的聚类、联合聚类等,这些都是非降维的方法。
2 基于特征选择的降维
基于特征选择的降维方法有 4 种思路:
· 经验法:根据业务专家或数据专家的以往经验、实际数据情况、业务理解程度等进行综合考虑。业务经验依靠的是业务背景,从众多维度特征中选择对结果影响较大的特征;而数据专家则依靠的是数据工作经验,基于数据的基本特征以及对后期数据处理和建模的影响来选择或排除维度,例如去掉缺失值较多的特征。
· 测算法:通过不断测试多种维度选择参与计算,通过结果来反复验证和调整并最终找到最佳特征方案。
· 基于统计分析的方法:通过相关性分析不同维度间的线性相关性,在相关性高的维度中进行人工去除或筛选;或者通过计算不同维度间的互信息量,找到具有较高互信息量的特征集,然后把其中的一个特征去除或留下。
· 机器学习算法:通过机器学习算法得到不同特征的特征值或权重,然后再根据权重来选择较大的特征。图 3-2 所示是通过 CART 决策树模型得到不同变量的重要程度,然后根据实际权重值进行选择。
基于维度转换的降维是按照一定的数学变换方法,把给定的一组相关变量(维度)通过数学模型将高维空间的数据点映射到低维度空间中,然后利用映射后变量的特征来表示原有变量的总体特征。这种方式是一种产生新维度的过程,转换后的维度并非原有维度的本体,而是其综合多个维度转换或映射后的表达式。例如,假设原始数据集中有 10 个维度,分别是 tenure 、cardmon 、lncardmon 、cardten 、lncardten 、wiremon 、lnwiremon 、wireten 、lnwireten 、hourstv ,现在用主成分分析进行降维,降维后选择具有显著性的前 3个主成分作为示例:
方程式用于 主成分 -1
0.006831 * tenure +
0.007453 * cardmon +
0.1861 * lncardmon +
0.0001897 * cardten +
0.1338 * lncardten +
+ -4.767
方程式用于 主成分 -2
-0.4433 * lnwiremon +
-0.0001222 * wireten +
-0.1354 * lnwireten +
0.008099 * hourstv +
+ -0.272
方程式用于 主成分 -3
-0.01809 * tenure +
0.0124 * cardmon +
0.00002565 * wireten +
-0.1644 * lnwireten +
0.03984 * hourstv +
+ -4.076
上述转换结果就是主成分分析后提取的 3个能基本代表原始 10 个维度的新 “维度 ”。通过上述结果发现主成分(也就是新的 “维度 ”)是一个多元一次方程,其含义无法直接体现和理解。但对于不关注每个维度业
务含义的系统级应用和集成来讲是没有关系的,因为后续算法不需要知道每个变量的具体业务含义。为了更形象地解释映射关系,现在使用一个序列图来表示整个映射过程。图 3-3 所示为原始数据集在经过顺时针旋转(映射变换)后的可视化特征变化过程。从图 3-3 中所示①到⑧的序列中可以看出,原始数据的分布呈现明显的曲线分布特征,而旋转后的数据样本则呈现直线分布特征。
通过数据维度变换进行降维是非常重要的降维方法,这种降维方法分为线性降维和非线性降维两种,其中常用的代表算法包括独立成分分析( ICA )、主成分分析( PCA )、因子分析( Factor Analysis ,FA )、线性判别分析( LDA ,又称 Fisher 线性判别 FLD )、局部线性嵌入( LLE )、核主成分分析( Kernel PCA )等。
·非监督式的数据集 。它是一种非监督式的降维方法,因此适用于不带有标签的数据集;而对于带有标签的数据集则可以采用 LDA 。
·根据方差自主控制特征数量 。最大的主成分的数量会小于或等于特征的数量,这意味着, PCA 也可以输出完全相同数量的特征,具体取决于选择特征中解释的方差比例。
·更少的正则化处理 。选择较多的主成分将导致较少的平滑,因为我们将能够保留更多的数据特征,从而减少正则化。
·数据量较大的数据集 。数据量大包括数据记录多和数据维度多两种情况, PCA 对大型数据集的处理效率较高。
·数据分布是位于相同平面上(非曲面),数据中存在线性结构 。在数据挖掘或机器学习中,经常会把数据分为训练集和测试集,也有可能包括应用集,多份数据需要单独降维还是把数据集合起来进行整体降维?对于线性方法(例如 PCA )而言,它旨在寻找一个高维空间到低维空间的映射矩阵或映射关系,当映射矩阵找到后便可直接将其应用到其他数据集进行降维(通俗点理解就是直接套用矩阵公式得到降维结果),因此,这种降维方式下可以单独降维;而非线性方法(例如LLE )则需要在保持某种局部结构的条件下实现数据的整体降维,此时需要所有的数据集合到一起然后才能实现数据降维。
本示例中,将分别使用 sklearn 的DecisionTreeClassifier 来判断变量重要性并选择变量,通过 PCA 进行维度转换。完整代码如下:
import numpy as np from sklearn.tree import DecisionTreeClassifier from sklearn.decomposition import PCA # 读取数据文件 data = np.loadtxt('data1.txt') # 读取文本数据文件 x = data[:, :-1] # 获得输入的 x y = data[:, -1] # 获得目标变量 y print (x[0], y[0]) # 打印输出 x和y的第一条记录
# 使用 sklearn 的DecisionTreeClassifier 判断变量重要性 model_tree = DecisionTreeClassifier(random_state=0) # 建立分类决策树模型对象 model_tree.fit(x, y) # 将数据集的维度和目标变量输入模型 feature_importance = model_tree.feature_importances_ # 获得所有变量的重要性得分 print (feature_importance) # 打印输出
从变量重要性得分看出,第 4/5/7 三个变量的重要性最高,分别约为0.12 、0.48 、0.17 ,三者得分之和约等于 77% ,这意味着仅仅这 3个变量已经具有非常显著的并且足以代表所有变量参与模型计算的能力。因此,可以选择这 3个变量参与后续模型计算。
# 使用 sklearn 的PCA 进行维度转换 model_pca = PCA() # 建立 PCA 模型对象 model_pca.fit(x) # 将数据集输入模型 model_pca.transform(x) # 对数据集进行转换映射 components = model_pca.components_ # 获得转换后的所有主成分 components_var = model_pca.explained_variance_ # 获得各主成分的方差 components_var_ratio = model_pca.explained_variance_ratio_ # 获得各主成分的方差占比 print (components[:2]) # 打印输出前 2个主成分
print (components_var[:2]) # 打印输出前 2个主成分的方差
print (components_var_ratio) # 打印输出所有主成分的方差占比
在得到 PCA 训练模型后,通过模型的components_ 、explained_variance_ 、explained_variance_ratio_ 属性分别获取转换后的所有主成分、各主成分的方差和各主成分的方差占比。上述结果中,所有主成分的方差占比是选择主成分数量的关键,因为PCA 降维的基本思想是根据方差占比来选择主成分的数量。通过该结果可以看出,前 6项主成分的方差占比之和components_var_ratio[:5].sum ()约等于 77% ,取前 6项主成分基本可以作为转换后的主成分参与后续模型计算。在建立 PCA 模型时,可通过 n_components 指定要获得的主成分数量,但通常不建议采用这种方式,原因是无法根据各主成分的方差占比判断到底指定多少个主成分最合适。当然,如果对于主成分或转换后变量的数量有强烈约束,那么直接指定 components 的方法是行之有效的。
上述过程中,需要考虑的关键点是:
·如何根据变量重要性得分选择原始变量;
·如何通过方差占比选择合适的主成分。
本示例中,主要用了几个知识点:
·通过 Numpy 的loadtxt 读取数据文件;
·对Numpy 矩阵进行切片;
·通过 Sklearn 的DecisionTreeClassifier 建立决策树模型,并获得变量重要性属性;
·通过使用 sklearn 的PCA 建立 PCA 模型,并对数据集进行维度转换降维,并从 PCA 模型中获得有关主成分、方差和方差占比属性。
Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor
December 4, 2020 at 3:12 pm
Sed ac lorem felis. Ut in odio lorem. Quisque magna dui, maximus ut commodo sed, vestibulum ac nibh. Aenean a tortor in sem tempus auctor
December 4, 2020 at 3:12 pm
Donec in ullamcorper quam. Aenean vel nibh eu magna gravida fermentum. Praesent eget nisi pulvinar, sollicitudin eros vitae, tristique odio.
December 4, 2020 at 3:12 pm
我是 s enim interduante quis metus. Duis porta ornare nulla ut bibendum
Rosie
6 minutes ago