Classification

將 PCA 應用於測試數據以進行分類

  • April 1, 2015

我最近了解了精彩的 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 數據集沒有很多維度,決策樹已經在未轉換的數據上表現良好。

引用自:https://stats.stackexchange.com/questions/144439

comments powered by Disqus