一、说明
虽然可以通过更改优化算法来加快机器学习算法的拟合速度,但加快算法速度的更常用方法是使用主成分分析 (PCA)。如果您的学习算法由于输入维度太高而太慢,那么使用 PCA 加速它可能是一个合理的选择。这可能是PCA最常见的应用。PCA 的另一个常见应用是数据可视化。
二、PCA简述
2.1 什么是PCA?
主成分分析(PCA)是一种降低数据维数的方法,用于改进数据可视化和加快机器学习模型训练。
为了了解使用 PCA 进行数据可视化的价值,本教程文章的第一部分介绍了应用 PCA 后 Iris 数据集的基本可视化。第二部分探讨如何使用 PCA 在修改后的国家标准与技术研究院 (MNIST) 数据集上加速机器学习算法(逻辑回归)。有了这个,让我们开始吧。
2.2 用于数据可视化的 PCA
对于许多机器学习应用程序,它有助于可视化数据。可视化二维或三维数据并不具有挑战性。但是,即使是本教程这一部分中使用的 Iris 数据集也是四维的。您可以使用 PCA 将该四维数据简化为二维或三维,以便您可以绘制并希望更好地理解数据。
有关数据科学的更多信息 如何使用 Z 表并创建自己的 Z 表
第 1 步: 加载鸢尾花数据集
鸢尾花数据集附带scikit-learn,不需要您从某些外部网站下载任何文件。下面的代码将加载鸢尾花数据集。
import pandas as pd
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
# load dataset into Pandas DataFrame
df = pd.read_csv(url, names=['sepal length','sepal width','petal length','petal width','target'])
步骤 2:标准化数据
PCA 受缩放的影响,因此需要在应用 PCA 之前缩放数据中的要素。用于帮助您将数据集的特征标准化为单位比例(和),这是许多机器学习算法获得最佳性能的要求。如果不缩放数据,可能会对算法产生负面影响。StandardScalermean = 0variance = 1
from sklearn.preprocessing import StandardScaler
features = ['sepal length', 'sepal width', 'petal length', 'petal width']
# Separating out the features
x = df.loc[:, features].values
# Separating out the target
y = df.loc[:,['target']].values
# Standardizing the features
x = StandardScaler().fit_transform(x)
第 3 步:PCA 投影到 2D
原始数据有四列(萼片长度、萼片宽度、花瓣长度和花瓣宽度)。在本节中,代码将四维原始数据投影到二维中。降维后,通常没有为每个主成分分配特定的含义。新组件只是变化的两个主要维度。
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(x)
principalDf = pd.DataFrame(data = principalComponents
, columns = ['principal component 1', 'principal component 2'])
finalDf = pd.concat([principalDf, df[['target']]], axis = 1)
沿 连接数据帧。 是绘制数据之前的最后一个数据帧。
步骤 4:可视化 2D 投影
本节只是绘制二维数据。请注意,在下图中,这些类似乎彼此分离得很好。
fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1)
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
colors = ['r', 'g', 'b']
for target, color in zip(targets,colors):
indicesToKeep = finalDf['target'] == target
ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']
, finalDf.loc[indicesToKeep, 'principal component 2']
, c = color
, s = 50)
ax.legend(targets)
ax.grid()
2.3 解释方差
解释的方差告诉您有多少信息(方差)可以归因于每个主成分。这很重要,因为虽然您可以将四维空间转换为二维空间,但这样做会丢失一些方差(信息)。通过使用属性 ,您可以看到第一个主成分包含 72.77% 的方差,第二个主成分包含 23.03% 的方差。这两个组件共同包含 95.80% 的信息。
explained_variance_ratio_
pca.explained_variance_ratio_
三、PCA 加速机器学习算法
虽然还有其他方法可以加速机器学习算法,但一种不太常见的方法是使用 PCA。在本节中,我们不使用 Iris 数据集,因为它只有 150 行和 784 个特征列。手写数字的MNIST数据库更合适,因为它有784个特征列(60个维度),一个000,10个示例的训练集和一个000,<>个示例的测试集。
3.1 步骤 1 :下载并加载数据
您还可以添加参数以更改下载数据的位置。data_homefetch_mldata
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784')
您下载的图像包含在 (70000, 784) 中,形状为 (70, 000),这意味着有 784,784 张具有 <> 个维度(<> 个要素)的图像。mnist.data
标签(整数 0–9)包含在 中。特征为 784 维(28 x 28 图像),标签为 0–9 之间的数字。mnist.target
3.2 步骤 2:将数据拆分为训练集和测试集
下面的代码执行训练测试拆分,将 6/7 的数据放入训练集中,将 1/7 的数据放入测试集中。
from sklearn.model_selection import train_test_split
# test_size: what proportion of original data is used for test set
train_img, test_img, train_lbl, test_lbl = train_test_split( mnist.data, mnist.target, test_size=1/7.0, random_state=0)
3.3 步骤 3:标准化数据
这一段中的文字几乎是之前所写内容的精确副本。PCA 受比例影响,因此您需要在应用 PCA 之前缩放数据中的要素。您可以将数据转换为单位比例(和),这是许多机器学习算法获得最佳性能的要求。 帮助标准化数据集的功能。适合训练集,转换训练集和测试集。mean = 0variance = 1StandardScaler
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# Fit on training set only.
scaler.fit(train_img)
# Apply transform to both the training set and the test set.
train_img = scaler.transform(train_img)
test_img = scaler.transform(test_img)
3.4 步骤 4:导入并应用 PCA
请注意,下面的代码包含 .95 的组件数参数。这意味着scikit-learn选择主成分的最小数量,以便保留95%的方差。
from sklearn.decomposition import PCA
# Make an instance of the Model
pca = PCA(.95)
在训练集上安装 PCA。您只是在训练集上拟合 PCA。
pca.fit(train_img)
您可以使用 了解拟合模型后 PCA 有多少个分量。在本例中,95% 的差异等于 330 个主成分。pca.n_components_
3.5 步骤 5:将映射(转换)应用于训练集和测试集。
train_img = pca.transform(train_img)
test_img = pca.transform(test_img)
3.6 步骤 6:将逻辑回归应用于转换后的数据
1. 导入要使用的模型。
在sklearn中,所有机器学习模型都作为Python类实现。
2. 创建模型的实例。
# all parameters not specified are set to their defaults
# default solver is incredibly slow which is why it was changed to 'lbfgs'
logisticRegr = LogisticRegression(solver = 'lbfgs')
3. 在数据上训练模型,存储从数据中学到的信息。
该模型正在学习数字和标签之间的关系。
logisticRegr.fit(train_img, train_lbl)
4. 预测新数据(新图像)的标签。
这部分使用模型在模型训练过程中学到的信息。下面的代码预测了一个观察结果。
# Predict for One Observation (image)
logisticRegr.predict(test_img[0].reshape(1,-1))
下面的代码一次预测多个观测值。
# Predict for One Observation (image)
logisticRegr.predict(test_img[0:10])
3.7 步骤 7:测量模型性能
虽然准确性并不总是机器学习算法的最佳指标(精度、召回率、F1 分数、ROC 曲线等会更好),但为了简单起见,这里使用它。
logisticRegr.score(test_img, test_lbl)
四、测试 PCA 后拟合逻辑回归的时间
本教程的这一部分的全部目的是展示您可以使用 PCA 来加速机器学习算法的拟合。下表显示了使用 PCA 后在 MacBook 上拟合逻辑回归所需的时间(每次保留不同的方差量)。
五、从压缩表示进行图像重建
本教程前面的部分演示了如何使用 PCA 将高维数据压缩为低维数据。但是 PCA 也可以获取数据的压缩表示形式(低维数据),并将其返回到原始高维数据的近似值。如果您有兴趣,可以使用 重现 this code 下图。
我本可以在这篇文章中写更多关于PCA的文章,因为它有许多不同的用途。但我希望这对您正在从事的任何任务都有帮助。