【笔记】scikit-learn中的PCA(真实数据集)
sklearn中的PCA(真实的数据集)
(在notebook中)
加载好需要的内容,手写数字数据集
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
digits = datasets.load_digits()
X = digits.data
y = digits.target
首先对数据集进行分割
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)
相应的在X_train中用shape可以看出来,其中有1347个样本,每个样本有64个特征
结果如下

我们用KNN来训练,引入方法,进行初始化以后进行fit
%%time
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train,y_train)
结果如下

看一下这样的准确度是多少
knn_clf.score(X_test,y_test)
结果如下

这就是我们使用全部的数据集进行训练以后进行识别得到的结果
然后我们尝试用sklearn中的PCA来进行降维
引入并进行实例化,维度设置为2,然后进行fit操作,传入以后就可以得到X_train_reduction(对训练数据集降维以后的结果),同样,对测试数据集一样进行降维
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)
这样就可以生成一个新的KNN识别器,同样的操作以后
%%time
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_reduction,y_train)
结果如下

可以发现计算的时间降低了非常多,这就是对于高维数据来说,将其降维到低维以后将会大大的节省计算的时间
那么我们再来看一下这个识别器的精度如何
knn_clf.score(X_test_reduction,y_test)
结果如下

可以发现,这个精度降低了很多,这不是能接受的,这样就有了一个矛盾,速度提升了许多但是同时精度也降低了很多,很显然两维太低了,那么我们怎么找到好一些的维度数呢,在pca中有pca.explained_variance_ratio_,这个数据就告诉我们维持的方差,那么想要方差维持最大,这就可以找到
pca.explained_variance_ratio_
结果如下(这个意思就是有两个比例,一个0.14上下,一个0.13上下,其就是两个轴,第一个轴可以解释原数据的14.5%的方差,第二个可以解释原数据13.7%的方差,也就是这个二维一共包含了方差的28%上下,剩下的全部都丢失了)

那么我们怎么找呢
首先实例一下pca,然后传入训练数据集对应的特征数,然后进行fit操作,并打印出
pca.explained_variance_ratio_
pca = PCA(n_components=X_train.shape[1])
pca.fit(X_train)
pca.explained_variance_ratio_
结果如下(这就是对于主成分来说,依次的可以解释的方差是多少,这就可以表示成每一个轴的重要程度)

这里我们做一个折线图,横轴是维度,纵轴是前i个轴解释的方差的和
plt.plot([i for i in range(X_train.shape[1])],
[np.sum(pca.explained_variance_ratio_[:i+1]) for i in range(X_train.shape[1])])
图像如下(通过这个图就可以看出来相应的需要的维度数以及重要程度)

在sklearn中的PCA,如果说希望数据保持95%以上的信息,可以直接传入一个0到1的数字,即就是解释多少的方差,然后进行fit
pca = PCA(0.95)
pca.fit(X_train)
结果如下

使用pca.n_components_看一下需要多少的维度
结果如下(即28个维度就可以保持95%以上)

这时候来运行一下,同时看一下要多长时间
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)
%%time
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train_reduction,y_train)
结果如下

同时我们看一下这个准确度如何
knn_clf.score(X_test_reduction,y_test)
结果如下

可以说这样的操作比全样本快,精确度虽然低,这是可以接受的,有时候是可以牺牲精度来换取时间的
将数据降到二维也不是说一点用没有,其还可以进行可视化
pca = PCA(n_components=2)
pca.fit(X)
X_reduction = pca.transform(X)
X_reduction.shape
结果如下

此时就可以对数据进行绘制
for i in range(10):
plt.scatter(X_reduction[y==i,0],X_reduction[y==i,1],alpha=0.8)
结果如下

可以发现,有些数据到了二维也有很好的区分度,那么如果要使用这种数据的话,实际上用二维也是可以的

【笔记】scikit-learn中的PCA(真实数据集)的更多相关文章
- (原创)(三)机器学习笔记之Scikit Learn的线性回归模型初探
一.Scikit Learn中使用estimator三部曲 1. 构造estimator 2. 训练模型:fit 3. 利用模型进行预测:predict 二.模型评价 模型训练好后,度量模型拟合效果的 ...
- (原创)(四)机器学习笔记之Scikit Learn的Logistic回归初探
目录 5.3 使用LogisticRegressionCV进行正则化的 Logistic Regression 参数调优 一.Scikit Learn中有关logistics回归函数的介绍 1. 交叉 ...
- Scikit Learn: 在python中机器学习
转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...
- 在SCIKIT中做PCA 逆运算 -- 新旧特征转换
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- 在SCIKIT中做PCA 逆变换 -- 新旧特征转换
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)
scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...
- Python机器学习笔记 使用scikit-learn工具进行PCA降维
之前总结过关于PCA的知识:深入学习主成分分析(PCA)算法原理.这里打算再写一篇笔记,总结一下如何使用scikit-learn工具来进行PCA降维. 在数据处理中,经常会遇到特征维度比样本数量多得多 ...
- sklearn中调用PCA算法
sklearn中调用PCA算法 PCA算法是一种数据降维的方法,它可以对于数据进行维度降低,实现提高数据计算和训练的效率,而不丢失数据的重要信息,其sklearn中调用PCA算法的具体操作和代码如下所 ...
- 从头开始学JavaScript 笔记(一)——基础中的基础
原文:从头开始学JavaScript 笔记(一)--基础中的基础 概要:javascript的组成. 各个组成部分的作用 . 一.javascript的组成 javascript ECMASc ...
随机推荐
- Linux(CentOS)下安装docker
Linux(CentOS)安装Docker 查看当前内核版本 [docker@localhost ~]$ uname -r 确保yum包更新到最新 [docker@localhost ~]$ sudo ...
- Redis的并发竞争问题,你用哪些方案来解决?
Redis的并发竞争问题,主要是发生在并发写竞争. 考虑到redis没有像db中的sql语句,update val = val + 10 where ...,无法使用这种方式进行对数据的更新. 假如有 ...
- 【故障公告】redis 服务器宕机引发博客站点故障
非常抱歉,今天下午 17:10~17:40 左右,由于博客系统所使用的 redis 服务器宕机,造成博客站点无法正常访问,由此给您带来很大的麻烦,请您谅解. 我们会针对这次故障改进 redis 服务器 ...
- 谷粒商城--分布式基础篇(P1~P27)
谷粒商城--分布式基础篇P1~P27 去年3月份谷粒商城分布式基础.进阶.高级刚出的时候就开始学了,但是中途因为一些事就中断了,结果一直到现在才有时间重新开始学,看到现在网上这么多人都学完了,确实感觉 ...
- c++ vector用法详解
1. 定义: 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)可以认为是一个动态数组,其中一个vector中的所有对象都必须是同一种类型的. 2. 构造函 ...
- Java基础00-基础语法3
1. 注释 1.1 注释概述 1.2 注释分类 1.3 示例 2. 关键字 2.1 关键字概述 2.2 关键字的特点 3. 常量 3.1 常量的概述 3.2 常量分类 以上常量除了空常量都是可以直接输 ...
- final修饰符(2)
final局部变量 系统不会对局部变量进行初始化,局部变量必须又程序员显示初始化,因此使用final修饰局部变量,可以在声明时指定默认值,也可以在后面的代码中对该final变量赋初始值,但只能赋值一次 ...
- 【LeetCode】560. 和为K的子数组
560. 和为K的子数组 知识点:数组:前缀和: 题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 输入:nums = [1,1,1], k = 2 ...
- AntDesignBlazor 学习笔记
AntDesignBlazor是基于 Ant Design 的 Blazor 实现,开发和服务于企业级后台产品.我的 Blazor Server 学习就从这里开始,有问题可以随时上 Blazor 中文 ...
- odoo前后端交互详解
为了简单叙述,暂时不考虑多个db的情况(主要是懒得说没有db或者多个db实例的情况)当odoo指定数据库开启服务时(也就是odoo-bin -d <some_db_name> ),我们使用 ...