我最近了解了精彩的 PCA 并且我已经完成了scikit-learn 文档中概述的示例。
我很想知道如何将 PCA 应用于新数据点以进行分类。
在二维平面(x,y 轴)中可视化 PCA 后,我发现我可能可以画一条线来分隔数据点,以便一侧属于一个分类,另一侧属于另一个分类。如何绘制此“边界”并将其应用于新数据点?
我最近了解了精彩的 PCA 并且我已经完成了scikit-learn 文档中概述的示例。
我很想知道如何将 PCA 应用于新数据点以进行分类。
在二维平面(x,y 轴)中可视化 PCA 后,我发现我可能可以画一条线来分隔数据点,以便一侧属于一个分类,另一侧属于另一个分类。如何绘制此“边界”并将其应用于新数据点?
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 应用于新数据,则必须首先在某个训练数据集上拟合模型。你会问什么型号?这是您从数据集中减去的平均向量、用于“白化”每个数据向量的方差和学习的映射矩阵。因此,为了将新数据集映射到与训练数据相同的空间中,您首先要减去均值,对其进行白化,然后将其与映射矩阵进行映射。