2015-09-30 5 views
5

Schritt 0: Problembeschreibung

ich ein Klassifikationsproblem habe, also ich mag ein binäres Ziel vorherzusagen auf einer Sammlung von numerischen Funktionen basieren, logistische Regression, und nach einer Lauf Hauptkomponentenanalyse (PCA).Klassifizierung: PCA und logistische Regression sklearn

Ich habe 2 Datensätze: df_train und df_valid (Trainingssatz bzw. Validierungssatz) als Pandas Datenrahmen, der die Funktionen und das Ziel enthält. Als ersten Schritt habe ich get_dummies Pandas-Funktion verwendet, um alle kategorischen Variablen als Boolean zu transformieren. Zum Beispiel würde ich habe:

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 

würde Ich mag jetzt einen PCA anzuwenden, um die Dimensionalität meines Problems zu reduzieren, dann LogisticRegression von sklearn verwenden, um Vorhersage auf meinem Validierungssatz zu trainieren und zu bekommen, aber ich bin nicht sicher, dass das Verfahren, dem ich folge, korrekt ist. Hier ist, was ich tue:

Schritt 1: PCA

Die Idee ist, dass ich beide verwandeln meine Ausbildung und Validierung setzen auf die gleiche Weise mit PCA. Mit anderen Worten, ich kann nicht PCA separat durchführen. Andernfalls werden sie auf verschiedene Eigenvektoren projiziert.

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 

Schritt 2: Logistische Regression

Es ist nicht notwendig, aber ich ziehe Dinge wie Datenrahmen zu halten:

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

Und nun führe ich die logistische Regression

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

I denke Schritt 2 ist richtig, aber ich habe mehr Zweifel an Schritt 1: Ist das die Art, wie ich verketten soll PCA, dann ein Klassifikator?

+0

Ich sehe kein Problem mit dem Verfahren. Was ist mit deinen Ergebnissen? Erhalten Sie die erwartete Ausgabe? – Riyaz

+0

Eines der unerwarteten Verhaltensweisen auf meinen Daten (anders als das hier gezeigte Beispiel) ist, dass, wenn ich die Anzahl der Komponenten in der PCA-Funktion erhöhe, meine Konfusionsmatrix schlechter wird! Ich habe mich auch gefragt, ob zu viele kategorische Variablen auf die Ergebnisse keinen Einfluss haben. Sollte ich die "Ziel" -Spalte während PCA ausschließen? – ldocao

+3

Ziel ist nicht Teil Ihrer Daten. Schließen Sie daher Zielmarken bei der Verwendung von PCA aus. Für kategoriale Daten sollten Sie eine in sklearn implementierte heiße Repräsentation verwenden. – Riyaz

Antwort

2

Es gibt eine pipeline in sklearn für diesen Zweck.

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

Was ist 'clf'? Ist das ein Tippfehler? – guy

+0

Yup, sollte "cls" sein. – Mooncrater