2015-09-30 29 views
5

Bước 0: Mô tả sự cố

Tôi có một vấn đề phân loại, tức là tôi muốn để dự đoán một mục tiêu nhị phân dựa trên một tập hợp các tính năng số, sử dụng hồi quy logistic, và sau khi chạy một Phân tích thành phần chính (PCA).phân loại: PCA và hồi quy logistic sử dụng sklearn

Tôi có 2 bộ dữ liệu: df_traindf_valid (bộ huấn luyện và xác thực được đặt tương ứng) làm khung dữ liệu gấu trúc, chứa các đối tượng địa lý và mục tiêu. Bước đầu tiên, tôi đã sử dụng chức năng pandas get_dummies để chuyển đổi tất cả các biến phân loại thành boolean. Ví dụ, tôi sẽ có:

n_train = 10 
np.random.seed(0) 
df_train = pd.DataFrame({"f1":np.random.random(n_train), \ 
         "f2": np.random.random(n_train), \ 
         "f3":np.random.randint(0,2,n_train).astype(bool),\ 
         "target":np.random.randint(0,2,n_train).astype(bool)}) 

In [36]: df_train 
Out[36]: 
     f1  f2  f3 target 
0 0.548814 0.791725 False False 
1 0.715189 0.528895 True True 
2 0.602763 0.568045 False True 
3 0.544883 0.925597 True True 
4 0.423655 0.071036 True True 
5 0.645894 0.087129 True False 
6 0.437587 0.020218 True True 
7 0.891773 0.832620 True False 
8 0.963663 0.778157 False False 
9 0.383442 0.870012 True True 

n_valid = 3 
np.random.seed(1) 
df_valid = pd.DataFrame({"f1":np.random.random(n_valid), \ 
         "f2": np.random.random(n_valid), \ 
         "f3":np.random.randint(0,2,n_valid).astype(bool),\ 
         "target":np.random.randint(0,2,n_valid).astype(bool)}) 

In [44]: df_valid 
Out[44]: 
     f1  f2  f3 target 
0 0.417022 0.302333 False False 
1 0.720324 0.146756 True False 
2 0.000114 0.092339 True True 

Tôi muốn hiện nay để áp dụng một PCA để giảm chiều của vấn đề của tôi, sau đó sử dụng LogisticRegression từ sklearn để đào tạo và nhận được dự đoán trên tập hợp kiểm chứng của tôi, nhưng tôi không chắc chắn các thủ tục tôi làm theo là chính xác. Dưới đây là những gì tôi làm:

Bước 1: PCA

Ý tưởng là tôi cần phải thay đổi cả đào tạo và xác nhận của tôi thiết lập cùng một cách với PCA. Nói cách khác, tôi có thể không thực hiện riêng PCA. Nếu không, chúng sẽ được chiếu trên các eigenvectors khác nhau.

from sklearn.decomposition import PCA 

pca = PCA(n_components=2) #assume to keep 2 components, but doesn't matter 
newdf_train = pca.fit_transform(df_train.drop("target", axis=1)) 
newdf_valid = pca.transform(df_valid.drop("target", axis=1)) #not sure here if this is right 

Bước 2: Logistic Regression

Đó là không cần thiết, nhưng tôi thích để giữ cho mọi thứ như dataframe:

features_train = pd.DataFrame(newdf_train) 
features_valid = pd.DataFrame(newdf_valid) 

Và bây giờ tôi thực hiện hồi quy logistic

from sklearn.linear_model import LogisticRegression 
cls = LogisticRegression() 
cls.fit(features_train, df_train["target"]) 
predictions = cls.predict(features_valid) 

tôi nghĩ rằng bước 2 là chính xác, nhưng tôi có nhiều nghi ngờ hơn về bước 1: đây có phải là cách tôi phải chuỗi PCA, sau đó là một trình phân loại?

+0

Tôi không thấy bất kỳ vấn đề nào với quy trình. Điều gì về kết quả của bạn? Bạn có nhận được kết quả mong đợi không? – Riyaz

+0

Một trong những hành vi bất ngờ trên dữ liệu của tôi (khác với ví dụ được hiển thị ở đây) là khi tôi tăng số lượng thành phần trong hàm PCA, ma trận nhầm lẫn của tôi trở nên tồi tệ hơn! Ngoài ra, tôi đã tự hỏi nếu "dummifying" quá nhiều biến phân loại không có bất kỳ ảnh hưởng đến kết quả? Tôi có nên loại trừ cột "mục tiêu" trong PCA không? – ldocao

+3

Mục tiêu không phải là một phần dữ liệu của bạn. Vì vậy, loại trừ các nhãn mục tiêu trong khi sử dụng PCA. Đối với dữ liệu phân loại, bạn nên sử dụng một biểu diễn nóng được thực hiện trong sklearn. – Riyaz

Trả lời

2

Có một số pipeline trong sklearn cho mục đích này.

from sklearn.decomposition import PCA 
from sklearn.linear_model import LogisticRegression 
from sklearn.pipeline import Pipeline 

pca = PCA(n_components=2) 
cls = LogisticRegression() 

pipe = Pipeline([('pca', pca), ('logistic', clf)]) 
pipe.fit(features_train, df_train["target"]) 
predictions = pipe.predict(features_valid) 
+0

'clf' là gì? đó là một lỗi đánh máy? – guy

+0

Yup, phải là 'cls'. – Mooncrater

Các vấn đề liên quan