Scikit 使用 PCA 学习降维


降维,一种无监督的机器学习方法,用于减少每个数据样本选择主要特征集的特征变量的数量。主成分分析 (PCA) 是一种流行的降维算法。

精确主成分分析


主成分分析(PCA)用于线性降维,使用数据的奇异值分解(SVD)将其投射到一个较低维度的空间。在使用PCA进行分解时,在应用SVD之前,输入数据被居中,但没有对每个特征进行缩放。

Scikit-learn ML库提供了sklearn.Decomposition.PCA模块,它被实现为一个转化器对象,在其fit()方法中学习了n个组件。它也可以用在新数据上,将其投射到这些分量上。

from pandas import read_csv
from sklearn.decomposition import PCA
path = r'C:\Users\Leekha\Desktop\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', ‘class']
dataframe = read_csv(path, names = names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
pca = PCA(n_components = 5)
fit = pca.fit(X)
print(("Explained Variance: %s") % (fit.explained_variance_ratio_))
print(fit.components_)
Explained Variance: [0.88854663 0.06159078 0.02579012 0.01308614 0.00744094]
[
    [-2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-029.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03]
    [-2.26488861e-02 -9.72210040e-01 -1.41909330e-01 5.78614699e-029.46266913e-02 -4.69729766e-02 -8.16804621e-04 -1.40168181e-01]
    [-2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-012.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01]
    [-4.90459604e-02 1.19830016e-01 -2.62742788e-01 8.84369380e-01-6.55503615e-02 1.92801728e-01 2.69908637e-03 -3.01024330e-01]
    [ 1.51612874e-01 -8.79407680e-02 -2.32165009e-01 2.59973487e-01-1.72312241e-04 2.14744823e-02 1.64080684e-03 9.20504903e-01]
]

增量 PCA


增量主成分分析(IPCA)用于解决主成分分析(PCA)的最大局限性,即PCA只支持批量处理,意味着所有要处理的输入数据都要适合内存。

Scikit-learn ML库提供了sklearn.decomposition.IPCA模块,该模块使得实现核外PCA成为可能,它可以通过在顺序获取的数据块上使用partial_fit方法,或者通过启用np.memmap(一个内存映射的文件),而无需将整个文件加载到内存。

与PCA相同,在使用IPCA进行分解时,在应用SVD之前,对输入数据进行居中处理,但不对每个特征进行缩放。

下面的例子将在Sklearn数字数据集上使用sklearn.Decomposition.IPCA模块。

from sklearn.datasets import load_digits
from sklearn.decomposition import IncrementalPCA
X, _ = load_digits(return_X_y = True)
transformer = IncrementalPCA(n_components = 10, batch_size = 100)
transformer.partial_fit(X[:100, :])
X_transformed = transformer.fit_transform(X)
X_transformed.shape
(1797, 10)

在这里,我们可以在较小的一批数据上进行部分拟合(就像我们在每批100个数据上做的那样),或者你可以让fit()函数把数据分成几批。

内核主成分分析


内核主成分分析是PCA的扩展,使用内核实现了非线性降维。它同时支持变换反变换

Scikit-learn ML库提供sklearn.Decomposition.KernelPCA模块。

下面的例子将在Sklearn数字数据集上使用sklearn.Decomposition.KernelPCA模块,我们正在使用sigmoid核。

from sklearn.datasets import load_digits
from sklearn.decomposition import KernelPCA
X, _ = load_digits(return_X_y = True)
transformer = KernelPCA(n_components = 10, kernel = 'sigmoid')
X_transformed = transformer.fit_transform(X)
X_transformed.shape
(1797, 10)

使用随机 SVD 的 PCA


使用随机SVD的主成分分析(PCA)被用来将数据投射到低维空间,通过丢弃与低奇异值相关的成分的奇异向量来保留大部分的方差。在这里,带有可选的参数svd_solver='randomized'sklearn.decomposition.PCA模块将非常有用。

下面的例子将使用sklearn.decomposition.PCA模块和可选参数svd_solver='randomized'来从Pima Indians Diabetes数据集中找到最佳的7个主成分。

from pandas import read_csv
from sklearn.decomposition import PCA
path = r'C:\Users\Leekha\Desktop\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names = names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
pca = PCA(n_components = 7,svd_solver = 'randomized')
fit = pca.fit(X)
print(("Explained Variance: %s") % (fit.explained_variance_ratio_))
print(fit.components_)
Explained Variance: [8.88546635e-01 6.15907837e-02 2.57901189e-02 1.30861374e-027.44093864e-03 3.02614919e-03 5.12444875e-04]
[
    [-2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-029.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03]
    [-2.26488861e-02 -9.72210040e-01 -1.41909330e-01 5.78614699e-029.46266913e-02 -4.69729766e-02 -8.16804621e-04 -1.40168181e-01]
    [-2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-012.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01]
    [-4.90459604e-02 1.19830016e-01 -2.62742788e-01 8.84369380e-01-6.55503615e-02 1.92801728e-01 2.69908637e-03 -3.01024330e-01]
    [ 1.51612874e-01 -8.79407680e-02 -2.32165009e-01 2.59973487e-01-1.72312241e-04 2.14744823e-02 1.64080684e-03 9.20504903e-01]
    [-5.04730888e-03 5.07391813e-02 7.56365525e-02 2.21363068e-01-6.13326472e-03 -9.70776708e-01 -2.02903702e-03 -1.51133239e-02]
    [ 9.86672995e-01 8.83426114e-04 -1.22975947e-03 -3.76444746e-041.42307394e-03 -2.73046214e-03 -6.34402965e-03 -1.62555343e-01]
]