将 PCA 应用于测试数据以进行分类

机器算法验证 分类 主成分分析 scikit-学习
2022-03-09 03:30:59

我最近了解了精彩的 PCA 并且我已经完成了scikit-learn 文档中概述的示例。

我很想知道如何将 PCA 应用于新数据点以进行分类。

在二维平面(x,y 轴)中可视化 PCA 后,我发现我可能可以画一条线来分隔数据点,以便一侧属于一个分类,另一侧属于另一个分类。如何绘制此“边界”并将其应用于新数据点?

2个回答

PCA 是一种降维工具,而不是分类器。在 Scikit-Learn 中,所有分类器和估计器都有一个PCA 没有predict的方法您需要在 PCA 转换的数据上拟合分类器。Scikit-Learn 有很多分类器。这是在 PCA 转换数据上使用决策树的示例。我选择了决策树分类器,因为它适用于具有两个以上类别的数据,而 iris 数据集就是这种情况。

from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

# load data
iris = load_iris()

# initiate PCA and classifier
pca = PCA()
classifier = DecisionTreeClassifier()

# transform / fit

X_transformed = pca.fit_transform(iris.data)
classifier.fit(X_transformed, iris.target)

# predict "new" data
# (I'm faking it here by using the original data)

newdata = iris.data

# transform new data using already fitted pca
# (don't re-fit the pca)
newdata_transformed = pca.transform(newdata)

# predict labels using the trained classifier

pred_labels = classifier.predict(newdata_transformed)

SciKit learn 有一个名为Pipeline的便捷工具,它可以让您将转换器和最终分类器链接在一起:

# you can make this a lot easier using Pipeline

from sklearn.pipeline import Pipeline

# fits PCA, transforms data and fits the decision tree classifier
# on the transformed data
pipe = Pipeline([('pca', PCA()),
                 ('tree', DecisionTreeClassifier())])

pipe.fit(iris.data, iris.target)

pipe.predict(newdata)

这在进行交叉验证时特别有用,因为它可以防止您意外地在测试数据集上重新拟合管道的任何步骤:

from sklearn.cross_validation import cross_val_score
print cross_val_score(pipe, iris.data, iris.target)
# [ 0.96078431  0.90196078  1.        ]

顺便说一句,您甚至可能不需要使用 PCA 来获得良好的分类结果。iris 数据集没有很多维度,决策树已经在未转换的数据上表现良好。

如果要将 PCA 应用于新数据,则必须首先在某个训练数据集上拟合模型。你会问什么型号?这是您从数据集中减去的平均向量、用于“白化”每个数据向量的方差和学习的映射矩阵。因此,为了将新数据集映射到与训练数据相同的空间中,您首先要减去均值,对其进行白化,然后将其与映射矩阵进行映射。