2016-08-17 7 views
0

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.

+0

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

+0

Machen Sie einfach einige Diagramme wie 'pred_test ['flux_density']. Plot()' usw. – Kris

+0

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

Antwort

0

Danke für die Antwort, Leute.

Wie vorgeschlagen, habe ich Diagramme der Prädiktoren in den "Test" -Daten und in den "unbekannten" Daten gemacht; Die Verteilungen sind im Allgemeinen ähnlich, aber ich bevorzuge es, Histogramme zu machen, um es zu sagen.Also habe ich versucht Histogramme zu tun, aber ich konnte nicht sowohl für den Test und die unbekannten Daten, mit:

pylab.hist(unid_df.spec_index,bins=30) 

I erhalten: Typeerror: len() von unsized Objekt

ich nicht haben habe eine Lösung gefunden und ich weiß nicht, ob dieser Fehler negativ auf die Vorhersagen wirken kann.

Weitere Informationen: Die Bereiche der verschiedenen Prädiktoren sind von unterschiedlicher Größenordnung. Die Bereiche sind für entsprechende Prädiktoren von Test- und unbekannten Daten gleich, aber in einigen Fällen haben Testdatenbereiche eine größere Größenordnung als der entsprechende Prädiktor der unbekannten Daten. Dies liegt an einigen Punkten, deren Werte viel größer sind als die der meisten anderen Punkte im Satz.

Nochmals vielen Dank. Tschüss, Fabio

Verwandte Themen