听见涛声_数说张小桃

日拱一卒 | 梳理、沉淀、数据科学家踩坑之路 | 努力成为数据分析领域python最强的人

导航

scikit-learn中PCA降维的使用方法

 

一 函数:

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

(1)参数说明:

n_components

意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n
类型:int 、float 或者 string,缺省时默认为None,所有成分被保留。

  • 赋值为int,比如 n_components = 1,将把原始数据降到一个维度。
  • 赋值为string,比如 n_components = 'mle',将根据最大似然估计自动选取特征个数n,使得满足所要求的方差百分比。
  • n_components的取值还可以是0-1之间的浮点数,这就表示希望保留的信息量的比例。比如,设置 n_components= 0.95 就表示希望保留95%的信息量,那么PCA就会自动选使得信息量>=95%的特征数量。但在设置n_components为浮点数的同时,需设置参数 svd_solver=‘full’。

copy

类型:bool,True或者False,缺省时默认为True。
意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不 会有任何改变,因为是在原始数据的副本上进行运算;若为默认False,则运行PCA算法后,原始训练数据的 值会改,因为是在原始数据上进行降维计算。

whiten

类型:bool,缺省时默认为False

意义:白化,使得每个特征具有相同的方差。关于“白化”,可参考:Ufldl教程

 

二、PCA对象属性:

n_components_返回所要保留的主成分个数n。

components_ :返回降维后所保留的各主成分方向,并按照各主成分的方差值大小排序。即返回保留下来的模型的各个特征向量。

explained_variance_:返回 降维后所保留的n个成分各自的方差。
explained_variance_ratio_:返回 降维后所保留的n个成分各自的方差占总方差值(含未保留成分部分)的百分比。比例越大,则越主要。(即可解释性方差贡献率,也就是降维后保留的每个新特征信息量占原始数据信息量的比例)。
mean_
noise_variance_

 

三、PCA对象方法:

  • fit(X,y=None)

fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。

fit(X),表示用数据X来训练PCA模型。

函数返回值:调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练。

  • transform(X)

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

  • fit_transform(X)

用X来训练PCA模型,同时返回降维后的数据。
newX=pca.fit_transform(X),newX就是降维后的数据。

  • inverse_transform()

将降维后的数据转换成原始数据,X=pca.inverse_transform(newX)

此外,还有get_covariance()、get_precision()、get_params(deep=True)、score(X, y=None)等方法,以后用到再补充吧。

 

四、for example

 

'''
一、数据集
'''
from sklearn.datasets import load_iris
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
print("数组维度:", X.shape)  # 二维数组
iris_dataFrame = pd.DataFrame(X)  # 四维特征矩阵
print("特征矩阵:\n", iris_dataFrame)

 输出结果:

数组维度: (150, 4)
特征矩阵:
        0    1    2    3
0    5.1  3.5  1.4  0.2
1    4.9  3.0  1.4  0.2
2    4.7  3.2  1.3  0.2
3    4.6  3.1  1.5  0.2
4    5.0  3.6  1.4  0.2
..   ...  ...  ...  ...
145  6.7  3.0  5.2  2.3
146  6.3  2.5  5.0  1.9
147  6.5  3.0  5.2  2.0
148  6.2  3.4  5.4  2.3
149  5.9  3.0  5.1  1.8

[150 rows x 4 columns]

 

 

'''
二、调用PCA建
'''

from sklearn.decomposition import PCA
pca = PCA(n_components=None)  # n_components设置降维后的特征数,默认None则保留所有成分
pca.fit(X)  # 拟合

print('保留的主成分个数:' ,pca.n_components_)
print('保留的特征向量:\n',pca.components_)
print('保留的n个主成分各自方差:\n',pca.explained_variance_)

print('保留的n个主成分对原始数据信息累计解释的贡献率:\n',np.cumsum(pca.explained_variance_ratio_))

输出结果:

保留的主成分个数: 4
保留的特征向量:
 [[ 0.36138659 -0.08452251  0.85667061  0.3582892 ]
 [ 0.65658877  0.73016143 -0.17337266 -0.07548102]
 [-0.58202985  0.59791083  0.07623608  0.54583143]
 [-0.31548719  0.3197231   0.47983899 -0.75365743]]
保留的n个主成分各自方差:
 [4.22824171 0.24267075 0.0782095  0.02383509]
保留的n个主成分对原始数据信息累计解释的贡献率:
 [0.92461872 0.97768521 0.99478782 1.        ]

 

 

'''
2.1 根据以上分析,保留前2个成分,信息损失仅2%
试着直接设置 n_components =2 看看

'''
# 

pca = PCA(n_components=2)  # n_components设置降维后的特征数
pca.fit(X)  # 拟合
pca_new = pca.transform(X) #获取新矩阵

print(pca_new)

输出结果:(150, 2)可以确定,降维后的数据确实为2个特征

降维后数组维度: (150, 2)
降维后的数组:
[[-2.68412563  0.31939725]
 [-2.71414169 -0.17700123]
 [-2.88899057 -0.14494943]
 [-2.74534286 -0.31829898]
 [-2.72871654  0.32675451]
 [-2.28085963  0.74133045]
...

[ 2.41874618  0.3047982 ]
 [ 1.94410979  0.1875323 ]
 [ 1.52716661 -0.37531698]
 [ 1.76434572  0.07885885]
 [ 1.90094161  0.11662796]
 [ 1.39018886 -0.28266094]]

 

 

'''
2.2 设置n_components ='mle',用最大似然估计自定义主成分个数看看效果
'''

pca = PCA(n_components='mle')  # n_components设置降维后的特征数
pca.fit(X)  # 拟合

print('保留的主成分个数:' ,pca.n_components_)
print('保留的特征向量:\n' ,pca.components_)
print('保留的%i个主成分各自方差:\n' %pca.n_components_,pca.explained_variance_)

print('保留的%i个主成分对原始数据信息累计解释的贡献率:\n' %pca.n_components_,np.cumsum(pca.explained_variance_ratio_))

输出结果:可以看最大似然估计判断选取3个成分是最佳的取值。因为选3个原始信息的获取量可以达到很好的效果(99%+信息量)

保留的主成分个数: 3
保留的特征向量:
 [[ 0.36138659 -0.08452251  0.85667061  0.3582892 ]
 [ 0.65658877  0.73016143 -0.17337266 -0.07548102]
 [-0.58202985  0.59791083  0.07623608  0.54583143]]
保留的3个主成分各自方差:
 [4.22824171 0.24267075 0.0782095 ]
保留的3个主成分对原始数据信息累计解释的贡献率:
 [0.92461872 0.97768521 0.99478782]

 

 

'''
2.3 设置 n_components =0.95 损失不超过5%的原始数据信息,看看效果
'''
pca = PCA(n_components=0.95)  # n_components设置降维后的特征数
pca.fit(X)  # 拟合

print('保留的主成分个数:' ,pca.n_components_)
print('保留的特征向量:\n',pca.components_)
print('保留的%i个主成分各自方差:\n' %pca.n_components_ ,pca.explained_variance_)

print('保留的%i个主成分对原始数据信息累计解释的贡献率:\n'%pca.n_components_ ,np.cumsum(pca.explained_variance_ratio_))

输出结果:可以看出,新数据选了2个成分,且信息量占比可以达到97%+,满足>=95%

保留的主成分个数: 2
保留的特征向量:
 [[ 0.36138659 -0.08452251  0.85667061  0.3582892 ]
 [ 0.65658877  0.73016143 -0.17337266 -0.07548102]]
保留的2个主成分各自方差:
 [4.22824171 0.24267075]
保留的2个主成分对原始数据信息累计解释的贡献率:
 [0.92461872 0.97768521]

 

 

【参考】

【1】为什么要降维

【2】降维原理

【3】PCA降维实现

【4】PCA中n_components(主成分数)的设置

 

【5】PCA降维的原理、方法、以及sklearn实现

 

【6】PCA(主成分分析法)原理以及应用+python 代码实现 

【7】【博客园】 Python机器学习笔记:主成分分析(PCA)算法【博主总结的不错,其它也值得看看】

 

【8】PCA算法原理(讲解非常清楚)

【9】知乎【机器学习】降维——PCA(非常详细)

 

posted on 2022-04-25 18:12  数说张小桃  阅读(1909)  评论(0编辑  收藏  举报