用于 Python 降维的主成分分析

news2024/11/15 17:20:22

减少预测模型的输入变量数称为降维。

较少的输入变量可以产生更简单的预测模型,该模型在对新数据进行预测时可能具有更好的性能。

也许机器学习中最流行的降维技术是主成分分析,简称PCA。这是一种来自线性代数领域的技术,可用作数据准备技术,在拟合模型之前创建数据集的投影。

在本教程中,您将了解如何在开发预测模型时使用 PCA 进行降维。

  • 降维涉及减少建模数据中输入变量或列的数量。
  • PCA是线性代数中的一种技术,可用于自动执行降维。
  • 如何评估使用 PCA 投影作为输入并使用新的原始数据进行预测的预测模型。

教程概述

本教程分为三个部分;它们是:

  1. 降维和 PCA
  2. PCA Scikit-Learn API
  3. 用于降维的PCA工作示例

降维和 PCA

降维是指减少数据集的输入变量数量。

如果数据是使用行和列表示的,例如在电子表格中,则输入变量是作为输入提供给模型以预测目标变量的列。输入变量也称为要素。

我们可以将表示n 维特征空间上维度的数据列和数据行视为该空间中的点。这是对数据集的有用几何解释。

在具有 k 个数值属性的数据集中,您可以将数据可视化为 k 维空间中的点云......

在特征空间中具有大量维度可能意味着该空间的体积非常大,反过来,我们在该空间中的点(数据行)通常代表一个小且不具代表性的样本。

这可能会极大地影响机器学习算法的性能,这些算法适合具有许多输入特征的数据,通常被称为“维度的诅咒”。

因此,通常需要减少输入要素的数量。这减少了特征空间的维数,因此称为“降维”。

降维的一种流行方法是使用线性代数领域的技术。这通常称为“特征投影”,使用的算法称为“投影方法”。

投影方法旨在减少特征空间中的维度数量,同时保留数据中观察到的变量之间最重要的结构或关系。

在处理高维数据时,通过将数据投影到捕获数据“本质”的低维子空间来降低维数通常是有用的。这称为降维。

然后,可以将生成的数据集(投影)用作训练机器学习模型的输入。

从本质上讲,原始特征不再存在,新特征是从与原始数据不直接可比的可用数据构建的,例如没有列名。

将来在进行预测时提供给模型的任何新数据(例如测试数据集和新数据集)也必须使用相同的技术进行投影。

主成分分析(PCA)可能是最流行的降维技术。

最常见的降维方法称为主成分分析或 PCA。

它可以被认为是一种投影方法,其中具有 m 列(特征)的数据投影到具有m 列或更少列的子空间中,同时保留原始数据的本质。

PCA方法可以使用线性代数工具进行描述和实现,特别是矩阵分解,如特征分解或SVD。

PCA 可以定义为将数据正交投影到低维线性空间(称为主子空间)上,使得投影数据的方差最大化

现在我们已经熟悉了用于降维的PCA,让我们看看如何将这种方法与scikit-learn库一起使用。

PCA Scikit-Learn API

我们可以使用 PCA 来计算数据集的投影,并选择投影的多个维度或主成分作为模型的输入。

scikit-learn库提供了PCA类,该类可以适应数据集,并用于转换训练数据集和将来的任何其他数据集。

例如:

1
2
3
4
5
6
7
8
...
data = ...
# define transform
pca = PCA()
# prepare transform on dataset
pca.fit(data)
# apply transform to dataset
transformed = pca.transform(data)

PCA 的输出可用作训练模型的输入。

最好的方法是使用管道,其中第一步是 PCA 转换,下一步是将转换后的数据作为输入的学习算法。

1
2
3
4
...
# define the pipeline
steps = [('pca', PCA()), ('m', LogisticRegression())]
model = Pipeline(steps=steps)

如果输入变量具有不同的单位或比例,则在执行 PCA 转换之前规范化数据也是一个好主意;例如:

1
2
3
4
...
# define the pipeline
steps = [('norm', MinMaxScaler()), ('pca', PCA()), ('m', LogisticRegression())]
model = Pipeline(steps=steps)

现在我们已经熟悉了 API,让我们看一个示例。

用于降维的PCA工作示例

首先,我们可以使用make_classification() 函数创建一个包含 1,000 个示例和 20 个输入特征的合成二元分类问题,其中 15 个输入是有意义的。

下面列出了完整的示例。

1
2
3
4
5
6
# test classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
# summarize the dataset
print(X.shape, y.shape)

运行该示例将创建数据集并汇总输入和输出组件的形状。

1
(1000, 20) (1000,)

接下来,我们可以在此数据集上使用降维,同时拟合逻辑回归模型。

我们将使用管道,其中第一步执行 PCA 转换并选择 10 个最重要的维度或组件,然后针对这些特征拟合逻辑回归模型。我们不需要对此数据集上的变量进行规范化,因为根据设计,所有变量都具有相同的比例。

将使用重复分层交叉验证对管道进行评估,每次重复 3 次,每次重复 10 次。性能表示为平均分类准确度。

下面列出了完整的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# evaluate pca with logistic regression algorithm for classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
# define the pipeline
steps = [('pca', PCA(n_components=10)), ('m', LogisticRegression())]
model = Pipeline(steps=steps)
# evaluate model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
# report performance
print('Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))

运行该示例将评估模型并报告分类准确性。

注意:根据算法或评估过程的随机性质或数值精度的差异,您的结果可能会有所不同。请考虑运行几次示例并比较平均结果。

在本例中,我们可以看到具有逻辑回归的 PCA 转换实现了大约 81.8% 的性能。

1
Accuracy: 0.816 (0.034)

我们怎么知道将 20 个维度的输入减少到 10 个是好的还是我们能做的最好的?

我们没有;10 是一个任意的选择。

更好的方法是评估具有不同输入特征数的相同变换和模型,并选择可获得最佳平均性能的特征数(降维量)。

下面的示例执行此实验,并汇总了每个配置的平均分类准确性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# compare pca number of components with logistic regression algorithm for classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from matplotlib import pyplot
 
# get the dataset
def get_dataset():
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
return X, y
 
# get a list of models to evaluate
def get_models():
models = dict()
for i in range(1,21):
steps = [('pca', PCA(n_components=i)), ('m', LogisticRegression())]
models[str(i)] = Pipeline(steps=steps)
return models
 
# evaluate a given model using cross-validation
def evaluate_model(model, X, y):
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
return scores
 
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
scores = evaluate_model(model, X, y)
results.append(scores)
names.append(name)
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.xticks(rotation=45)
pyplot.show()

首先运行示例将报告所选每个组件或特征数的分类精度。

注意:根据算法或评估过程的随机性质或数值精度的差异,您的结果可能会有所不同。请考虑运行几次示例并比较平均结果。

随着维度数量的增加,我们看到性能提高的总体趋势。在此数据集上,结果表明在维度数与模型的分类准确性之间进行权衡。

有趣的是,除了 15 个组件之外,我们没有看到任何改进。这符合我们对问题的定义,其中只有前 15 个组件包含有关类的信息,其余五个组件是冗余的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>1 0.542 (0.048)
>2 0.713 (0.048)
>3 0.720 (0.053)
>4 0.723 (0.051)
>5 0.725 (0.052)
>6 0.730 (0.046)
>7 0.805 (0.036)
>8 0.800 (0.037)
>9 0.814 (0.036)
>10 0.816 (0.034)
>11 0.819 (0.035)
>12 0.819 (0.038)
>13 0.819 (0.035)
>14 0.853 (0.029)
>15 0.865 (0.027)
>16 0.865 (0.027)
>17 0.865 (0.027)
>18 0.865 (0.027)
>19 0.865 (0.027)
>20 0.865 (0.027)

将创建箱须图,用于分布每个配置的维度数的精度分数。

我们可以看到分类精度随着组件数量的增加而增加的趋势,限制为 15。

PCA 分量数与分类精度的箱形图

我们可以选择使用 PCA 变换和逻辑回归模型组合作为最终模型。

这涉及在所有可用数据上拟合管道,并使用管道对新数据进行预测。重要的是,必须对此新数据执行相同的转换,这些数据通过管道自动处理。

下面的示例提供了对新数据进行拟合和使用具有 PCA 转换的最终模型的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# make predictions using pca with logistic regression
from sklearn.datasets import make_classification
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
# define the model
steps = [('pca', PCA(n_components=15)), ('m', LogisticRegression())]
model = Pipeline(steps=steps)
# fit the model on the whole dataset
model.fit(X, y)
# make a single prediction
row = [[0.2929949,-4.21223056,-1.288332,-2.17849815,-0.64527665,2.58097719,0.28422388,-7.1827928,-1.91211104,2.73729512,0.81395695,3.96973717,-2.66939799,3.34692332,4.19791821,0.99990998,-0.30201875,-4.43170633,-2.82646737,0.44916808]]
yhat = model.predict(row)
print('Predicted Class: %d' % yhat[0])

运行该示例会针对所有可用数据拟合管道,并对新数据进行预测。

在这里,转换使用了 PCA 转换中最重要的 15 个组件,正如我们从上面的测试中发现的那样。

提供一行包含 20 列的新数据,并自动转换为 15 个分量并馈送到逻辑回归模型,以预测类标签。

1
Predicted Class: 1

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

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

相关文章

耗时大半个月收整全套「Java架构进阶pdf」

花了我大半个月时间收整了全套的「Java架构进阶pdf」,这一波下来,刷完你就会知道,真真香啊,我的心血果然,没白费! 请注意:关于全套的「Java架构进阶pdf」,我会从面试-筑基-框架-分布…

【Android App】实战项目之仿微信的视频通话(附源码和演示 超详细必看)

需要源码请点赞关注收藏后评论区留言私信~~~ 虽然手机出现许多年了,它具备的功能也越来越丰富,但是最基本的通话功能几乎没有变化。从前使用固定电话的时候,通话就是听声音;如今使用最新的智能手机,通话仍旧是听声音。…

无刷三相直流电机电动工具驱动方案设计

电动工具是一种工具,其致动通过附加的动力源和机构比仅其他手工劳动与使用手工工具,电动工具用于工业、建筑、花园、做饭、清洁等家务劳动,以及在房子周围用于驱动(紧固件)、钻孔、切割、成型、打磨、研磨、布线、抛光…

【微服务】Java agent 使用详解

一、前言 于一个即将上线的应用来说,系统监控是必不可少的,为什么需要监控呢?应用是跑在服务器上的,应用在运行过程中会发生各自意想不到的问题,像大家熟知的OOM,mysql故障,服务器宕机&#xff…

cubeIDE开发,基于已有的STM32CubeMX (.ioc)创建工程文件

一、STM32Cube 生态系统 可以在其官网查看,支持中文。 STM32Cube - Discover the STM32Cube Ecosystem - STMicroelectronics ​ 截取官网的STM32Cube家族的软件工具描述: 【1】STM32CubeMX, 面向任意STM32设备的配置工具。这款简单易用的图形用户界面为…

ubuntu根目录清理

0.防范于未然(就像给window电脑清理垃圾) 清理ubuntu用不上的东西的常用命令 # 系统自带清理命令 sudo apt-get autoclean sudo apt-get clean sudo apt-get autoremove# 查看目录占用空间 sudo du -cks * | sort -rn | head -10 sudo du --max-depth1…

[附源码]计算机毕业设计JAVA血库管理系统

[附源码]计算机毕业设计JAVA血库管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Ma…

Effective C++条款24:若所有参数皆需类型转换,请为此采用non-member函数

Effective C条款24:若所有参数皆需类型转换,请为此采用non-member函数(Declare non-member functions when type conversions should apply to all parameters)条款24:若所有参数皆需类型转换,请为此采用no…

Swift基础语法 - 枚举

枚举的基本用法 定义:枚举简单的说也是一种数据类型,只不过是这种数据类型只包含自定义的特定数据,它是一组有共同特性的数据的集合。 enum Direction {case northcase southcase eastcase west }enum Direction {case north,south,east,we…

数理统计笔记10:回归分析

引言 数理统计笔记的第10篇介绍了回归分析,从相关关系开始介绍,然后介绍回归分析,主要介绍了一元回归模型和多元回归模型,并对其中的原理和检验进行了叙述,最后简单介绍了一下可以化为线性回归模型的非线性回归模型。 …

【Gradle-5】Gradle常用命令与参数

1、前言 Gradle的命令有很多,熟悉常用命令之后,在日常开发中,不仅可以提升效率,也可以辅助我们快速定位并解决编译问题;而且某些情况下命令行(CLI)与按钮执行的编译结果是不一样的,比如构建时要传参(-P)&a…

大学生环保主题网页制作 环境网页设计模板 学生静态网页作业成品 dreamweaver保护地球环境HTML网站制作

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

【电商项目实战】上传头像(详细篇)

🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉SpringBoot电商项目实战 ✨学习社区: 👉不会压弯的小飞侠 ✨知足上进&#x…

【Spring源码系列】Bean生命周期-实例化前

这里写目录标题前言一、实例化前 - InstantiationAwareBeanPostProcessor介绍InstantiationAwareBeanPostProcessor实例化前作用InstantiationAwareBeanPostProcessor实例化前代码案例二、实例化前 - 源码分析声明关键点源代码解读前言 在Bean的生命周期中,‘实例化…

Python还是很迷茫的小伙伴进来,教你用图秒懂Python

哈喽,大家好呀!今天为大家带来12张图解python,让你们轻松学会了解python。 1.Python 解释器: Python数据结构:变量与运算符:Python 流程控制:Python 文件处理:python 输入输出&…

(三)Vue之模板语法

文章目录插值语法指令语法Vue学习目录上一篇:(二)初识Vue 下一篇:(四)Vue之数据绑定 Vue模板语法有2大类: 1.插值语法2.指令语法 插值语法 功能:用于解析标签体内容。 写法&…

lombok入门

目录 lombok概述 lombok安装 Getter、Setter ToString EqualsAndHashCode NotNull 生成构造方法相关注解 Data、Builder Log Cleanup、SneakyThrows lombok概述 以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString/构造方…

Python迭代器和生成器

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list、string、dict等等,这些对象都可以被称为可迭代对象。至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了。 迭代器 迭代器对象要求支持迭代器协议…

cpu设计和实现(总结篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 学习cpu,主要还是因为自己对它的原理和实现还有很多不明白、不清楚的地方,本着追根溯源的精神,正好借助于veril…

项目接入腾讯云短信服务SMS实现向用户发送手机验证码

1、自述 早在18年的时候,我就在项目中使用过阿里云的短信服务,现在我上阿里云短信控制台看,还能看到当时创建的短信签名,如下图所示。 出于某种原因,我现在想重新申请一个新的签名,却审批失败了&#xf…