【4 - 降维算法PCA和SVD - 案例部分】菜菜sklearn机器学习

news2024/12/25 14:48:03

 课程地址:《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili

  • 第一期:sklearn入门 & 决策树在sklearn中的实现
  • 第二期:随机森林在sklearn中的实现
  • 第三期:sklearn中的数据预处理和特征工程
  • 第四期:sklearn中的降维算法PCA和SVD
  • 第五期:sklearn中的逻辑回归
  • 第六期:sklearn中的聚类算法K-Means
  • 第七期:sklearn中的支持向量机SVM(上)
  • 第八期:sklearn中的支持向量机SVM(下)
  • 第九期:sklearn中的线性回归大家族
  • 第十期:sklearn中的朴素贝叶斯
  • 第十一期:sklearn与XGBoost
  • 第十二期:sklearn中的神经网络

目录

案例一:用PCA做噪音过滤(inverse_transform)

(1)导入数据并探索

(2)定义画图函数

(3)为数据加上噪音

(4)降维

(5)逆转降维结果,实现降噪

PCA类的重要接口、参数和属性总结 

重要参数

重要属性

重要接口

案例二:PCA对手写数字数据集的降维

(1)导入数据并探索

(2)画累计方差贡献率曲线,找最佳降维后维度的范围

(3)降维后维度的学习曲线,继续缩小最佳维度的范围

(4)细化学习曲线,找出降维后的最佳维度

(5)导入找出的最佳维度进行降维,查看模型效果

(6)现在特征数量已经不足之前的3%,换模型如何

(7)KNN的k值学习曲线

(8)定下超参数后,模型效果和运行时间如何


案例一:用PCA做噪音过滤(inverse_transform)

降维的目的之一就是希望抛弃掉对模型带来负面影响的特征(带有效信息的特征的方差应是远大于噪音的),所以相比噪音,有效的特征所带的信息应该不会在PCA过程中被大量抛弃

inverse_transform能够在不恢复原始数据的情况下,将降维后的数据返回到原本的高维空间,即能够实现 “保证维度,但去掉方差很小特征所带的信息” 利用该性质能够实现噪音过滤

(1)导入数据并探索

from sklearn.datasets import load_digits   # 手写数字(本质是图像)
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

digits = load_digits()
digits.data.shape  #(1797, 64)
digits.images.shape  #(1797, 8, 8)  1797个数字,每个数字是8行8列的特征矩阵

set(digits.target.tolist())  #查看target有哪几个数  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
# digits.target是array
# .tolist()转成列表
# set()去重查看

(2)定义画图函数

# 定义画图函数
def plot_digits(data):
    #data的结构必须是(m,n),并且n=64要能够被分成(8,8)这样的结构
    fig, axes = plt.subplots(4,10  # 4行0-9
                             ,figsize=(10,4)
                             ,subplot_kw = {"xticks":[],"yticks":[]}
                            )
    for i, ax in enumerate(axes.flat):
        ax.imshow(data[i].reshape(8,8),cmap="binary")
        
plot_digits(digits.data)

(3)为数据加上噪音

# 为数据加上噪音
rng = np.random.RandomState(42)  # 规定numpy中的随机模式
 
#在指定的数据集中,随机抽取服从正态分布的数据
#两个参数,分别是指定的数据集,和抽取出来的正态分布的方差
#方差越大,随机抽取出的数字就会越凌乱
noisy = rng.normal(digits.data,2)   #np.random.normal(digits.data,2)
noisy.shape   # (1797,64)
 
plot_digits(noisy)

(4)降维

# 降维
pca = PCA(0.5,svd_solver='full').fit(noisy)  # 原数据信息能保留50%的特征
X_dr = pca.transform(noisy)
X_dr.shape  #(1797, 6)   # 把维度从64降到了6,认为含有噪音的大部分特征都被删掉了,前6个特征应该包含了原始数据的大部分有效特征
# 无法可视化X_dr,因为画图函数要求输入的data第二维是64(能够被分成(8,8))

(5)逆转降维结果,实现降噪

# 逆转降维结果,实现降噪
without_noise = pca.inverse_transform(X_dr)   # (1797,64)
plot_digits(without_noise)


PCA类的重要接口、参数和属性总结 

重要参数

  • n_components:降维后需要的特征数目k;鸢尾花高维数据可视化
  • svd_solver:控制生成的矩阵的结构;为什么PCA中有SVD相关的参数;sklearn中PCA和SVD联合降维的流程
  • random_state:控制SVD的参数中一些拥有随机矩阵分解模式的参数

重要属性

  • components_:调用新特征空间降维后的矩阵V(k,n)
  • explained_variance_:可解释性方差,衡量降维后每个特征所带的信息量
  • explained_variance_ratio_:可解释性方差贡献率,画图,选择最佳的n_components

重要接口

  • fit:拟合数据
  • transform:调取结果
  • fit_transform:拟合+调取结果一步完成
  • inverse_transform:人脸识别中的逆转;手写数字的噪音过滤


案例二:PCA对手写数字数据集的降维

回顾:特征工程章节中使用的手写数字数据集,结构为(42000,784) 

  • KNN准确率 0.966 > 随机森林 0.937,但KNN花费时间太长
  • 使用嵌入法 SelectFromModel 对数据集进行特征选择,选出324个特征,将随机森林的效果也调的接近于KNN了(0.964)
  • 试着用PCA处理该数据

【3 - 特征工程】菜菜sklearn机器学习_如何原谅奋力过但无声的博客-CSDN博客

(1)导入数据并探索

from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data = pd.read_csv(r"D:\Jupyter Notebook\菜菜sklearn\3 数据预处理和特征工程\digit recognizor.csv")
 
X = data.iloc[:,1:]
y = data.iloc[:,0]

X.shape  #(42000, 784)

降维之前要确定超参数n_components,若PCA()不填,则默认返回min(X.shape) 

(2)画累计方差贡献率曲线,找最佳降维后维度的范围

pca_line = PCA().fit(X)  # 默认是min(X.shape)=784
plt.figure(figsize=[20,5])   # 图像的尺寸
plt.plot(np.cumsum(pca_line.explained_variance_ratio_))   # 返回784个特征的方差贡献率
plt.xlabel("number of components after dimension reduction")  # 降维后的特征数目
plt.ylabel("cumulative explained variance ratio")  # 累计可解释性方差比率和
plt.show()

选转折点作为n_components,由图可以看到,1-100中必有一个值是想要的 

(3)降维后维度的学习曲线,继续缩小最佳维度的范围

PCA的参数 n_components 取不同值时,随机森林在交叉验证下的效果(使用降维后的特征矩阵)

score = []
for i in range(1,101,10):
    X_dr = PCA(i).fit_transform(X)  # 降维后的结果X_dr
    once = cross_val_score(RFC(n_estimators=10,random_state=0)  # 实例化的模型
                           ,X_dr,y,cv=5).mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(1,101,10),score)  # x轴和y轴的取值
plt.show()

可以看出,大概降到20维左右模型的效果最好,后面曲线几乎平了 

(4)细化学习曲线,找出降维后的最佳维度

score = []
for i in range(10,25):
    X_dr = PCA(i).fit_transform(X)
    once = cross_val_score(RFC(n_estimators=10,random_state=0),X_dr,y,cv=5).mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(10,25),score)
plt.show()

差不多21左右是最大值 

(5)导入找出的最佳维度进行降维,查看模型效果

X_dr = PCA(21).fit_transform(X)
cross_val_score(RFC(n_estimators=10,random_state=0),X_dr,y,cv=5).mean()  #0.9174523809523809

# n_estimators越大,泛化误差越小,模型精度上升
cross_val_score(RFC(n_estimators=100,random_state=0),X_dr,y,cv=5).mean() #0.9443333333333334

模型效果还好(0.944),但还是没有使用嵌入法特征选择后的 0.964 高。如何再提高模型表现?

(6)现在特征数量已经不足原来的3%,换模型如何?

在之前的建模过程中,因为计算量太大,所以一直使用随机森林,但事实上KNN效果比随机森林更好。KNN在未调参的状况下已经达到96.6%的准确率,而随机森林在未调参前只能达到93.7%,这是模型本身的限制带来的

现在特征数量已经降到不足原来的3%,换KNN看看效果如何

from sklearn.neighbors import KNeighborsClassifier as KNN
cross_val_score(KNN(),X_dr,y,cv=5).mean()  #KNN()的值不填写默认=5   0.9679761904761905

(7)KNN的k值学习曲线

score = []
for i in range(10):
    X_dr = PCA(21).fit_transform(X)
    once = cross_val_score(KNN(i+1),X_dr,y,cv=5).mean()   # KNN()中的参数最小是1
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(10),score)
plt.show()

可以看到,横坐标取2时效果最好,此时KNN的参数是2+1=3 

(8)定下超参数后,模型效果和运行时间如何?

cross_val_score(KNN(3),X_dr,y,cv=5).mean()  #KNN()的值不填写默认=5

%%timeit
cross_val_score(KNN(3),X_dr,y,cv=5).mean()

原本784列的特征被缩减到21列之后,用KNN跑出了目前为止这个数据集上最好的结果0.968 

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

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

相关文章

为何香港的IB状元特别多?

今年IB预科课程(The International Baccalaureate Diploma Programme,IBDP)公开考试放榜,香港的学校又是大丰收的一年!因为香港今年一共有九十三名IB状元,即IB的总分为四十五分满分,而他们全部取…

Linux 环境部署 Nexus 服务

一 私服是什么? 一个特殊的远程仓库,它是架设在局域网内的仓库服务,供局域网内的开发人员使用。 当Maven需要下载构建的使用, 它先从私服请求,如果私服上没有的话,则从外部的远程仓库下载,然后…

算力服务亟待破局,超聚变向新而行

“超聚变已独立活下来。”超聚变产品线总裁范瑞琦在2023新品发布会上透露。自从一年多前从华为体系独立,超聚变公司的未来就颇受业界关注。一方面,算力产业蒸蒸日上,各方尤为关注超聚变的产业定位以及发展算力产业的着力点;另一方…

mysql存储过程的流程控制

本文来说下mysql存储过程的流程控制语句 文章目录流程控制概述IF语句CASE语句LOOP语句LEAVE语句ITERATE语句REPEAT语句WHILE语句本文小结流程控制概述 存储过程中可以使用流程控制来控制语句的执行。 MySQL中可以使用IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPE…

Cesium设置模型朝向速度矢量方向

Cesium设置模型朝向速度矢量方向 文章目录Cesium设置模型朝向速度矢量方向1. 需求场景2. 技术路线2.1 VelocityOrientationProperty2.2 VelocityVectorProperty3. 参考链接1. 需求场景 现有一段飞机起飞、爬升的轨迹数据,需要在Cesium中模拟出飞行过程动画&#xf…

Lesson 3. 线性回归的手动实现(3.3 线性回归手动实现与模型局限 3.4 机器学习模型结果可信度理论与交叉验证基础)

文章目录一、线性回归手动实现与模型局限1. 线性回归的手动实现2. 线性回归模型局限3. 线性回归的决定系数二、机器学习模型结果可信度理论与交叉验证基础1. 机器学习模型结果可信度理论基础与数据集划分1.1 机器学习模型结果可信度基础理论1.2 数据集切分方法1.3 线性回归手动…

图的关键路径(AOE网络)

文章目录AOE网概念性质研究的问题关键路径概念求解的方法注意事项AOE网 概念 用顶点表示事件, 边弧表示活动, 边弧上的权值表示活动持续的时间, 这样的带权有向无环图叫AOE网. AOE网常用于估算工程完成时间. AOE网和AOV网都是有向无环图, 不同之处在于它们的边和顶点所代表的…

【青训营】Go的高质量编程

Go的高质量编程 本文内容总结自字节跳动青年训练营 第五届 后端组 什么是高质量? 各种边界条件是否完备异常情况能正常处理,稳定性有保障易读易维护 Go语言开发者Dave Cheney指出,编程需要遵循以下原则: 简单性 消除多余的复…

Docker安装和卸载教程

1、安装前先卸载系统上原有的Docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、安装需要的yum-utils包 需要安装 yum-utils包(该包提供了 yum-c…

研一寒假C++复习笔记--程序的内存模型

目录 1--内存分区模型 2--代码区 3--全局区 4--栈区 5--堆区 6--new操作符 1--内存分区模型 执行C程序时,内存可划分为4个区域,不同区域存放的数据,具有不同的生命周期; ① 代码区:存放函数的二进制代码&#x…

nvcc 编译并行程序时报错gcc: error trying to exec ‘cc1plus‘: execvp: 没有那个文件或目录

一、nvcc 编译程序时报错 gcc: error trying to exec cc1plus: execvp: 没有那个文件或目录 cc1plus 是gcc编译工具链中用到的一个程序 报错非常直白,就是说gcc在执行时找不到这个程序 二、问题解决方法 1.确定是否正确安装gcc、g 如果系统中没有正确安装gcc…

elementUI组件下拉框属性的一些配合使用

文章目录1、单选带搜索功能(自定义搜索)2、下拉多选远程搜索3、下拉多选有默认选项4、下拉多选默认禁用只提供大致思路,大量玩法等你开发【doge】 1、单选带搜索功能(自定义搜索) 例如,我需要实现一个功能…

关于学习的一些建议

本文的主要讲的内容如图👇 文末附有整个Java的学习路线、能力提升和学习建议的思维导图。 快过新年了!在过去的一年里,你们收获了什么呢?在未来的一年里,你们有什么新目标吗? 1.定目标 过去的我往往喜欢…

初识 Django

初识 Django参考描述优劣 Django(部分)优势功能完备,开箱即用开发效率高Admin 管理后台安全ORM可扩展劣势性能模板过渡封装获取长期支持版(Long Time Support,LTS)PIP官网获取检测MVC 与 MVTMVC 架构MTV 架…

力扣sql基础篇(十一)

力扣sql基础篇(十一) 1 每件商品的最新订单 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 SELECT p.product_name,o1.product_id,o1.order_id,o1.order_date FROM Orders o1 INNER JOIN ( SELECT pro…

Android自定义绘制1-1 Plus

上一个文章是看着扔物线的视频写的。写玩之后,发现他的文章还有很多内容。尴尬。 接着写呗。 自定义绘制知识的4个级别 1.Canvas的drawXXX()系列方法以及Paint类的一些常见方法。 canvas的drawXXX()是自定义绘制的最基本操作。掌握了这些方法,才知道…

JNPF 3.4.5 java+.Net6 旗舰版企业版 简搭-敏捷业务低代码开发平台

JNPF 低代码通常是指APaaS产品,通过为开发者提供可视化的应用开发环境,降低或去除应用开发对原生代码编写的需求量,进而实现便捷构建应用程序的一种解决方案。广义上低代码概念涵盖所有能够完成代码的集成,减少代码开发的应用过程…

在哔站黑马程序员学习Spring—Spring Framework—(二)spring的注解开发学习笔记

一、注解开发spring的强项—>简化开发spring从2.0开始逐步提供了各种各样的注解,到了2.5注解比较完善,到了3.0推出了纯注解开发,使用java类替代配置文件,开启了spring快速开发通道。二、注解开发定义bean不再需要在spring配置文件中定义be…

拷贝实体的工具类---BeanObjectCopyUtils

目录 前言: 第一步:引用的核心类: 第一种:单个实体的拷贝方法 第二种:列表类的实体拷贝方法 第二步:核心方法的介绍: 核心方法一,介绍了实例化的操作: 核心方法二…

CMMI之项目管理类

项目管理类过程域涵盖了与项目的计划、监督和控制相关的项目管理活动。CMMI-DEV 中的七个项目管理类过程域是:• 集成项目管理(Integrated Project Management, IPM)• 项目监督与控制(Project Monitoring and Control…