Fork me on GitHub

Sklearn库中使用PCA

本文中介绍的是如何在sklearn库中使用PCA方法,以及理解PCA方法中的几个重要参数的含义,通过一个案例来加深理解。

image-20200616173135528

PCA

什么是PCA

主成分分析(Principal components analysis,简称PCA)的思想:

  • 将n维特征映射到k维上(k<n),k维是全新的正交特征(新的坐标系)。

  • k维特征称为主元,是重新构造出来的k维特征,而不是简单地从n维特征中去除其余n-k维特征。

  • 思想的方法就是降维,用低维的数据去代表高维的数据,也就是用少数几个变量代替原有的数目庞大的变量.

  • 把重复的信息合并起来,既可以降低现有变量的维度,又不会丢失重要信息的思想。

Sklearn库中PCA

解释sklearn库中PCA方法的参数、属性和方法。

参数说明

1
sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)
n_components

int, float, None or str

代表返回的主成分的个数,即数据降到几维

  • n_components=2 代表返回前2个主成分
  • 0 < n_components < 1 代表满足最低的主成分方差累计贡献率
  • n_components=0.98,指返回满足主成分方差累计贡献率达到98%的主成分
  • n_components=None,返回所有主成分
  • n_components=‘mle’,将自动选取主成分个数n,使得满足所要求的方差百分比
copy

bool类型, False/True 默认是True

在运行的过程中,是否将原数据复制。降维过程中,数据会变动。copy主要影响:调用显示降维后的数据的方法不同。

  • copy=True时,直接 fit_transform(X),就能够显示出降维后的数据
  • copy=False时,需要 fit(X).transform(X) ,才能够显示出降维后的数据
whiten

bool类型,False/True 默认是False

白化是一种重要的预处理过程,其目的是降低输入数据的冗余性,使得经过白化处理的输入数据具有如下性质:

  • 特征之间相关性较低

  • 所有特征具有相同的方差

svd_solver

str类型,str {‘auto’, ‘full’, ‘arpack’, ‘randomized’}

意义:定奇异值分解 SVD 的方法

  • auto:自动选择
  • full:传统意义上的SVD
  • arpack:直接使用scipy库的sparse SVD实现
  • randomized:适用于数据量大,维度多,且主成分比例低的PCA降维

属性atttibutes

  • components_:返回最大方差的主成分。

  • explained_variance_:它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。

  • explained_variance_ratio_:它代表降维后的各主成分的方差值占总方差值的比例,比例越大,则越是重要的主成分。(主成分方差贡献率)

  • singular_values_:返回所被选主成分的奇异值。实现降维的过程中,有两个方法:

    • 特征值分解(需要是方阵,限制多,计算量大)
    • 奇异值分解(任意矩阵,计算量小,PCA默认)
  • mean_:每个特征的经验平均值,由训练集估计。

  • n_features_:训练数据中的特征数。

  • n_samples_:训练数据中的样本数量。

  • noise_variance_:噪声协方差

方法Methods

fit(self,X,Y=None)

模型训练,PCA是无监督学习,没有标签,所以Y是None

fit_transform(self,X,Y=None)

将模型和X进行训练,并对X进行降维处理,返回的是降维后的数据

get_covariance(self)

获得协方差数据

get_params(self,deep=True)

返回的是模型的参数

inverse_transform(self,X)

将降维后的数据转成原始数据,不一定完全相同

transform(X)

将数据X转成降维后的数据。当模型训练好后,对于新输入的数据,可以直接用transform方法来降维。

案例分析

1
2
3
4
5
6
7
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline

# 导入数据
from sklearn.datasets.samples_generator import make_blobs

导入数据作图

学习如何利用sklearn自带的数据

1
2
3
4
5
6
# 生成数据集
X,y = make_blobs(n_samples=10000,
n_features=3,
centers=[[3,3,3],[0,0,0],[1,1,1,],[2,2,2]],
cluster_std=[0.2,0.1,0.2,0.2],
random_state=9)
1
X
array([[ 2.38526096,  2.1109917 ,  2.23765695],
       [ 0.05761939, -0.0117989 , -0.03393958],
       [ 3.08207073,  3.19904227,  3.08774759],
       ...,
       [ 3.13804869,  2.86955308,  2.86443838],
       [ 2.95413001,  3.42508432,  3.28296407],
       [ 2.79195132,  2.94196066,  2.71457256]])
1
y
array([3, 1, 0, ..., 0, 0, 0])
1
2
3
fig = plt.figure()
ax = Axes3D(fig,rect=[0,0,1,1],elev=30,azim=20)
plt.scatter(X[:,0],X[:,1],X[:,2],marker='o')

NFIftU.png

使用的数据有4个簇

查看方差分布(不降维

不降维,只对数据进行投影,保留3个属性

1
2
3
from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)
PCA(copy=True, iterated_power='auto', n_components=3, random_state=None,
    svd_solver='auto', tol=0.0, whiten=False)

2个属性

查看两个重要的属性:

  • 各个主成分的方差占比
  • 主成分的方差
1
2
print(pca.explained_variance_ratio_)  # 降维后的各主成分的方差值占总方差值的比例
print(pca.explained_variance_) # 降维后的各主成分的方差值
1
2
[0.98318212 0.00850037 0.00831751]   # 第一个特征占据绝大多数
[3.78521638 0.03272613 0.03202212]

结论:特征1占据绝大多数

降维处理

从3维降到2维,指定n_components=2.

1
2
3
4
5
6
pca = PCA(n_components=2)  # 降到2维
pca.fit(X)

# 查看属性
print(pca.explained_variance_ratio_)
print(pca.explained_variance_)
[0.98318212 0.00850037]
[3.78521638 0.03272613]

NFTkrR.png

1
2
3
4
# 查看转化后的数据分布
new_X = pca.transform(X) # 转化后的数据
plt.scatter(new_X[:,0],new_X[:,1],marker="o")
plt.show() # 显示的仍然是4个簇

NFIb0x.png

将数据投影到平面上仍然是4个簇

指定主成分占比

比如,想看主成分的占比在99%以上的特征

1
2
pca = PCA(n_components=0.99)  # 指定阈值占比
pca.fit(X)
1
2
PCA(copy=True, iterated_power='auto', n_components=0.99, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
1
2
3
print(pca.explained_variance_ratio_)
print(pca.explained_variance_)
print(pca.n_components_)
1
2
3
[0.98318212 0.00850037]
[3.78521638 0.03272613]
2

第1个特征 和第2个特征之和为:0.9831+0.0085已经超过99%

MLE算法自行选择降维维度

1
2
pca = PCA(n_components='mle')
pca.fit(X)
1
2
PCA(copy=True, iterated_power='auto', n_components='mle', random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
1
2
3
print(pca.explained_variance_ratio_)
print(pca.explained_variance_)
print(pca.n_components_)
1
2
3
[0.98318212]
[3.78521638]
1

第一个特征的占比已经高达98.31%,所以算法只保留了第1个特征

参考

sklearn-PCA

降维-PCA

刘建平-用scikit-learn学习主成分分析

本文标题:Sklearn库中使用PCA

发布时间:2020年06月16日 - 17:06

原始链接:http://www.renpeter.cn/2020/06/16/Sklearn%E5%BA%93%E4%B8%AD%E4%BD%BF%E7%94%A8PCA.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea