2015-09-30 19 views
5

Krok 0: Opis problemu

mam problem klasyfikacji, czyli chcę przewidywać binarny cel w oparciu o zbiór cech liczbowych za pomocą regresji logistycznej, a po uruchomieniu Analiza głównych składowych (PCA).klasyfikacja: PCA i regresji logistycznej używając sklearn

Mam 2 zestawy danych: df_train i df_valid (odpowiednio zestaw treningowy i zestaw sprawdzania poprawności) jako ramka danych pand, zawierającą funkcje i cel. Jako pierwszy krok użyłem funkcji pandy, aby przekształcić wszystkie zmienne kategoryczne na boolean. Na przykład, chciałbym mieć:

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 

chciałbym teraz zastosować PCA zmniejszenie wymiarowości mojego problemu, a następnie użyć LogisticRegression z sklearn trenować i uzyskać prognozy na mój zestaw walidacji, ale nie jestem upewnij się, że procedura którą obserwuję jest prawidłowa. Oto co mam zrobić:

Krok 1: PCA

Chodzi o to, że trzeba przekształcić zarówno mój trening i walidacja ustawić ten sam sposób z PCA. Innymi słowy, mogę nie wykonać PCA oddzielnie. W przeciwnym razie będą wyświetlane na różnych wektorach własnych.

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 

Krok 2: Regresja logistyczna

To nie jest konieczne, ale wolę zachować rzeczy jak dataframe:

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

I teraz wykonać regresji logistycznej

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

I uważam, że krok 2 jest poprawny, ale mam więcej wątpliwości na temat kroku 1: jest to sposób, w jaki powinienem łączyć PCA, a następnie klasyfikator?

+0

Nie widzę problemu z procedurą. A co z twoimi wynikami? Czy otrzymujesz oczekiwany wynik? – Riyaz

+0

Jednym z nieoczekiwanych zachowań na moich danych (innych niż tutaj pokazany przykład) jest to, że gdy zwiększam liczbę składników w funkcji PCA, moja matryca jest coraz gorsza! Zastanawiałem się również, czy "dummifying" zbyt wiele zmiennych kategorialnych nie ma żadnego wpływu na wyniki? Czy powinienem wykluczyć kolumnę "docelową" podczas PCA? – ldocao

+3

Cel nie jest częścią Twoich danych. Wyklucz etykiety docelowe podczas korzystania z PCA. W przypadku danych kategorycznych powinieneś użyć jednej gorącej reprezentacji zaimplementowanej w sklearn. – Riyaz

Odpowiedz

2

W tym celu dostępna jest sklejka pipeline.

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

co to jest "clf"? czy to literówka? – guy

+0

Tak, powinno być 'cls'. – Mooncrater

Powiązane problemy