Warum erhalte ich einen Entscheidungsbaum mit 100% Genauigkeit?


38

Ich erhalte eine 100% ige Genauigkeit für meinen Entscheidungsbaum. Was mache ich falsch?

Das ist mein Code:

import pandas as pd
import json
import numpy as np
import sklearn
import matplotlib.pyplot as plt


data = np.loadtxt("/Users/Nadjla/Downloads/allInteractionsnum.csv", delimiter=',')


x = data[0:14]
y = data[-1]


from sklearn.cross_validation import train_test_split

x_train = x[0:2635]
x_test = x[0:658]
y_train = y[0:2635]
y_test = y[0:658]


from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(x_train.astype(int), y_train.astype(int))


from sklearn.metrics import accuracy_score

y_predicted = tree.predict(x_test.astype(int))
accuracy_score(y_test.astype(int), y_predicted)

4
Warum denkst du, machst du etwas falsch? Vielleicht sind Ihre Daten so, dass Sie eine perfekte
Klassifizierung

64
Übrigens +1 für die Frage, ob etwas mit 100% Genauigkeit nicht stimmt. Viel zu viele Leute würden denken , nur ihr Modell groß ist ...
S. Kolassa - wieder einzusetzen Monica

1
In R gibt es ein Paket (Caret), um einen Datensatz automatisch in zwei Gruppen aufzuteilen, eine für Trainingsdaten und eine für Testdaten. Ich nenne den Prozess als Datenpartition. Ich glaube, es gibt ein ähnliches Paket in Python, um auch eine Datenpartition zu erreichen.
Anastasiya-Romanova 秀

Nützliche Hintergrundinformationen: Allgemeine Fallstricke in ML
smci

3
@ Anastasiya-Romanova 秀 So ziemlich jede seriöse ML-Bibliothek enthält diese Funktionalität, einschließlich der von OP verwendeten (OP hat sogar die relevante Funktionalität importiert und sie aus irgendeinem Grund einfach nicht verwendet).
Konrad Rudolph

Antworten:


79

Ihr Testmuster ist eine Teilmenge Ihres Trainingsmusters:

x_train = x[0:2635]
x_test = x[0:658]
y_train = y[0:2635]
y_test = y[0:658]

Dies bedeutet, dass Sie Ihr Modell anhand eines Teils Ihrer Trainingsdaten bewerten, dh, Sie führen eine Stichprobenbewertung durch. Die Genauigkeit innerhalb der Probe ist ein notorisch schlechter Indikator für die Genauigkeit außerhalb der Probe, und die Maximierung der Genauigkeit innerhalb der Probe kann zu einer Überanpassung führen. Aus diesem Grund sollte ein Modell immer an einer echten Holdout-Stichprobe evaluiert werden, die von den Trainingsdaten völlig unabhängig ist.

Stellen Sie sicher, dass Ihr Training und Ihre Testdaten nicht zusammenpassen, z.

x_train = x[659:2635]
x_test = x[0:658]
y_train = y[659:2635]
y_test = y[0:658]

2
Die Verwendung ist besser, sklearn.model_selection.train_test_splitwie Juan Ignacio Gil vorschlägt, da hierdurch auch die Mengen gemischt werden und Bedenken vermieden werden, wenn der Datensatz nicht zufällig in der Reihenfolge ist. Es ist auch klarer, weil es die Absicht zeigt und automatisch Änderungen in der Größe des Datensatzes verarbeitet.
Jack Aidley

1
@ JackAidley: Ich stimme zu (und habe Juans Antwort vor einigen Tagen positiv bewertet ). Noch besser wäre es, den Split für das Debugging deterministisch zu machen, indem Sie den Zufallszahlen- Startwert festlegen .
S. Kolassa - Wiedereinsetzung von Monica

@StephanKolassa Hallo, ich habe am Iris-Datensatz gefeilt und nach der Verwendung GridSearchCVmit Trainingsdaten, um die Genauigkeit zu testen, bekomme ich 100% mit KNeighborsClassifier. Ich habe test_train_splitzum Teilen des Datensatzes verwendet. Was hätte ich hier falsch machen können?
Sonntag,

19

Sie erhalten eine 100% ige Genauigkeit, da Sie einen Teil der Trainingsdaten zum Testen verwenden. Zum Zeitpunkt des Trainings hat Decision Tree das Wissen über diese Daten gewonnen. Wenn Sie nun dieselben Daten zur Vorhersage angeben, erhalten Sie genau denselben Wert. Deshalb liefert der Entscheidungsbaum jedes Mal die richtigen Ergebnisse.

Bei Problemen mit maschinellem Lernen sollten Schulungs- und Testdatensatz getrennt werden. Die Genauigkeit des Modells kann nur bestimmt werden, wenn wir untersuchen, wie es für unbekannte Werte prognostiziert wird.


17

Wie andere Benutzer Ihnen bereits mitgeteilt haben, verwenden Sie als Testset eine Teilmenge des Zugsets, und ein Entscheidungsbaum ist sehr anfällig für Überanpassungen.

Sie hatten es fast, als Sie importierten

from sklearn.cross_validation import train_test_split

Aber dann benutzt du die Funktion nicht. Du hättest tun sollen:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33)

zufällige Zug- und Testsätze zu bekommen


2

Wie @Stephan Kolassa und @Sanjay Chandlekar betonten, ist dies auf die Tatsache zurückzuführen, dass Ihr Testmuster eine Teilmenge Ihres Trainingsmusters ist.

Für die Auswahl dieser Stichproben wäre jedoch eine Zufallsstichprobe angemessener, um sicherzustellen, dass beide Stichproben repräsentativ sind. Abhängig von Ihrer Datenstruktur können Sie auch eine geschichtete Zufallsauswahl in Betracht ziehen.

Ich spreche nicht fließend Python, aber jede statistische Software sollte Stichproben zulassen. Einige Hinweise sind auch auf SO verfügbar .


0

Ich möchte nur auf die Intuition eingehen, warum Sie das Training aufteilen und die Proben explizit testen müssen.

Wenn Sie Beobachtungen haben und (tatsächlich und möglicherweise weit weniger) Teilungen in Ihren Daten vornehmen , werden Sie jeden Punkt perfekt klassifizieren (wenn dies nicht sofort klar ist, notieren Sie sich einige kleine Beispiele, z. B. und überzeugen Sie sich davon).n n - 1 n = 2nnn1n=2

Dies wird als Überanpassung bezeichnet, da dieser Aufteilungsprozess äußerst unwahrscheinlich ist , Datenpunkte vorherzusagen, die für Ihr Problem relevant sind, die Sie jedoch noch nicht beobachtet haben .

Natürlich besteht der Sinn des Aufbaus dieser Vorhersageplattformen darin, Tools zu erstellen, die auf noch nie dagewesene Daten angewendet werden können. Das Aufteilen der Daten in Trainings- und Testmuster ist ein Versuch, diese Selbstblindung zu simulieren und die Überanpassung unserer Modelle auf die oben beschriebene Weise zu überwachen.


0

Sie benötigen keine 100% ige Genauigkeit, um eine Überanpassung durchzuführen. Mit genügend Eimern können Sie irreproduzierbare Ergebnisse erzielen (etwas, das außerhalb der Stichprobe fürchterlich aussieht).

In diesem Artikel aus dem Lancet wird beschrieben, wie eine Probe in viel zu feine Eimer geschnitten wird. Munchausens statistisches Gitter Es ist auch die Grundlage für den XKCD-Cartoon Significant

Das Erreichen einer Genauigkeit von 100% ist nur einen kurzen Schritt von der Suche nach einem Klassifikator entfernt, der täuschend gut funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.