📜  使用 scikit-learn 在Python中实现 PCA

📅  最后修改于: 2022-05-13 01:54:20.610000             🧑  作者: Mango

使用 scikit-learn 在Python中实现 PCA

在本文中,我们将使用 scikit-learn 了解Python中的 PCA(主成分分析)。让我们一步一步开始我们的学习。

为什么选择 PCA?

  • 当输入属性很多时,很难将数据可视化。机器学习领域有一个非常著名的术语“维度诅咒”。
  • 基本上,它指的是数据集中更多的属性会对机器学习模型的准确性和训练时间产生不利影响。
  • 主成分分析 (PCA) 是解决此问题的一种方法,用于更好的数据可视化和提高准确性。

PCA 是如何工作的?

  • PCA 是一项无监督的预处理任务,在应用任何 ML 算法之前执行。 PCA 基于“正交线性变换”,这是一种将数据集的属性投影到新坐标系上的数学技术。描述最大方差的属性称为第一主成分并放置在第一个坐标处。
  • 类似地,在描述方差方面排名第二的属性称为第二主成分,依此类推。简而言之,完整的数据集可以用主成分来表示。通常,超过 90% 的方差由两个/三个主成分解释。
  • 因此,主成分分析或 PCA 通过选择最重要的属性来捕获有关数据集的最大信息,从而将数据从高维空间转换为低维空间。

Python实现:

  • 要在 Scikit 学习中实现 PCA,在应用 PCA 之前必须对数据进行标准化/规范化。
  • PCA 从 sklearn.decomposition 导入。我们需要选择所需数量的主成分。
  • 通常,n_components 被选择为 2 以获得更好的可视化,但它很重要并且取决于数据。
  • 通过 fit 和 transform 方法,传递属性。
  • 可以使用components_检查主成分的值,而可以使用explained_variance_ratio计算每个主成分解释的方差。

1. 导入所有库

Python3
# import all libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler


Python3
#import the breast _cancer dataset
from sklearn.datasets import load_breast_cancer
data=load_breast_cancer()
data.keys()
 
# Check the output classes
print(data['target_names'])
 
# Check the input attributes
print(data['feature_names'])


Python3
# construct a dataframe using pandas
df1=pd.DataFrame(data['data'],columns=data['feature_names'])
 
# Scale data before applying PCA
scaling=StandardScaler()
 
# Use fit and transform method
scaling.fit(df1)
Scaled_data=scaling.transform(df1)
 
# Set the n_components=3
principal=PCA(n_components=3)
principal.fit(Scaled_data)
x=principal.transform(Scaled_data)
 
# Check the dimensions of data after PCA
print(x.shape)


Python3
# Check the values of eigen vectors
# prodeced by principal components
principal.components_


Python3
plt.figure(figsize=(10,10))
plt.scatter(x[:,0],x[:,1],c=data['target'],cmap='plasma')
plt.xlabel('pc1')
plt.ylabel('pc2')


Python3
# import relevant libraries for 3d graph
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,10))
 
# choose projection 3d for creating a 3d graph
axis = fig.add_subplot(111, projection='3d')
 
# x[:,0]is pc1,x[:,1] is pc2 while x[:,2] is pc3
axis.scatter(x[:,0],x[:,1],x[:,2], c=data['target'],cmap='plasma')
axis.set_xlabel("PC1", fontsize=10)
axis.set_ylabel("PC2", fontsize=10)
axis.set_zlabel("PC3", fontsize=10)


Python3
# check how much variance is explained by each principal component
print(principal.explained_variance_ratio_)


2. 加载数据

从 sklearn.datasets 加载 Breast_cancer 数据集。很明显,该数据集有 569 个数据项,具有 30 个输入属性。有两个输出类别——良性和恶性。由于 30 个输入特征,无法可视化这些数据

蟒蛇3

#import the breast _cancer dataset
from sklearn.datasets import load_breast_cancer
data=load_breast_cancer()
data.keys()
 
# Check the output classes
print(data['target_names'])
 
# Check the input attributes
print(data['feature_names'])

输出:

3.应用PCA

  • 标准化 之前的数据集 主成分分析。
  • 从 sklearn.decomposition 导入 PCA。
  • 选择主成分的数量。

让我们选择它为3。执行这段代码后,我们知道x的维数是(569,3),而实际数据的维数是(569,30)。因此,很明显,使用 PCA,维度数从 30 减少到 3。如果我们选择 n_components=2,维度将减少到 2。

蟒蛇3

# construct a dataframe using pandas
df1=pd.DataFrame(data['data'],columns=data['feature_names'])
 
# Scale data before applying PCA
scaling=StandardScaler()
 
# Use fit and transform method
scaling.fit(df1)
Scaled_data=scaling.transform(df1)
 
# Set the n_components=3
principal=PCA(n_components=3)
principal.fit(Scaled_data)
x=principal.transform(Scaled_data)
 
# Check the dimensions of data after PCA
print(x.shape)

输出:

(569,3)

4. 检查组件

principal.components_ 提供了一个数组,其中行数表示主成分数,而列数等于实际数据中的特征数。我们可以很容易地看到,当 n_components 被选择为 3 时,有 3 行。然而,在实际数据中,每行有 30 列。

蟒蛇3

# Check the values of eigen vectors
# prodeced by principal components
principal.components_

5. 绘制组件(可视化)

绘制主成分以实现更好的数据可视化。尽管我们采用了 n_components =3,但这里我们分别使用前两个主成分和 3 个主成分绘制了 2d 图和 3d 图。对于三个主成分,我们需要绘制一个 3d 图。颜色显示了原始数据集的 2 个输出类别——良性和恶性。很明显,主成分在两个输出类别之间表现出明显的分离。

蟒蛇3

plt.figure(figsize=(10,10))
plt.scatter(x[:,0],x[:,1],c=data['target'],cmap='plasma')
plt.xlabel('pc1')
plt.ylabel('pc2')

输出:

对于三个主成分,我们需要绘制一个 3d 图。 x[:,0] 表示第一个主成分。类似地,x[:,1] 和 x[:,2] 表示第二和第三个主成分。

蟒蛇3

# import relevant libraries for 3d graph
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10,10))
 
# choose projection 3d for creating a 3d graph
axis = fig.add_subplot(111, projection='3d')
 
# x[:,0]is pc1,x[:,1] is pc2 while x[:,2] is pc3
axis.scatter(x[:,0],x[:,1],x[:,2], c=data['target'],cmap='plasma')
axis.set_xlabel("PC1", fontsize=10)
axis.set_ylabel("PC2", fontsize=10)
axis.set_zlabel("PC3", fontsize=10)

输出:

6. 计算方差比

Explained_variance_ratio 提供了主成分解释了多少变化的概念。

蟒蛇3

# check how much variance is explained by each principal component
print(principal.explained_variance_ratio_)

输出:

array([0.44272026, 0.18971182, 0.09393163])