【机器学习】PCA案例的python实现

一、说明

        虽然可以通过更改优化算法来加快机器学习算法的拟合速度,但加快算法速度的更常用方法是使用主成分分析 (PCA)。如果您的学习算法由于输入维度太高而太慢,那么使用 PCA 加速它可能是一个合理的选择。这可能是PCA最常见的应用。PCA 的另一个常见应用是数据可视化。

二、PCA简述

2.1 什么是PCA?

        主成分分析(PCA)是一种降低数据维数的方法,用于改进数据可视化和加快机器学习模型训练。

        为了了解使用 PCA 进行数据可视化的价值,本教程文章的第一部分介绍了应用 PCA 后 Iris 数据集的基本可视化。第二部分探讨如何使用 PCA 在修改后的国家标准与技术研究院 (MNIST) 数据集上加速机器学习算法(逻辑回归)。有了这个,让我们开始吧。

2.2 用于数据可视化的 PCA

        对于许多机器学习应用程序,它有助于可视化数据。可视化二维或三维数据并不具有挑战性。但是,即使是本教程这一部分中使用的 Iris 数据集也是四维的。您可以使用 PCA 将该四维数据简化为二维或三维,以便您可以绘制并希望更好地理解数据。

        有关数据科学的更多信息 如何使用 Z 表并创建自己的 Z 表

        第 1 步: 加载鸢尾花数据集
        鸢尾花数据集附带scikit-learn,不需要您从某些外部网站下载任何文件。下面的代码将加载鸢尾花数据集。

import pandas as pd 
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data" 
# load dataset into Pandas DataFrame
df = pd.read_csv(url, names=['sepal length','sepal width','petal length','petal width','target'])
鸢尾花head()函数
原始pandas.df(功能和目标)。|图片:迈克尔·加拉尼克 

        步骤 2:标准化数据
        PCA 受缩放的影响,因此需要在应用 PCA 之前缩放数据中的要素。用于帮助您将数据集的特征标准化为单位比例(和),这是许多机器学习算法获得最佳性能的要求。如果不缩放数据,可能会对算法产生负面影响。StandardScalermean = 0variance = 1

from sklearn.preprocessing import StandardScaler
 
features = ['sepal length', 'sepal width', 'petal length', 'petal width']
 
# Separating out the features
x = df.loc[:, features].values
 
# Separating out the target
y = df.loc[:,['target']].values
 
# Standardizing the features
x = StandardScaler().fit_transform(x)

        第 3 步:PCA 投影到 2D
        原始数据有四列(萼片长度、萼片宽度、花瓣长度和花瓣宽度)。在本节中,代码将四维原始数据投影到二维中。降维后,通常没有为每个主成分分配特定的含义。新组件只是变化的两个主要维度。

from sklearn.decomposition import PCA
 
pca = PCA(n_components=2)
 
principalComponents = pca.fit_transform(x)
 
principalDf = pd.DataFrame(data = principalComponents
             , columns = ['principal component 1', 'principal component 2'])
PCA和保留前两个主要成分

finalDf = pd.concat([principalDf, df[['target']]], axis = 1)

        
沿 连接数据帧。 是绘制数据之前的最后一个数据帧。

axis = 1finalDf
在绘制图形之前沿列连接数据帧以创建 finalDf。 标题

        步骤 4:可视化 2D 投影
        本节只是绘制二维数据。请注意,在下图中,这些类似乎彼此分离得很好。

fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1) 
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
 
targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
colors = ['r', 'g', 'b']
for target, color in zip(targets,colors):
    indicesToKeep = finalDf['target'] == target
    ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']
               , finalDf.loc[indicesToKeep, 'principal component 2']
               , c = color
               , s = 50)
ax.legend(targets)
ax.grid()
双分量 PCA 图。

2.3 解释方差

        解释的方差告诉您有多少信息(方差)可以归因于每个主成分。这很重要,因为虽然您可以将四维空间转换为二维空间,但这样做会丢失一些方差(信息)。通过使用属性 ,您可以看到第一个主成分包含 72.77% 的方差,第二个主成分包含 23.03% 的方差。这两个组件共同包含 95.80% 的信息。

explained_variance_ratio_

pca.explained_variance_ratio_


三、PCA 加速机器学习算法

        虽然还有其他方法可以加速机器学习算法,但一种不太常见的方法是使用 PCA。在本节中,我们不使用 Iris 数据集,因为它只有 150 行和 784 个特征列。手写数字的MNIST数据库更合适,因为它有784个特征列(60个维度),一个000,10个示例的训练集和一个000,<>个示例的测试集。

3.1 步骤 1 :下载并加载数据

        您还可以添加参数以更改下载数据的位置。data_homefetch_mldata

from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784')

        您下载的图像包含在 (70000, 784) 中,形状为 (70, 000),这意味着有 784,784 张具有 <> 个维度(<> 个要素)的图像。mnist.data

        标签(整数 0–9)包含在 中。特征为 784 维(28 x 28 图像),标签为 0–9 之间的数字。mnist.target

3.2 步骤 2:将数据拆分为训练集和测试集

        下面的代码执行训练测试拆分,将 6/7 的数据放入训练集中,将 1/7 的数据放入测试集中。

from sklearn.model_selection import train_test_split
 
# test_size: what proportion of original data is used for test set
train_img, test_img, train_lbl, test_lbl = train_test_split( mnist.data, mnist.target, test_size=1/7.0, random_state=0)

3.3 步骤 3:标准化数据

        这一段中的文字几乎是之前所写内容的精确副本。PCA 受比例影响,因此您需要在应用 PCA 之前缩放数据中的要素。您可以将数据转换为单位比例(和),这是许多机器学习算法获得最佳性能的要求。 帮助标准化数据集的功能。适合训练集,转换训练集和测试集。mean = 0variance = 1StandardScaler

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
 
# Fit on training set only.
scaler.fit(train_img)
 
# Apply transform to both the training set and the test set.
train_img = scaler.transform(train_img)
test_img = scaler.transform(test_img)

3.4 步骤 4:导入并应用 PCA

        请注意,下面的代码包含 .95 的组件数参数。这意味着scikit-learn选择主成分的最小数量,以便保留95%的方差。

from sklearn.decomposition import PCA
 
# Make an instance of the Model
pca = PCA(.95)
在训练集上安装 PCA。您只是在训练集上拟合 PCA。

pca.fit(train_img)
您可以使用 了解拟合模型后 PCA 有多少个分量。在本例中,95% 的差异等于 330 个主成分。pca.n_components_

3.5 步骤 5:将映射(转换)应用于训练集和测试集。

train_img = pca.transform(train_img)
test_img = pca.transform(test_img)


3.6 步骤 6:将逻辑回归应用于转换后的数据


1. 导入要使用的模型
                在sklearn中,所有机器学习模型都作为Python类实现。

2. 创建模型的实例。

# all parameters not specified are set to their defaults
# default solver is incredibly slow which is why it was changed to 'lbfgs'
logisticRegr = LogisticRegression(solver = 'lbfgs')

3. 在数据上训练模型,存储从数据中学到的信息。

        该模型正在学习数字和标签之间的关系。

logisticRegr.fit(train_img, train_lbl)

4. 预测新数据(新图像)的标签

        这部分使用模型在模型训练过程中学到的信息。下面的代码预测了一个观察结果。

# Predict for One Observation (image)
logisticRegr.predict(test_img[0].reshape(1,-1))

下面的代码一次预测多个观测值。

# Predict for One Observation (image)
logisticRegr.predict(test_img[0:10])

3.7 步骤 7:测量模型性能

        虽然准确性并不总是机器学习算法的最佳指标(精度、召回率、F1 分数、ROC 曲线等会更好),但为了简单起见,这里使用它。

logisticRegr.score(test_img, test_lbl)

四、测试 PCA 后拟合逻辑回归的时间

        本教程的这一部分的全部目的是展示您可以使用 PCA 来加速机器学习算法的拟合。下表显示了使用 PCA 后在 MacBook 上拟合逻辑回归所需的时间(每次保留不同的方差量)。

在保留不同方差分数的 PCA 后拟合逻辑回归所需的时间

       

五、从压缩表示进行图像重建

        本教程前面的部分演示了如何使用 PCA 将高维数据压缩为低维数据。但是 PCA 也可以获取数据的压缩表示形式(低维数据),并将其返回到原始高维数据的近似值。如果您有兴趣,可以使用 重现 this code 下图。

PCA后原始数据的原始图像(左)和近似值(右)

        我本可以在这篇文章中写更多关于PCA的文章,因为它有许多不同的用途。但我希望这对您正在从事的任何任务都有帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式-捕获组,命名捕获组,非捕获组

正则表达式的作用 测试目标字符串是否符合规则 返回true/false按照规则从目标字符串提取内容 返回匹配的数组 在线测试工具 regex101: build, test, and debug regexRegular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, …

【单片机】STM32F103C8T6 最小系统板原理图

STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器&#xff0c;由STMicroelectronics&#xff08;ST&#xff09;公司生产。它是STMicroelectronics的STM32系列微控制器中的一员&#xff0c;被广泛应用于嵌入式系统和电子设备中。 STM32F103C8T6单片机的主要特点和资源…

基于.Net6使用YoloV8的分割模型

前言 在目标检测一文中&#xff0c;我们学习了如何处理Onnx模型&#xff0c;并的到目标检测结果&#xff0c;在此基础上&#xff0c;本文实现基于.Net平台的实例分割任务。 执行YoloV8的分割任务后可以得到分割.pt模型。由于Python基本不用于工业软件的部署&#xff0c;最终还…

SpringBoot 如何使用 @RequestBody 进行数据校验

SpringBoot 如何使用 RequestBody 进行数据校验 在 Web 开发中&#xff0c;前台向后台发送数据是非常常见的场景。而在 SpringBoot 框架中&#xff0c;我们通常使用 RequestBody 注解来接收前台发送的 JSON 数据&#xff0c;并将其转化为 Java 对象。但是&#xff0c;接收到的…

Zookeeper集群的特点

一、Zookeeper集群的特点 Zookeeper:一个领导者 (Leader)&#xff0c;多个跟随者 (Follower) 组成的集群集群中只要有半数以上节点存活&#xff0c;Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器全局数据一致:每个Server保存一份相同的数据副本&#xff0c;C…

git——使用ssh连接远程仓库

文章目录 前言一. 获取邮箱和密码1. 本地配置你的名字和邮箱2. 使用命令获取你本地的邮箱和密码 二、生成ssh公钥1.任意一个文件夹路径打开Git Bash Here并输入以下命令连按三次回车2. 根据上面红框部分的地址打开文件夹3. 打开并查看id_rsa.pub 文件 三、在GitHub上连接ssh1. …

UE5.1.1 C++从0开始(15.作业4个人作业分享)

教程链接&#xff1a;https://www.bilibili.com/video/BV1nU4y1X7iQ 好吧这个作业应该是之前写的&#xff0c;但是我发现我没写&#xff0c;后面我又回去自己写了一遍再看代码&#xff0c;感觉上大差不差&#xff0c;各位可以看着我的和老师的还有自己的对比下。 SBTService_…

[LeetCode周赛复盘] 第 107 场双周赛20230624

[LeetCode周赛复盘] 第 107 场双周赛20230624 一、本周周赛总结6898. 字符串连接删减字母1. 题目描述2. 思路分析3. 代码实现 6895. 构造最长的新字符串1. 题目描述2. 思路分析3. 代码实现 6898. 字符串连接删减字母1. 题目描述2. 思路分析3. 代码实现 6468. 统计没有收到请求…

Consul 理解

Consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案&#xff0c;不再需要依赖其他工具&#xff08;比如ZooKeeper等&#xff09;。服务部署简单&#xff0c;只有一…

(转载)支持向量机(support vector machine, SVM)的分类(matlab实现)

支持向量机(support vector machine,SVM)是一种新的机器学习方法&#xff0c;其基础是Vapnik 创建的统计学习理论(statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则&#xff0c;在最小化样本点误差的同时&#xff0c;…

HTML点击显示、点击隐藏details 标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><details> <summary>Copyright 1999-2011.</summary> <p> - by Refsnes Da…

Redis数据类型

Redis数据类型 一、String数据类型1、概述2、实验 二、List数据类型1、概述2、实验 三、Hash数据类型&#xff08;散列类型&#xff09;1、概述2、实验 四、Set数据类型&#xff08;无序集合&#xff09;1、概述2、应用范围3、实验 五、Sorted Set数据类型&#xff08;zset、有…

JAVA开发与运维(怎么通过docker部署微服务jar包)

目标&#xff1a; 通过docker的方式部署微服务。 一、背景&#xff1a; 我们通过java开发的微服务可以打成jar包&#xff0c;我们可以直接通过裸机部署&#xff0c;也可以通过docker来部署&#xff0c;本文介绍通过docker来部署微服务。 二、首先我们介绍一下docker的发展过程…

2022 年第十二届 MathorCup 高校数学建模挑战赛D题思路(移动通信网络站址规划和区域聚类问题)

目录 一、前言 二、问题背景 三、问题 四、解题思路 &#xff08;1&#xff09;针对问题1&#xff1a; &#xff08;2&#xff09;针对问题2&#xff1a; &#xff08;3&#xff09;针对问题3&#xff1a; 五、附上几个典型代码 &#xff08;1&#xff09;K-means算法…

【HTTP 协议】掌握 Web 的核心技术

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 HTTP 协议&#xff08;超文本传输协议&#xff09;&#xff0c;不知道大家第一次是从什么地方了解到这个协议的呢&#xff1f;在真实的网络环境中网络协议的种类非常多&#xff0c;其中有一些耳熟能详的…

深入解析大型语言模型:从训练到部署大模型

简介 随着数据科学领域的深入发展&#xff0c;大型语言模型—这种能够处理和生成复杂自然语言的精密人工智能系统—逐渐引发了更大的关注。 LLMs是自然语言处理&#xff08;NLP&#xff09;中最令人瞩目的突破之一。这些模型有潜力彻底改变从客服到科学研究等各种行业&#x…

SpringSecurity实现Remember-Me实践

【1】基于会话技术的实现 也就是基于Cookie的实现&#xff0c;用户信息通过某种规则进行加密然后生成一个字符串设置为cookie。 ① 登录页面 这里name"remember-me"表示“记住我”的复选框&#xff0c;默认key是remember-me。 <form action"/user/login&…

EasyCVR电子地图鼠标悬停展示经纬度的技术实现

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可…

VS2019 Python连接Sql server2008

安好后&#xff1a; 测试代码&#xff1a; import pymssqltry:conn pymssql.connect(host127.0.0.1,usersa,password123456,databasehotel,charsetutf8)# 连接并执行Sql语句cursor conn.cursor()sql select * from odercursor.execute(sql)# 获取数据集rs cursor.fetchal…

从操作系统角度了解内存管理

一.内存管理 1.主要功能 内存管理的主要功能有: 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理&#xff0c;使程序员摆脱存储分配的麻烦&#xff0c;提高编程效率。地址转换。在多道程序环境下&#xff0c;程序中的逻辑地址与内存中的物理地址不可能一致, …