2010-07-11 4 views
7

Ich habe eine binäre Klasse Dataset (0/1) mit einer großen Schräglage in Richtung der "0" -Klasse (etwa 30000 vs 1500). Es gibt 7 Funktionen für jede Instanz, keine fehlenden Werte.Wie kann man Weka Baumklassierer absichtlich überziehen?

Wenn ich den J48 oder einen anderen Baum Klassifizierer verwende, bekomme ich fast alle "1" Instanzen fälschlicherweise als "0" klassifiziert.

Den Klassifikator auf "nicht protokolliert" setzen, die minimale Anzahl von Instanzen pro Blatt auf 1 setzen, den Konfidenzfaktor auf 1 setzen, ein Dummy-Attribut mit Instanz-ID-Nummer hinzufügen - all dies hat nicht geholfen.

Ich kann einfach kein Modell erstellen, das meine Daten überlagert!

Ich habe auch versucht, fast alle anderen Klassifikatoren Weka bietet, aber ähnliche Ergebnisse.

Die Verwendung von IB1 wird 100% ig genau (Zugverband im Zugverband), daher ist es kein Problem von mehreren Instanzen mit denselben Merkmalswerten und unterschiedlichen Klassen.

Wie kann ich einen vollständig nicht protokollierten Baum erstellen? Oder sonst zwingen Weka meine Daten zu überfrachten?

Danke.

Update: Okay, das ist absurd. (! Unpruned):

J48 unpruned tree 
------------------ 

F <= 0.90747: 1 (201.0/54.0) 
F > 0.90747: 0 (4153.0/1062.0) 

Unnötig zu sagen, IB1 gibt immer noch 100% Präzision Ich habe nur etwa 3100 negativ und 1200 positive Beispiele, und dies ist der Baum, den ich bekam verwendet.

Update 2: Ich weiß nicht, wie ich es verpasst habe - unprawn SimpleCart funktioniert und gibt 100% Genauigkeit Zug auf Zug; bereinigt SimpleCart ist nicht so voreingenommen wie J48 und hat eine anständige falsch positive und negative Ratio.

+0

möglich damit verbundene Frage: http://stackoverflow.com/ Fragen/2519997/verschiedene-Gewichte-von-falsch-positiv-und-falsch-negativ-in-neuronalen Netzwerk – Amro

Antwort

2

Die schnelle und schmutzige Lösung besteht in der Neuabtastung. Werfen Sie alle bis auf 1500 Ihrer positiven Beispiele weg und trainieren Sie einen ausgewogenen Datensatz. Ich bin mir ziemlich sicher, dass es in Weka eine Resample-Komponente gibt, um das zu tun.

Die andere Lösung besteht darin, einen Klassifikator mit variablen Kosten für jede Klasse zu verwenden. Ich bin mir ziemlich sicher, dass libSVM dies erlaubt, und ich weiß, dass Weka libSVM umhüllen kann. Allerdings habe ich Weka schon lange nicht mehr benutzt, daher kann ich hier nicht viel helfen.

+0

Danke. Ich bin mir nicht sicher, ob das Resampling funktionieren würde - von Experimenten, die ich gemacht habe, scheint J48 und andere Klassifizierer (außer SimpleCart) selbst auf einem ziemlich ausgewogenen Datensatz (1000 Beispiele für jede Klasse) lächerliche Ergebnisse zu bekommen - entweder sehr hohe FP oder FN für Klasse. 0 "oder sehr hoch für Klasse" 1 "(und die andere Klasse wird meist korrekt klassifiziert). In Bezug auf die kostensensitive Klassifizierung - ich habe es total vergessen, ich werde es bald untersuchen. Vielen Dank! – Haggai

+0

Der kostensensitive Ansatz funktioniert. Ich verstehe immer noch nicht, warum ich mit dem ungesicherten J48 keine hundertprozentige Genauigkeit des Trainingssets erreichen kann oder warum ein ziemlich ausgewogener Datensatz mit J48 immer noch lächerliche Ergebnisse liefert. Aber zumindest jetzt habe ich etwas zum arbeiten. Vielen Dank! – Haggai

5

Weka enthält zwei Meta-Klassifizierer von Interesse:

Sie Sie jeder Algorithmus kostensensitive (nicht beschränkt auf SVM) machen können und spezifizieren Kostenmatrix (Strafe der verschiedenen Fehler); Sie würden eine höhere Strafe für das Fehlklassifizieren von 1 Instanzen als 0 geben, als Sie für die fehlerhafte Klassifizierung 0 als 1 geben würden.

Das Ergebnis ist, dass der Algorithmus würde dann versuchen, zu:

erwartet Fehlklassifizierungskosten minimieren (und nicht die wahrscheinlichste Klasse)

+1

Danke, das ist genau die Lösung, die ich benutzt habe. – Haggai