Classification
將 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 數據集沒有很多維度,決策樹已經在未轉換的數據上表現良好。