上一篇文章中,以鸢尾花数据集分类问题为例,实现了PCA降维后的分类和可视化,本节继续介绍PCA的属性和参数,并介绍如何通过探索属性返回值,找到合适的参数。

0、加载数据集

from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import pandas as pd

iris = load_iris()
x = iris.data
y = iris.target

1、属性探索

# PCA(n_components=None) 默认取样本数量和特征数量的最小值
pca = PCA().fit(x)
# 查看降维后,每个特征向量上信息量的大小(方差大小)
print(pca.explained_variance_)
# 查看降维后,每个特征向量信息量占原信息量的百分比
# 也可解释为方差贡献率
print(pca.explained_variance_ratio_)

2、绘制方差贡献率曲线

由图可以得出n=2时,累计信息量就已经接近98%,可以确定PAC()最佳n值为2

import matplotlib.pyplot as plt
import numpy as np

ratios = pca.explained_variance_ratio_
plt.plot(range(1,len(ratios)+1), np.cumsum(ratios))
plt.xticks(range(1,len(ratios)+1))
plt.show()

3、最大似然估计自选超参数

除了以上绘制方差贡献率曲线确定最佳n值外,PCA类还可以传递最大似然估计自选超参数。

pca_mle = PCA(n_components="mle")
pca_mle.fit(x)
x_dr = pca_mle.transform(x)
# mle为我们选择了三个特征
print(x_dr.shape) #(150, 3)
# 0.994,得到了比设定两个特征时更高的信息量
print(pca_mle.explained_variance_ratio_.sum())

4、按信息量占比选超参数

出入[0,1]范围内的浮点数,并且让参数svd_solver='full',表示希望降维后的总解释性方差占比大于n_components的值。

pca_f = PCA(0.97, svd_solver='full')
pca_f.fit(x)
x_dr = pca_f.transform(x)
# 0.977 (150,2) 最终保留两个综合特征,就达到了97%以上的信息量
print(pca_f.explained_variance_ratio_.sum())
print(x_dr.shape)

本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/read/275