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?
Ich sehe kein Problem mit dem Verfahren. Was ist mit deinen Ergebnissen? Erhalten Sie die erwartete Ausgabe? – Riyaz
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
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