Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >常见的降维技术比较:能否在不丢失信息的情况下降低数据维度

常见的降维技术比较:能否在不丢失信息的情况下降低数据维度

作者头像
deephub
发布于 2023-02-01 02:14:47
发布于 2023-02-01 02:14:47
1.5K00
代码可运行
举报
文章被收录于专栏:DeepHub IMBADeepHub IMBA
运行总次数:0
代码可运行

本文将比较各种降维技术在机器学习任务中对表格数据的有效性。我们将降维方法应用于数据集,并通过回归和分类分析评估其有效性。我们将降维方法应用于从与不同领域相关的 UCI 中获取的各种数据集。总共选择了 15 个数据集,其中 7 个将用于回归,8 个用于分类。

为了使本文易于阅读和理解,仅显示了一个数据集的预处理和分析。实验从加载数据集开始。数据集被分成训练集和测试集,然后在均值为 0 且标准差为 1 的情况下进行标准化。

然后会将降维技术应用于训练数据,并使用相同的参数对测试集进行变换以进行降维。对于回归,使用主成分分析(PCA)和奇异值分解(SVD)进行降维,另一方面对于分类,使用线性判别分析(LDA)

降维后就训练多个机器学习模型进行测试,并比较了不同模型在通过不同降维方法获得的不同数据集上的性能。

数据处理

让我们通过加载第一个数据集开始这个过程,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd  ## for data manipulation
df = pd.read_excel(r'Regression\AirQualityUCI.xlsx')
print(df.shape)
df.head()

数据集包含15个列,其中一个是需要预测标签。在继续降维之前,日期和时间列也会被删除。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = df.drop(['CO(GT)', 'Date', 'Time'], axis=1)
y = df['CO(GT)']
X.shape, y.shape

#Output: ((9357, 12), (9357,))

为了训练,我们需要将数据集划分为训练集和测试集,这样可以评估降维方法和在降维特征空间上训练的机器学习模型的有效性。模型将使用训练集进行训练,性能将使用测试集进行评估。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_train.shape, X_test.shape, y_train.shape, y_test.shape

#Output: ((7485, 12), (1872, 12), (7485,), (1872,))

在对数据集使用降维技术之前,可以对输入数据进行缩放,这样可以保证所有特征处于相同的比例上。这对于线性模型来说是是至关重要的,因为某些降维方法可以根据数据是否标准化以及对特征的大小敏感而改变其输出。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
X_train.shape, X_test.shape

主成分分析(PCA)

线性降维的PCA方法降低了数据的维数,同时保留了尽可能多的数据方差。

这里将使用Python sklearn.decomposition模块的PCA方法。要保留的组件数量是通过这个参数指定的,这个数字会影响在较小的特征空间中包含多少维度。作为一种替代方法,我们可以设定要保留的目标方差,它根据捕获的数据中的方差量建立组件的数量,我们这里设置为0.95

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95)
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)
X_train_pca

上述特征代表什么?主成分分析(PCA)将数据投射到低维空间,试图尽可能多地保留数据中的不同之处。虽然这可能有助于特定的操作,但也可能使数据更难以理解。,PCA可以识别数据中的新轴,这些轴是初始特征的线性融合。

奇异值分解(SVD)

SVD是一种线性降维技术,它将数据方差较小的特征投影到低维空间。我们需要设置降维后要保留的组件数量。这里我们将把维度降低 2/3。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=int(X_train.shape[1]*0.33))
X_train_svd = svd.fit_transform(X_train)
X_test_svd = svd.transform(X_test)
X_train_svd

训练回归模型

现在,我们将开始使用上述三种数据(原始数据集、PCA和SVD)对模型进行训练和测试,并且我们使用多个模型进行对比。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.metrics import r2_score, mean_squared_error
import time

train_test_ML:这个函数将完成与模型的训练和测试相关的重复任务。通过计算rmse和r2_score来评估所有模型的性能。并返回包含所有详细信息和计算值的数据集,还将记录每个模型在各自的数据集上训练和测试所花费的时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def train_test_ML(dataset, dataform, X_train, y_train, X_test, y_test):
    temp_df = pd.DataFrame(columns=['Data Set', 'Data Form', 'Dimensions', 'Model', 'R2 Score', 'RMSE', 'Time Taken'])
    for i in [LinearRegression, KNeighborsRegressor, SVR, DecisionTreeRegressor, RandomForestRegressor, GradientBoostingRegressor]:
        start_time = time.time()
        reg = i().fit(X_train, y_train)
        y_pred = reg.predict(X_test)
        r2 = np.round(r2_score(y_test, y_pred), 2)
        rmse = np.round(np.sqrt(mean_squared_error(y_test, y_pred)), 2)
        end_time = time.time()
        time_taken = np.round((end_time - start_time), 2)
        temp_df.loc[len(temp_df)] = [dataset, dataform, X_train.shape[1], str(i).split('.')[-1][:-2], r2, rmse, time_taken]
    return temp_df

原始数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
original_df = train_test_ML('AirQualityUCI', 'Original', X_train, y_train, X_test, y_test)
original_df

可以看到KNN回归器和随机森林在输入原始数据时表现相对较好,随机森林的训练时间是最长的。

PCA

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pca_df = train_test_ML('AirQualityUCI', 'PCA Reduced', X_train_pca, y_train, X_test_pca, y_test)
pca_df

与原始数据集相比,不同模型的性能有不同程度的下降。梯度增强回归和支持向量回归在两种情况下保持了一致性。这里一个主要的差异也是预期的是模型训练所花费的时间。与其他模型不同的是,SVR在这两种情况下花费的时间差不多。

SVD

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
svd_df = train_test_ML('AirQualityUCI', 'SVD Reduced', X_train_svd, y_train, X_test_svd, y_test)
svd_df

与PCA相比,SVD以更大的比例降低了维度,随机森林和梯度增强回归器的表现相对优于其他模型。

回归模型分析

对于这个数据集,使用主成分分析时,数据维数从12维降至5维,使用奇异值分析时,数据降至3维。

  • 就机器学习性能而言,数据集的原始形式相对更好。造成这种情况的一个潜在原因可能是,当我们使用这种技术降低维数时,在这个过程中会发生信息损失。
  • 但是线性回归、支持向量回归和梯度增强回归在原始和PCA案例中的表现是一致的。
  • 在我们通过SVD得到的数据上,所有模型的性能都下降了。
  • 在降维情况下,由于特征变量的维数较低,模型所花费的时间减少了。

将类似的过程应用于其他六个数据集进行测试,得到以下结果:

我们在各种数据集上使用了SVD和PCA,并对比了在原始高维特征空间上训练的回归模型与在约简特征空间上训练的模型的有效性

  • 原始数据集始终优于由降维方法创建的低维数据。这说明在降维过程中可能丢失了一些信息。
  • 当用于更大的数据集时,降维方法有助于显著减少数据集中的特征数量,从而提高机器学习模型的有效性。对于较小的数据集,改影响并不显著。
  • 模型的性能在original和pca_reduced两种模式下保持一致。如果一个模型在原始数据集上表现得更好,那么它在PCA模式下也会表现得更好。同样,较差的模型也没有得到改进。
  • 在SVD的情况下,模型的性能下降比较明显。这可能是n_components数量选择的问题,因为太小数量肯定会丢失数据。
  • 决策树在SVD数据集时一直是非常差的,因为它本来就是一个弱学习器

训练分类模型

对于分类我们将使用另一种降维方法:LDA。机器学习和模式识别任务经常使用被称为线性判别分析(LDA)的降维方法。这种监督学习技术旨在最大化几个类或类别之间的距离,同时将数据投影到低维空间。由于它的作用是最大化类之间的差异,因此只能用于分类任务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score

继续我们的训练方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def train_test_ML2(dataset, dataform, X_train, y_train, X_test, y_test):
    temp_df = pd.DataFrame(columns=['Data Set', 'Data Form', 'Dimensions', 'Model', 'Accuracy', 'F1 Score', 'Recall', 'Precision', 'Time Taken'])
    for i in [LogisticRegression, KNeighborsClassifier, SVC, DecisionTreeClassifier, RandomForestClassifier, GradientBoostingClassifier]:
        start_time = time.time()
        reg = i().fit(X_train, y_train)
        y_pred = reg.predict(X_test)
        accuracy = np.round(accuracy_score(y_test, y_pred), 2)
        f1 = np.round(f1_score(y_test, y_pred, average='weighted'), 2)
        recall = np.round(recall_score(y_test, y_pred, average='weighted'), 2)
        precision = np.round(precision_score(y_test, y_pred, average='weighted'), 2)
        end_time = time.time()
        time_taken = np.round((end_time - start_time), 2)
        temp_df.loc[len(temp_df)] = [dataset, dataform, X_train.shape[1], str(i).split('.')[-1][:-2], accuracy, f1, recall, precision, time_taken]
    return temp_df

开始训练

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

lda = LinearDiscriminantAnalysis()
X_train_lda = lda.fit_transform(X_train, y_train)
X_test_lda = lda.transform(X_test)

预处理、分割和数据集的缩放,都与回归部分相同。在对8个不同的数据集进行新联后我们得到了下面结果:

分类模型分析

我们比较了上面所有的三种方法SVD、LDA和PCA。

  • LDA数据集通常优于原始形式的数据和由其他降维方法创建的低维数据,因为它旨在识别最有效区分类的特征的线性组合,而原始数据和其他无监督降维技术不关心数据集的标签。
  • 降维技术在应用于更大的数据集时,可以极大地减少了数据集中的特征数量,这提高了机器学习模型的效率。在较小的数据集上,影响不是特别明显。除了LDA(它在这些情况下也很有效),因为它们在一些情况下,如二元分类,可以将数据集的维度减少到只有一个。
  • 当我们在寻找一定的性能时,LDA可以是分类问题的一个非常好的起点。
  • SVD与回归一样,模型的性能下降很明显。需要调整n_components的选择。

总结

我们比较了一些降维技术的性能,如奇异值分解(SVD)、主成分分析(PCA)和线性判别分析(LDA)。我们的研究结果表明,方法的选择取决于特定的数据集和手头的任务。

对于回归任务,我们发现PCA通常比SVD表现得更好。在分类的情况下,LDA优于SVD和PCA,以及原始数据集。线性判别分析(LDA)在分类任务中始终击败主成分分析(PCA)的这个是很重要的,但这并不意味着LDA在一般情况下是一种更好的技术。这是因为LDA是一种监督学习算法,它依赖于有标签的数据来定位数据中最具鉴别性的特征,而PCA是一种无监督技术,它不需要有标签的数据,并寻求在数据中保持尽可能多的方差。因此,PCA可能更适合于无监督的任务或可解释性至关重要的情况,而LDA可能更适合涉及标记数据的任务。

虽然降维技术可以帮助减少数据集中的特征数量,并提高机器学习模型的效率,但重要的是要考虑对模型性能和结果可解释性的潜在影响。

本文完整代码:

https://github.com/salmankhi/DimensionalityReduction/blob/main/Notebook_25373.ipynb

作者:Salman Khan

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

本文分享自 DeepHub IMBA 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
三个主要降维技术对比介绍:PCA, LCA,SVD
随着数据集的规模和复杂性的增长,特征或维度的数量往往变得难以处理,导致计算需求增加,潜在的过拟合和模型可解释性降低。降维技术提供了一种补救方法,它捕获数据中的基本信息,同时丢弃冗余或信息较少的特征。这个过程不仅简化了计算任务,还有助于可视化数据趋势,减轻维度诅咒的风险,并提高机器学习模型的泛化性能。降维在各个领域都有应用,从图像和语音处理到金融和生物信息学,在这些领域,从大量数据集中提取有意义的模式对于做出明智的决策和建立有效的预测模型至关重要。
deephub
2023/10/09
1.4K0
三个主要降维技术对比介绍:PCA, LCA,SVD
python线性判别分析(LDA)小实例
https://www.cnblogs.com/pinard/p/6244265.html LDA原理的一些介绍
用户7010445
2020/03/03
2.1K0
机器学习之鸢尾花-降维
机器学习中,数据通常被表示为向量形式输入模型进行训练,但对于大量的多维数据直接进行处理和分析会极大消耗系统资源,因此需要通过降维缓解这一问题。降维,就是用一个低维度向量来表示原始高维度向量的特征。常见的方法有:
python与大数据分析
2022/03/11
7940
机器学习之鸢尾花-降维
有关如何使用特征提取技术减少数据集维度的端到端指南
如今,使用具有数百个(甚至数千个)特征的数据集变得非常普遍。如果要素的数量变得与存储在数据集中的观测值的数量相似(甚至更大!),则很可能导致机器学习模型过度拟合。为了避免此类问题,有必要应用正则化或降维技术(特征提取)。在机器学习中,数据集的维数等于用来表示数据集的变量数。
代码医生工作室
2019/10/14
1.4K0
1.6w字超全汇总!56个sklearn核心操作!!!
其中,X是特征数据,y是目标数据,test_size是测试集的比例(可以是0到1之间的值),random_state是随机种子,用于保证每次划分的结果一致。
Python编程爱好者
2024/05/13
4330
1.6w字超全汇总!56个sklearn核心操作!!!
机器学习算法整理(二)
现在我们用真实的数据来看一下scikit-learn中的PCA的使用,我们要处理的是一组手写识别的数据分类。
算法之名
2021/09/06
2250
【python】在【机器学习】与【数据挖掘】中的应用:从基础到【AI大模型】
在大数据时代,数据挖掘与机器学习成为了各行各业的核心技术。Python作为一种高效、简洁且功能强大的编程语言,得到了广泛的应用。
小李很执着
2024/06/15
2270
21 句话入门机器学习!
机器学习有四种用途:分类、聚类、回归和降维。更严格一点,机器学习的目的只有三个:分类、聚类和回归,降维不过是达成目标的手段之一。
数据STUDIO
2023/09/04
2870
21 句话入门机器学习!
Machine Learning-模型评估与调参 ——管道工作流
“管道工作流”这个概念可能有点陌生,其实可以理解为一个容器,然后把我们需要进行的操作都封装在这个管道里面进行操作,比如数据标准化、特征降维、主成分分析、模型预测等等,下面还是以一个实例来讲解。
Sam Gor
2019/08/22
6610
【机器学习】在【PyCharm中的学习】:从【基础到进阶的全面指南】
机器学习中的监督学习方法种类繁多,适用于不同类型的任务和数据集。下面详细介绍几种常见的监督学习方法,包括它们的基本原理、适用场景以及优缺点。
小李很执着
2024/07/02
4890
【机器学习】在【PyCharm中的学习】:从【基础到进阶的全面指南】
原理+代码,总结了 11 种回归模型
本文所用数据说明:所有模型使用数据为股市数据,与线性回归模型中的数据一样,可以做参考,此处将不重复给出。
数据STUDIO
2021/06/24
4.7K0
算法入门(八)—— 有“边界感”的支持向量机(SVM) (内附Kaggle实战源码与数据集)
机器学习中,支持向量机(SVM)是一种经典的分类算法,它的优势在于高效的性能与良好的泛化能力。简而言之,SVM就像一个能精准“分割”不同类别的高手,它通过找到一个最佳分割线(在高维空间中是超平面),来区分数据点。
万事可爱^
2025/01/23
2330
算法入门(八)—— 有“边界感”的支持向量机(SVM) (内附Kaggle实战源码与数据集)
数据处理(三)| 深入数据预处理:提升机器学习模型性能的关键步骤
今天要和大家继续讲解机器学习中一个看似枯燥但至关重要的环节——数据预处理。前面已经讲解过数据清洗和数据评质量评估(点击跳转),如果你已看过,那你已经打下了坚实的基础!今天这篇内容会更聚焦于预处理的核心技巧,手把手教你如何将原始数据“打磨”成模型的最爱。
CoovallyAIHub
2025/03/03
1790
数据处理(三)| 深入数据预处理:提升机器学习模型性能的关键步骤
PCA的推导与求解(三)— PCA的作用
使用PCA主要有三个作用: 1). 大大节省后续运行机器学习的时间; 2). 对数据可视化; 3). 降噪。
生信编程日常
2020/10/29
1.4K0
PCA的推导与求解(三)— PCA的作用
深入探讨特征维度的重要性与实际应用
在机器学习与深度学习中,特征维度是一个非常关键的概念。简单来说,特征维度指的是数据样本中每个输入向量包含的独立信息单元的数量。这些单元是从原始数据中提取出来的特征,用于描述样本的属性或特性。
编程小妖女
2025/01/16
1430
深入探讨特征维度的重要性与实际应用
基于 Python 的 11 种经典数据降维算法
网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码。这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA、LDA、MDS、LLE、TSNE 等,并附有相关资料、展示效果;非常适合机器学习初学者和刚刚入坑数据挖掘的小伙伴。
石晓文
2019/12/02
8760
快速入门Python机器学习(31)
非负矩阵分解(Non-Negative Matrix Factorization:NMF)
顾翔
2022/09/23
4790
快速入门Python机器学习(31)
Python3入门机器学习(七)- PCA
PCA(Principal Component Analysis):也是一个梯度分析的应用,不仅是机器学习的算法,也是统计学的经典算法
Meet相识
2018/09/12
1.4K0
Python3入门机器学习(七)- PCA
引领未来的智能革命:深度解析【人工智能】前沿技术与应用
人工智能(Artificial Intelligence, AI)是通过计算机模拟人类智能的技术。它的目标是让计算机能够执行通常需要人类智能才能完成的任务,如视觉识别、语音识别、决策制定和语言翻译等。AI 技术的核心在于利用算法和模型来处理和分析大量数据,从中学习和推断,从而完成复杂任务。
小李很执着
2024/08/05
3180
引领未来的智能革命:深度解析【人工智能】前沿技术与应用
【机器学习基础】Scikit-learn主要用法
Scikit-learn是基于NumPy、SciPy和Matplotlib的开源Python机器学习包,它封装了一系列数据预处理、机器学习算法、模型选择等工具,是数据分析师首选的机器学习工具包。   自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法。还包括了特征提取,数据处理和模型评估三大模块。
Francek Chen
2025/01/22
1710
【机器学习基础】Scikit-learn主要用法
推荐阅读
相关推荐
三个主要降维技术对比介绍:PCA, LCA,SVD
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验