Ich schrieb ein Programm in Python, um einen maschinellen Lernalgorithmus zu verwenden, um Vorhersagen über Daten zu treffen. Ich verwende die Funktion RandomForestClassifier von Scikit Learn, um eine zufällige Gesamtstruktur zu erstellen, um Vorhersagen zu treffen.Offset Randomforestclassifier scikit lernen
Der Zweck des Programms ist es, vorherzusagen, ob eine unbekannte astrophysikalische Quelle ein Pulsar oder ein Agn ist; So trainiert es den Wald auf bekannten Daten, von denen es weiß, ob Quellen Pulsar oder Agn sind, dann macht es Vorhersagen über unbekannte Daten, aber es funktioniert nicht. Das Programm sagt voraus, dass unbekannte Daten alle Pulsar oder alle Agn sind und es selten ein anderes Ergebnis vorhersagt, aber nicht korrekt.
Im Folgenden beschreibe ich die Passagen meines Programms.
es einen Datenrahmen mit Daten für alle Quellen erzeugt: all_df Es zehn Spalten besteht, neun als Prädiktoren verwendet, und eine als Ziel:
predictors=all_df[['spec_index','variab_index','flux_density','unc_ene_flux100','sign_curve','h_ratio_12','h_ratio_23','h_ratio_34','h_ratio_45']]
targets=all_df['type']
Typ Spalte enthält die Bezeichnung „Pulsar“ oder "Agn" für jede Quelle.
Die Werte der Prädiktoren und Ziele werden nacheinander im Programm verwendet, um den Wald zu trainieren.
Das Programm teilt die Prädiktoren und die Ziele in zwei Sätze, den Zug, der 70% der Gesamtmenge darstellt, und den Test, der 30% der Gesamtmenge von all_df darstellt, mit der Funktion train_test_split von Scikit Learn :
pred_train, pred_test, tar_train, tar_test=train_test_split(predictors, targets, test_size=0.3)
Daten in diesen Mengen gemischt werden, so dass das Programm die Indizes dieser Sets bestellt, ohne Datenposition zu ändern:
pred_train=pred_train.reset_index(drop=True)
pred_test=pred_test.reset_index(drop=True)
tar_train=tar_train.reset_index(drop=True)
tar_test=tar_test.reset_index(drop=True)
Danach wird das Programm erstellt und trainiert den Zufall Wald:
clf=RandomForestClassifier(n_estimators=1000,oob_score=True,max_features=None,max_depth=None,criterion='gini')#,random_state=1)
clf=clf.fit(pred_train,tar_train)
Jetzt macht das Programm Vorhersage auf dem Test-Set:
predictions=clf.predict(pred_test)
An diesem Punkt das Programm scheint zu funktionieren.
Nun übergeben Sie einen anderen Datenrahmen mit den unbekannten Daten an die oben erstellte Gesamtstruktur und ich habe das oben beschriebene schlechte Ergebnis. Können Sie mir helfen? Das Problem könnte ein Offset in randomforestclassifier sein, aber ich hatte keine signifikanten Ergebnisse randomforestclassifier Optionen zu ändern. Wenn Sie brauchen, kann ich weitere Erklärungen geben. Vielen Dank im Voraus.
Bye, Fabio
PS: habe ich versucht, die Kreuzvalidierung auch: I dividiert, um die Zug-Set in der Bahn und den Test erneut mit den gleichen Anteilen (0,7 und 0,3), zu erstellen, Bahn- und Testen der Wald vor dem Testen auf dem ersten Testset, Modifizieren von Randomforestclassifier Optionen, um bessere Ergebnisse zu erhalten, aber ich hatte keine Verbesserungen.
Könnte es sein, dass die Verteilung der Prädiktoren in Ihrem "Test" -Datensatz nicht mit denen Ihres "unbekannten" Datensatzes übereinstimmt. Ich würde vorschlagen, diese Distributionen explorativ zu analysieren, bevor Sie versuchen, Ihr Vorhersagemodell zu reparieren (was hier nicht der Täter sein könnte). – Kris
Machen Sie einfach einige Diagramme wie 'pred_test ['flux_density']. Plot()' usw. – Kris
als @kris vorgeschlagen Analyse auf Antwortverteilung zu tun und wenn es nicht korrekt ist (Verteilung im Training ist anders als Test) dann können Sie einige tun geschichtete Stichprobe. – abhiieor