PCA是降维工具,而不是分类器。在Scikit-Learn中,所有分类器和估计器都有PCA没有的predict
方法。您需要在PCA转换后的数据上安装分类器。Scikit-Learn有许多分类器。这是在PCA转换的数据上使用决策树的示例。我选择了决策树分类器,因为它适用于两个以上类别的数据,虹膜数据集就是这种情况。
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 learning有一个名为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即可获得良好的分类结果。虹膜数据集没有很多维,并且决策树在未转换的数据上已经表现良好。