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

news2024/11/19 4:25:18

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

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

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

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

数据处理

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

import pandas as pd  ## for data manipulation
df = pd.read_excel(r'Regression\AirQualityUCI.xlsx')
print(df.shape)
df.head()

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

X = df.drop(['CO(GT)', 'Date', 'Time'], axis=1)
y = df['CO(GT)']
X.shape, y.shape

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

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

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,))

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

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

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。

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)对模型进行训练和测试,并且我们使用多个模型进行对比。

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来评估所有模型的性能。并返回包含所有详细信息和计算值的数据集,还将记录每个模型在各自的数据集上训练和测试所花费的时间。

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

原始数据:

original_df = train_test_ML('AirQualityUCI', 'Original', X_train, y_train, X_test, y_test)
original_df

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

PCA

pca_df = train_test_ML('AirQualityUCI', 'PCA Reduced', X_train_pca, y_train, X_test_pca, y_test)
pca_df

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

SVD

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)的降维方法。这种监督学习技术旨在最大化几个类或类别之间的距离,同时将数据投影到低维空间。由于它的作用是最大化类之间的差异,因此只能用于分类任务。

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

继续我们的训练方法

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

开始训练

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://avoid.overfit.cn/post/df739d6749f54ca99690ff819dacc497

作者:Salman Khan

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子招标采购系统源码—互联网+招标采购

​ ​ 智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明&#x…

Kong动态负载均衡与服务发现

Kong动态负载均衡一、背景二、通过docker 安装 Kong三、分布式API网关存在的意义四、Kong 的相关特性五、Kong 体系结构六、Kong 工作流程七、从 nginx 配置到 Kong 配置7.1、Kong 核心四对象7.2、四对象关系八、插件机制九、Kong 网关插件十、使用konga10.1、实现一个负载均衡…

sklearn预测评估指标计算详解:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1score

目录 前言 一、准确率 二、精确率 三、召回率 四、F1-score 点关注,防走丢,如有纰漏之处,请留言指教,非常感谢 前言 很多时候需要对自己模型进行性能评估,对于一些理论上面的知识我想基本不用说明太多&#xff0…

工具及方法 - 项目管理工具ProjectLibre

这个项目管理工具是开源和免费的,可以作为微软Project工具的平替。官网是 http://www.projectlibre.org 。 下载: ProjectLibre - Project Management download | SourceForge.net 当前的最新版本是2021-01-08的1.9.3版本,而现在是2022-12月…

路由交换网络技术,交换机基础入门及相关特性介绍

一、交换机:工作在数据链路层 ,转发数据帧 HUB所有接口再同一个冲突域,交换机每个接口都属于一个冲突域 交换机功能: 1、学习 2、转发 3、泛洪 4、丢弃 二、学习MAC地址及转发 MAC地址表项默认老化时间300秒。如果在300秒之内收到同一主机从同一接口发来的帧,老化时…

web3:区块链Blockchain

在此声明,仅做分享,绝不存在倡导炒币行为 目录区块链概念区块链基础知识交易(Transaction)区块(Block)链(Chain)公私钥区块链存储结构简单理解区块结构Block区块头Merkle根nonce区块链原理区块链架构区块链特点分布式账本—不可篡改性、去中心化非对称加…

ThinkPHP5之SQLI审计分析(一)

说明 该文章来源于徒弟lu2ker转载至此处,更多文章可参考:https://github.com/lu2ker/ 文章目录说明0x00 测试代码做了什么?0x01 调用链分析0x02 分析最内层调用的处理0x03 分析上一层调用的处理0x04 Payload构造Time:8-31 影响版…

pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为4239字,预计阅读12分钟 前言 前面几篇文章实现了pyTorch训练模型,然后在Windows平台用C OpenCV DNN推理都实现了,这篇就来看看在Android端直接实现一个手写数字识别的功…

The Open Group亚太区总经理Chris Forde元旦贺词:踔厉奋发、笃行不怠,共赴新未来!

Happy New Year everyone, hope you are enjoying the holiday season, and perhaps planning your New Year’s resolutions. 大家新年快乐!希望此刻您正在享受假期,或在规划自己的新年决心。 Now is the time for me, with you, to say goodbye to 202…

PDF怎么转换成Word?电脑必备的转换工具

电脑上的办公场景可以说是很多样了,而现在线上办公,线上会议,以及线上网课等的发展越来越全面,关于文件的编辑和传输也渐渐需要更多的软件来辅助我们办公。就像是PDF文件格式和Word文件格式这两种常见的格式,想要直接进…

小米路由器 R4A 刷原生 OpenWrt 后的风景

简 述: 继上篇 小米AX6S刷OpenWrt和开启OpenClash 后,手痒难耐,决定把小米路由器4A千兆版(R4A)路由器 给刷个原生的 OpenWrt。 文章目录背景刷成原生 OpenWrt原生 OpenWrt 基础操作开启 WiFiopkg 换源设置中文OpenClash 插件8M 之殇,终结Refe…

JavaSE学习(二)

1.基本数据类型转换 自动类型转换 1.java程序在进行赋值或运算的时候,会将精度小的类型自动转换为精度大的数据类型再进行计算 2.精度大的类型赋值给精度小的类型会报错,反之则会进行自动类型转换 int a4; floata1.1;这样写是错的,因为1.1是…

Uni-app + Vue3 + TS +Vite 创建项目

一、npx 与 npm 区别 npm 都很熟,可是与 npm 如此相似的 npx 是干嘛的呢?我们为甚要介绍 npx ? 由于 uni-app 官方提供创建命令使用的是 npx,所以我们先来了解下 npx 是干什么的?它与 npm 的区别。 npx 是 npm 的高级版本&…

java 出现unreachable statement异常 原因检查

unreachable statement异常: 今天在写代码的过程中,发现有行代码变红线,显示unreachable statement异常,但是代码本身没什么问题,通过查询资料发现其实就是该行代码不可执行的原因,出现该异常共有以下两种…

第三十八章 贪心算法——区间问题(上)

第三十八章 贪心策略——区间相关问题一、什么贪心策略?二、区间问题合集1、思路:2、问题1: 区间选点(1)问题(2)思路和证明a.思路b.证明(3)代码3、问题2:&…

Linux系统编程——基础篇

文章目录一、快捷键二、文件1.重要文件2.文件类型3.cp4.增加权限5.修改三、查找和检索四、安装五、压缩与解压六、vim的三种工作方式七、gcc编译四步骤八、静态库和动态库一、快捷键 Ctrla:光标移到开头 Ctrle:光标移到结尾 Ctrlu:清除整行 …

SQLSERVER 居然也能调 C# 代码 ?

一:背景 1. 讲故事 前些天看到一个奇怪的 Function 函数,调用的是 C# 链接库中的一个 UserLogin 方法,参考代码如下: CREATE FUNCTION dbo.clr_UserLogin (name AS NVARCHAR(100),password AS NVARCHAR(100) ) RETURNS INT AS…

Kali Linux中shutdown指令的用法3-1

在Kali Linux中,shutdown指令用于停止(halt)、关闭(power off)或者重启(reboot)系统。 1 语法格式 shutdown指令的语法如下所示 shutdown [OPTIONS] [TIME] [WALL] 其中,OPTIONS…

Qt、使用QToolButton和QStackedWidget的侧边栏(SideBar)的实现与实现原理解析

Qt、侧边栏(SideBar)的原理与实现(附Demo) 目录Qt、侧边栏(SideBar)的原理与实现(附Demo)1、简介2、侧边栏控件组成3、UI布局4、代码实现界面的切换Demo下载:https://git…

2023四川大学图书情报档案专业考研初试介绍(2023.1.02已更新)

文章目录川大图情基本情况2023年招生情况近5年录取数据复试2021-2022年复试线学硕复试线图情专硕复试线2021-2022年复试录取分数2022年学硕部分拟录取人员详细分数(不含调剂)专业课备考专业课资料博主所售资料一览667科目备考参考策略972科目备考方法参考目标分数川大图情基本情…