本文向您展示了如何使用scikit-learn工具来降低PCA维度。内容简洁易懂,一定会让你眼前一亮。希望通过这篇文章的详细介绍,你能有所收获。
1.sci工具包介绍-学习PC类。
在scikit-learn中,PCA相关的类都在sklearn.decomposition包中。最常用的PCA类是sklearn.decomposition.PCA,我们将主要基于这个类来讲解如何使用它。
除了PCA类,最常用的PCA相关类是KernelPCA类,主要用于非线性数据的降维,需要内核技能。因此,需要选择合适的核函数,并调整核函数的参数。
另一个常见的PCA相关类是IncrementalPCA,主要用于解决单台计算机的内存限制。有时候我们的样本量可能是几百万,维度可能是几千,所以直接拟合数据可能会爆内存。此时,我们可以通过使用IncrementalPCA类来解决这个问题。IncrementalPCA首先将数据分成若干批,然后对每一批依次调用partial_fit函数,从而逐步获得样本的最终最优降维。
此外,还提供了SparsePCA和MiniBatchSparsePCA。它们与上面提到的PCA的主要区别是使用了L1正则化,可以将很多非主成分的影响程度降低到0。因此,当主成分分析降维时,我们只需要对那些相对主要的成分进行降维,从而避免了噪声等因素对我们主成分分析降维的影响。SparsePCA和MiniBatchSparsePCA的区别在于,MiniBatchSparsePCA通过使用一些样本特征和给定的迭代次数来降低PCA的维数,从而解决了大样本下特征分解速度慢的问题。当然代价是PCA降维的精度可能会降低。SparsePCA和MiniBatchSparsePCA的使用需要调整L1正则化参数。
2.sklearn.decomposition.pca参数介绍。
下面主要基于sklearn.decomposition.PCA来说明如何使用scikit-learn进行PCA降维。a类基本不需要参数调整。一般来说,我们只需要指定我们需要降维到的维度,或者我们希望降维后的主成分方差占原始维度中所有特征方差和的比值阈值。
现在我们将介绍sklearn . declaration . PCA的主要参数:
1)n_components:这个参数可以帮助我们指定PCA降维后的特征维数。最常用的方法是直接指定要减少的维数,其中n_components是大于或等于1的整数。当然,我们也可以指定主成分的方差和最小比例阈值,让PCA类根据样本特征的方差来决定降维的维数。此时,n_components是一个介于(0,1)之间的数字。当然,我们也可以将参数设置为‘MLE’。此时,PCA类会根据特征的方差分布,使用mle算法选择一定数量的主成分特征。我们也可以使用默认值,即不输入n_components,其中n_components=min(样本数、特征数)。
2)美白:确定是否进行美白。白化意味着在降维之后归一化数据的每个特征,使得方差为1。一般来说,主成分分析本身的降维不需要白化。如果PCA降维后有后续的数据处理动作,可以考虑白化。默认值为False,即不执行白化。
3)svd_solver:是指定svd的方法。由于特征分解是奇异值分解的特例,一般的主成分分析库都是基于奇异值分解的。有4个可选值:{'auto ',' full ',' arpack ',' random ' }。随机化一般适用于数据量大、数据维数多、主成分比例低的PCA降维。它使用一些随机算法来加速奇异值分解。Full是传统意义上的SVD,它使用了scipy库的相应实现。arpack和随机化的适用场景相似。不同的是,随机化使用scikit-learn自己的SVD实现,而arpack直接使用scipy库的稀疏SVD实现。默认为Auto,即PCA类会在上述三种算法中自行权衡,选择合适的SVD算法进行降维。一般来说,使用默认值就足够了。
除了这些输入参数,还有两个PCA类的成员值得关注。首先是explained _ variance,表示降维后主成分的方差。方差值越大,主成分越重要。二是explained _ variation _ ratio _,表示降维后各主成分的方差值与总方差值的比值。比值越大,主成分越重要。
主成分分析的例子。
让我们用一个例子来学习PCA在scikit-learn中的使用。为了便于可视化,让大家有一个直观的了解,我们这里用三维数据来降维。
首先,我们生成随机数据并将其可视化。代码如下:
将numpy作为np导入
将matplotlib.pyplot导入为plt
来自mpl_toolkits.mplot3d impor
t Axes3D
%matplotlib inline
from sklearn.datasets.samples_generator import make_blobs
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本3个特征,共4个簇
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)
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')
三维数据的分布图如下:
我们先不降维,只对数据进行投影,看看投影后的三个维度的方差分布,代码如下:
from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
输出如下:
[ 0.98318212 0.00850037 0.00831751]
[ 3.78483785 0.03272285 0.03201892]
可以看出投影后三个特征维度的方差比例大约为98.3%:0.8%:0.8%。投影后第一个特征占了绝大多数的主成分比例。
现在我们来进行降维,从三维降到2维,代码如下:
pca = PCA(n_components=2)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
输出如下:
[ 0.98318212 0.00850037]
[ 3.78483785 0.03272285]
这个结果其实可以预料,因为上面三个投影后的特征维度的方差分别为:[ 3.78483785 0.03272285 0.03201892],投影到二维后选择的肯定是前两个特征,而抛弃第三个特征。
为了有个直观的认识,我们看看此时转化后的数据分布,代码如下:
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()
输出的图如下:
可见降维后的数据依然可以很清楚的看到我们之前三维图中的4个簇。
现在我们看看不直接指定降维的维度,而指定降维后的主成分方差和比例。
pca = PCA(n_components=0.95)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_
我们指定了主成分至少占95%,输出如下:
[ 0.98318212]
[ 3.78483785]
1
可见只有第一个投影特征被保留。这也很好理解,我们的第一个主成分占投影特征的方差比例高达98%。只选择这一个特征维度便可以满足95%的阈值。我们现在选择阈值99%看看,代码如下:
pca = PCA(n_components=0.99)
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_
此时的输出如下:
[ 0.98318212 0.00850037]
[ 3.78483785 0.03272285]
2
这个结果也很好理解,因为我们第一个主成分占了98.3%的方差比例,第二个主成分占了0.8%的方差比例,两者一起可以满足我们的阈值。
最后我们看看让MLE算法自己选择降维维度的效果,代码如下:
pca = PCA(n_components='mle')
pca.fit(X)
print pca.explained_variance_ratio_
print pca.explained_variance_
print pca.n_components_
输出结果如下:
[ 0.98318212]
[ 3.78483785]
1
可见由于我们的数据的第一个投影特征的方差占比高达98.3%,MLE算法只保留了我们的第一个特征。
上述内容就是怎么使用scikit-learn工具来进行PCA降维,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/65919.html