数据预处理:数据降维

目录

数据降维的应用场景

基于特征选择的降维

基于维度转换的降维

参考资料:

1.《Python数据分析与数据化运营》宋天龙

2.主成分分析(PCA)原理详解 - 知乎

3.机器学习中SVD总结

数据降维的应用场景

数据降维可以降低模型的计算量并减少模型运行时间、降低噪音对于模型结果的影响、便于通过可视化方式展示归约后的维度信息并减少数据存储空间。因此,大多数情况下,当我们面临高维数据时,都需要对数据做降维处理。是否进行降维主要考虑以下方面:

  • 维度数量。高维的数据大部分情况下是需要降维的,同时需要考虑维度本身的重要性、共线性以及其他排除关系。
  • 建模输出是否必须保留原始维度。某些场景下,我们需要完整保留参与建模的原始维度并在最终建模输出时能够得以分析、解释和应用,这种情况下不能选择基于维度转换的降维,只能选择基于特征选择的降维。
  • 是否要保留完整数据特征。数据降维的基本出发点是在最大化保留原始数据特征的前提下,降低参与建模的维度。在降维过程中,无论未被表示出来的特征是噪音还是正常分布,这部分信息都无法参与建模过程。如果某些场景下需要所有数据集的完整特征,那么通常不选择降维。
  • 对模型的计算效率与建模时效性要求。当面临高维数据建模时,数据模型消耗的资源将呈几何倍数增长,这种增长带来的结果便是运算效率慢、耗时长。如果对建模时间和时效性有要求,那么降维几乎是必要步骤。

数据降维只是处理高维数据的思路之一,除此之外还有其他高维数据建模的方法。以高维数据聚类为例,除了降维方法外,其他方法还包括:基于超图的聚类、基于子空间的聚类、联合聚类等。

基于特征选择的降维

基于特征选择的降维是根据一定规则和经验,直接选取原有维度的一部分参与到后续的计算和建模过程。整个过程不产生新的维度。

这种降维方法的好处是,既能满足后续数据处理和建模需求,又能保留维度原本的业务含义,以便于业务理解和应用。

基于特征选择的降维方法有4种:

  • 经验法:通过业务专家、数据专家的以往经验、实际数据情况、业务理解程度等综合考虑选择。从众多维度特征中选择对结果影响较大的特征,或从对后期数据处理和建模的影响来选择维度。
  • 测算法:通过不断测试多种维度选择参与计算,通过结果来反复验证和调整并最终找到最佳特征方案。
  • 基于统计分析的方法:通过计算不同维度间的相关性分析,找到具有较高线性相关性的维度,然后筛选;或者通过计算不同维度间的互信息量,找到具有较高互信息量的维度,然后筛选。
  • 机器学习算法:通过机器学习算法得到不同特征的重要程度,然后再根据权重来选择较大的特征。

基于维度转换的降维

基于维度转换的降维是按照一定的数学变换方法,把给定的一组相关变量通过数学模型将高维空间的数据点映射到低维度空间中,然后利用映射后变量的特征来表示原有变量的总体特征。整个过程会产生新的维度。

维度变换是非常重要的降维方法,这种降维方法分为线性降维和非线性降维两种,其中常用的代表算法包括独立成分分析(ICA)、主成分分析(PCA)、因子分析(Factor Analysis,FA)、线性判别分析(LDA)、局部线性嵌入(LLE)、核主成分分析(Kernel PCA)等。

Q:在机器学习中,经常会把数据分为训练集和测试集,也有可能包括应用集,多份数据需要单独降维还是整体降维?

A:对于线性方法(例如PCA)而言,它旨在寻找一个高维空间到低维空间的映射矩阵,当映射矩阵找到后便可直接将其应用到其他数据集进行降维,因此这种降维方式下可以单独降维;而非线性方法(例如LLE)则需要在保持某种局部结构的条件下实现数据的整体降维,因此这种降维方式下需要整体降维。

以下介绍PCA主要适用的场景:

  • 非监督式的降维方法,适用于不带有标签的数据集。而对于带有标签的数据集则可以采用LDA。
  • 根据方差自主控制特征数量。最大的主成分的数量会小于等于原始特征的数量。
  • 更少的正则化处理。选择较多的主成分将导致较少的平滑,因为我们将能够保留更多的数据特征,从而减少正则化。
  • 数据量较大的数据集。PCA对大型数据集的处理效率较高。
  • 数据分布是位于相同平面上,数据中存在线性结构。

代码如下:

# 导入库
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.decomposition import PCA

# 读取数据文件
data = np.loadtxt('data1.txt')  
x = data[:, :-1]  
y = data[:, -1]  
print(x[0], y[0])  

# 使用sklearn的DecisionTreeClassifier判断变量重要性
# 变量重要性的总得分为1,值越大重要性越高。一般情况下,如果选择的变量重要性总得分接近80%,基本上已经解释大部分的特征变化了。
model_tree = DecisionTreeClassifier(random_state=0)  # 建立分类决策树模型对象
model_tree.fit(x, y)                                 # 将数据集的维度和目标变量输入模型
print(model_tree.feature_importances_)               # 获得所有变量的重要性得分

# 使用sklearn的PCA进行维度转换
# 各主成分方差越大重要性越高。一般情况下,如果选择的主成分方差占比接近80%,基本上已经解释大部分的特征变化了。
model_pca = PCA()                   # 建立PCA模型对象
model_pca.fit(x)                    # 将数据集输入模型,仅输入x进行PCA训练
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])  
print(components_var[:2])  
print(components_var_ratio) 
  • 1
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值