PCA là một công cụ giảm kích thước, không phải là phân loại. Trong Scikit-Learn, tất cả các trình phân loại và ước tính đều có một predict
phương thức mà PCA không áp dụng . Bạn cần phải phù hợp với trình phân loại trên dữ liệu được chuyển đổi PCA. Scikit-Learn có nhiều phân loại. Dưới đây là một ví dụ về việc sử dụng cây quyết định trên dữ liệu được chuyển đổi PCA. Tôi đã chọn trình phân loại cây quyết định vì nó hoạt động tốt với dữ liệu có nhiều hơn hai lớp, đó là trường hợp với bộ dữ liệu 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 có một công cụ tiện lợi có tên Pipeline cho phép bạn xâu chuỗi các máy biến áp và bộ phân loại cuối cùng:
# 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)
Điều này đặc biệt hữu ích khi thực hiện xác thực chéo vì nó ngăn bạn vô tình điều chỉnh lại BẤT K step bước nào của đường ống trên tập dữ liệu thử nghiệm của bạn:
from sklearn.cross_validation import cross_val_score
print cross_val_score(pipe, iris.data, iris.target)
# [ 0.96078431 0.90196078 1. ]
Nhân tiện, bạn thậm chí có thể không cần sử dụng PCA để có kết quả phân loại tốt. Bộ dữ liệu mống mắt không có nhiều thứ nguyên và cây quyết định sẽ hoạt động tốt trên dữ liệu chưa được truyền.