当前位置: 首页 > news >正文

亦菲喊你来学机器学习(20) --PCA数据降维

文章目录

  • PCA数据降维
    • 一、降维
    • 二、优缺点
    • 三、参数
    • 四、实例应用
      • 1. 读取文件
      • 2. 分离特征和目标变量
      • 3. 使用PCA进行降维
      • 4. 打印特征所占百分比和具体比例
      • 5. PCA降维后的数据
      • 6. 划分数据集
      • 7. 训练逻辑回归模型
      • 8. 评估模型性能
  • 总结

PCA数据降维

主成分分析(Principal Component Analysis, PCA)是一种常用的数据降维技术,它可以在保留数据集中最重要的特征的同时,减少数据的维度。PCA通过创建一个新的特征空间来实现这一点,这个新空间是由原始数据的主成分(即方差最大的方向)定义的。

本篇所用数据:
链接: 训练数据
提取码: 9hgj

一、降维

数据的特征又叫做数据的维度,所谓降维,即是减少数据的特征。

相较于随机森林的不同,随机森林是筛选出权重较大的特征,其余的特征都进行特征工程处理(即去除)。

但是PCA降维可以理解为将所有的特征压缩到另一个特征空间,将多个维度的特征映射在一个维度上,从而减少它总的维度。

二、优缺点

优点

  1. 计算方法简单,容易实现。
  2. 可以减少指标筛选的工作量。
  3. 消除变量间的多重共线性。
  4. 在一定程度上能减少噪声数据。

缺点

  1. 特征必须是连续型变量。
  2. 无法解释降维后的数据是什么。
  3. 贡献率小的成分有可能更重要。

三、参数

PCA(n_components=None,copy=True,whiten=False,svd_solver='auto',tol=0.0,iterated_power='auto',random_state=None)

主要参数:

-- n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。指定整数,表示要降维到的目标,【比如十维的数据,指定n_components=5,表示将十维数据降维到五维】如果为小数,表示累计方差百分比。-- copy: 类型:boolTrue或者False,缺省时默认为True。表示是否在运行算法时,将原始训练数据复制一份,保护原数据。-- whiten:判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。			  如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。-- svd_solver:指定奇异值分解SVD的方法,【按默认设置即可】,有4个可以选择的值:- randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。- full则是传统意义上的SVD,使用了scipy库对应的实现。- arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的		sparse SVD实现。- 默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。

四、实例应用

目标流程:使用PCA进行特征降维 -----> 使用逻辑回归模型进行分类任务

1. 读取文件

使用pandas库的read_excel函数读取名为’hua.xlsx’的Excel文件,并将内容存储在DataFrame 类型数据data中。

import pandas as pd  
data = pd.read_excel('hua.xlsx')

2. 分离特征和目标变量

通过iloc索引器,x被设置为DataFrame中除最后一列外的所有列(即特征),而y被设置为最后一列(即目标变量或标签)。

x = data.iloc[:,:-1]  
y = data.iloc[:,-1]

3. 使用PCA进行降维

导入PCA类并创建一个PCA实例,设置n_components=0.90意味着希望保留的数据方差比例为90%。然后,使用fit方法计算数据的主成分。

from sklearn.decomposition import PCA  
pca = PCA(n_components=0.90)  
pca.fit(x)

4. 打印特征所占百分比和具体比例

这两行代码分别打印了保留的总方差百分比和每个主成分解释的方差比例。

print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))  
print(pca.explained_variance_ratio_)
--------------------
特征所占百分比:0.9287327483408421	#百分结果通常不会与设定值正好相同,但肯定会比设定值大
[0.84389796 0.08483479]

5. PCA降维后的数据

使用transform方法将原始特征x映射到PCA的主成分空间中,得到降维后的数据new_x。

new_x = pca.transform(x)  
print(new_x)
---------------
PCA降维后数据:
[	#展示部分结果[-0.64329795  0.06460986][-1.17974815  0.04201328][-0.10025387  0.3220728 ][ 0.12824342  0.03129845][-1.99954745  0.05762851]…… ……
]

6. 划分数据集

使用train_test_split函数将降维后的特征new_x和目标变量y划分为训练集和测试集,测试集占20%。

x_train,x_test,y_train,y_test = train_test_split(new_x,y,test_size=0.2,random_state=0)

7. 训练逻辑回归模型

导入LogisticRegression类并创建一个实例,然后使用训练数据x_train和y_train来训练模型。

from sklearn.linear_model import LogisticRegression  
classifier_PCA = LogisticRegression()  
classifier_PCA.fit(x_train,y_train)

8. 评估模型性能

使用训练好的模型对训练集和测试集进行预测,并使用classification_report函数打印出分类报告,包括精确度、召回率、F1分数等指标,以评估模型在训练集和测试集上的性能。

  • 训练集
from sklearn import metrics  
train_pre = classifier_PCA.predict(x_train)  
print(metrics.classification_report(y_train,train_pre)) 
--------------------precision    recall  f1-score   support0       0.92      0.96      0.94        251       0.96      0.93      0.94        27accuracy                           0.94        52macro avg       0.94      0.94      0.94        52
weighted avg       0.94      0.94      0.94        52
  • 测试集
test_pre = classifier_PCA.predict(x_test)  
print(metrics.classification_report(y_test,test_pre))
-------------------precision    recall  f1-score   support0       1.00      1.00      1.00         51       1.00      1.00      1.00         9accuracy                           1.00        14macro avg       1.00      1.00      1.00        14
weighted avg       1.00      1.00      1.00        14

这样我们就完成了使用PCA进行特征降维,并使用逻辑回归模型进行分类任务的完整流程。

总结

本篇介绍了:

  1. PCA降维指的是减少数据特征。
  2. PCA适用于:
    1. 数据维度高的时候
    2. 将数据可视化时:将维度转化为二维或三维等
  3. 完整的PCA处理流程。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 江协科技stm32————11-5 硬件SPI读写W25Q64
  • explicit 的作用(如何避免编译器进行隐式类型转换)
  • 并发编程:synchronized 关键字
  • 【Linux】Linux 可重入函数
  • 0.ffmpeg面向对象oopc
  • 项目实战系列三: 家居购项目 第五部分
  • C++ STL-Map容器从入门到精通详解
  • HarmonyOs DevEco Studio小技巧9--翻译软件
  • 怎么利用XML发送物流快递通知短信
  • qml Component 组件
  • 【设计模式】设计模式的八大原则
  • 无线麦克风哪个品牌音质最好?十大音质最好的麦克风品牌推荐
  • Lua5.3 参考手册
  • C++(一)----C++基础
  • 用CSS 方式设置 table 样式
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular 4.x 动态创建组件
  • AngularJS指令开发(1)——参数详解
  • JavaScript学习总结——原型
  • Netty 4.1 源代码学习:线程模型
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Node项目之评分系统(二)- 数据库设计
  • Object.assign方法不能实现深复制
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 订阅Forge Viewer所有的事件
  • 服务器之间,相同帐号,实现免密钥登录
  • 给第三方使用接口的 URL 签名实现
  • 欢迎参加第二届中国游戏开发者大会
  • 将 Measurements 和 Units 应用到物理学
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何设计一个微型分布式架构?
  • -- 数据结构 顺序表 --Java
  • 微信开源mars源码分析1—上层samples分析
  • 用Python写一份独特的元宵节祝福
  • 7行Python代码的人脸识别
  • postgresql行列转换函数
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (C11) 泛型表达式
  • (LeetCode) T14. Longest Common Prefix
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十一)图像的罗伯特梯度锐化
  • (算法)N皇后问题
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .net2005怎么读string形的xml,不是xml文件。