Áp dụng PCA để kiểm tra dữ liệu cho mục đích phân loại


10

Gần đây tôi đã biết về PCA tuyệt vời và tôi đã thực hiện ví dụ được nêu trong tài liệu tìm hiểu scikit .

Tôi muốn biết làm thế nào tôi có thể áp dụng PCA cho các điểm dữ liệu mới cho mục đích phân loại.

Sau khi trực quan hóa PCA trong mặt phẳng 2 chiều (trục x, y), tôi thấy rằng tôi có thể vẽ một đường để phân tách các điểm dữ liệu sao cho một bên sẽ thuộc một phân loại và một bên là phân loại khác. Làm cách nào để tôi vẽ "ranh giới" này và áp dụng điều này cho các điểm dữ liệu mới?


3
PCA không phải là một bộ phân loại, nhưng có thể đặt các quan sát mới vào PCA giả sử các biến tương tự được sử dụng để "khớp" PCA được đo trên các điểm mới. Sau đó, bạn chỉ cần đặt các điểm mới vào tổng trọng số của điểm số biến (tải), trọng số được cung cấp bởi dữ liệu. Điều đó nói rằng, việc tự ý vẽ một dòng qua PCA của bạn có vẻ không phải là một lựa chọn tốt của phân loại đối với tôi ...
Tái lập lại Monica - G. Simpson

Câu trả lời:


16

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 predictphươ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.


6
Có lẽ điều quan trọng cần lưu ý là PCA thể hữu ích ngay cả khi kích thước không bị giảm. Bạn có thể có một bộ dữ liệu về chiều và các hướng phân biệt là những hướng tương ứng với phương sai tối đa. Bạn giữ kích thước nhưng cơ sở là khác nhau. Ánh xạ dữ liệu của bạn trên các cơ sở mới đó sẽ giúp phân biệt các lớp tốt hơn so với cơ sở ban đầu. dd
Vladislavs Dovgalecs

@xeon Tôi không biết điều đó.
Austin Richardson

Có lẽ tốt hơn để xem nếu bạn tưởng tượng PCA là một vòng quay. Nếu dữ liệu của bạn có thuộc tính này sao cho các lớp có thể bị phân biệt bởi phương sai, thì phép quay này sẽ là tất cả những gì bạn cần.
Vladislavs Dovgalecs

2
@xeon: Khi tất cả các kích thước được giữ, điều duy nhất mà PCA đạt được là giải mã bộ dữ liệu. Nó thực sự có thể có lợi cho một số phân loại, nhưng đại đa số không quan tâm.
amip nói rằng Phục hồi lại

1
@amoeba Tôi hoàn toàn đồng ý, đây chỉ là một chi tiết nhỏ. Tôi đã phải đối phó với tập dữ liệu cụ thể như vậy và luôn nhớ bài học đó.
Vladislavs Dovgalecs

0

Nếu bạn muốn áp dụng PCA cho dữ liệu mới, trước tiên bạn phải phù hợp với một mô hình trên một số tập dữ liệu đào tạo. Mô hình bạn sẽ hỏi là gì? Đây là vectơ trung bình bạn đã trừ khỏi tập dữ liệu, phương sai bạn đã sử dụng để "làm trắng" từng vectơ dữ liệu và ma trận ánh xạ đã học. Vì vậy, để ánh xạ tập dữ liệu mới trong cùng một không gian với dữ liệu huấn luyện, trước tiên bạn trừ đi giá trị trung bình, làm trắng nó và ánh xạ nó với ma trận ánh xạ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.