2017-08-02 3 views
3

Ich versuche, ein binäres Klassifizierungsproblem zu lösen, wo 80% der Daten zur Klasse x gehören und 20% der Daten zur Klasse y gehören. Alle meine Modelle (AdaBoost, Neural Networks und SVC) sagen nur voraus, dass alle Daten Teil der Klasse x sind, da dies die höchste Genauigkeit ist, die sie erreichen können.Maschinelles Lernen: Move Treshhold

Mein Ziel ist es, eine höhere Genauigkeit für alle Einträge der Klasse x zu erreichen, und es ist mir egal, wie viele Einträge fälschlicherweise als Teil der Klasse y klassifiziert werden.

Meine Idee wäre, nur Einträge in Klasse x zu setzen, wenn das Modell über sie sicher ist und sie sonst in Klasse y setzen.

Wie würde ich das erreichen? Gibt es eine Möglichkeit, den Schwellenwert zu verschieben, so dass nur sehr offensichtliche Einträge als Klasse x klassifiziert werden?

Ich verwende Python und sklearn

Beispielcode:

adaboost = AdaBoostClassifier(random_state=1) 
adaboost.fit(X_train, y_train) 
adaboost_prediction = adaboost.predict(X_test) 

confusion_matrix(adaboost_prediction,y_test) outputs: 

array([[ 0, 0], 
     [10845, 51591]]) 

Antwort

2

In SVM, ein Weg, um die Schwelle zu bewegen ist class_weight so zu wählen, dass Sie viel mehr Gewicht auf Daten legen Punkte aus der Klasse y. Betrachten Sie das folgende Beispiel, genommen von SVM: Separating hyperplane for unbalanced classes:

enter image description here

Die gerade Linie ist die Entscheidungsgrenze, die Sie erhalten, wenn Sie SVC mit Standardklasse Gewicht (gleiches Gewicht für jede Klasse) verwenden. Die gestrichelte Linie ist die Entscheidungsgrenze, die Sie erhalten, wenn Sie class_weight={1: 10} verwenden (das bedeutet, dass Sie der Klasse 1, relativ zur Klasse 0, mehr Gewicht beimessen).

Klasse Gewichte besically die Strafe Parameter in SVM einstellen:

class_weight: {dict, 'ausgewogen'}, optional

der Parameter C der Klasse Set i class_weight [i] * C SVC. Wenn nicht angegeben, sollen alle Klassen ein Gewicht haben. Der „balanced“ Modus verwendet die Werte von y automatisch Gewichte einstellen, um umgekehrt proportional zu Klasse Frequenzen in den Eingangsdaten als N_SAMPLES/ (n_classes * np.bincount (y))

4

AdaBoostClassifier verwenden Sie können Ausgang Klassenwahrscheinlichkeiten und dann Schwelle sie durch predict_proba anstelle von predict:

adaboost = AdaBoostClassifier(random_state=1) 
adaboost.fit(X_train, y_train) 
adaboost_probs = adaboost.predict_proba(X_test) 

threshold = 0.8 # for example  
thresholded_adaboost_prediction = adaboost_probs > threshold 

mit diesem Ansatz können Sie auch (nur Debug-Druck, oder vielleicht Art und Handlung auf einem Diagramm) untersuchen, wie die Vertrauensniveaus in Ihrem endgültigen Modell variieren O n die Testdaten, um zu entscheiden, ob es sich lohnt, weiter zu gehen.

Es gibt jedoch mehrere Möglichkeiten, sich Ihrem Problem zu nähern. Sehen Sie sich zum Beispiel Miriam Farber's answer an, in der der Klassifikator neu gewichtet wird, um während des Trainings auf das Ungleichgewicht der Klasse 80/20 zu reagieren. Möglicherweise stellen Sie fest, dass Sie andere Probleme haben, einschließlich der von Ihnen verwendeten Klassifizierer, die aufgrund Ihrer aktuellen Daten die Klassen x und y nicht realistisch trennen können. Wenn man alle Möglichkeiten eines Datenproblems wie dieses durchgehen möchte, kann es verschiedene Ansätze geben.

Wenn Sie weitere Fragen zu Problemen mit Ihrem Daten Problem haben als auf den Code im Gegensatz gibt es Stapel Exchange-Standorte, die Ihnen auch als Stack-Überlauf (bitte lesen Sie die Website-Richtlinien vor der Veröffentlichung) helfen konnten: Data Science und Cross Validated .