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降维实现
【6】PCA(主成分分析法)原理以及应用+python 代码实现
【7】【博客园】 Python机器学习笔记:主成分分析(PCA)算法【博主总结的不错,其它也值得看看】
【9】知乎【机器学习】降维——PCA(非常详细)