Pourquoi ai-je un arbre de décision à 100% de précision?

38

Je reçois une précision de 100% pour mon arbre de décision. Qu'est-ce que je fais mal?

Ceci est mon 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)
Nadjla
la source
4
Pourquoi pensez-vous que vous faites quelque chose de mal? Peut-être que vos données sont telles que vous pouvez obtenir une
classification
64
Incidemment, +1 pour se demander si quelque chose ne va pas avec une précision de 100%. Beaucoup trop de gens penseraient que leur modèle est génial ...
S. Kolassa - Réintégrer Monica
1
Dans R, il existe un paquet (caret) permettant de scinder automatiquement un jeu de données en deux groupes, l'un pour les données d'apprentissage et l'autre pour les tester. J'appelle le processus en tant que partition de données. Je pense qu'il existe un paquetage similaire en Python pour réaliser une partition de données.
Anastasiya-Romanova 秀
Lecture de fond utile: Pièges courants en ML
smci
3
@ Anastasiya-Romanova 秀 Presque toutes les bibliothèques ML sérieuses contiennent cette fonctionnalité, y compris celle utilisée par OP (OP a même importé la fonctionnalité pertinente et ne l'a simplement pas utilisée pour une raison quelconque).
Konrad Rudolph

Réponses:

79

Votre échantillon de test est un sous - ensemble de votre échantillon de formation:

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

Cela signifie que vous évaluez votre modèle sur une partie de vos données de formation, c'est-à-dire que vous effectuez une évaluation intra-échantillon. La précision intra-échantillon est un indicateur notoirement médiocre de la précision hors échantillon, et maximiser la précision intra-échantillon peut conduire à un surajustement. Par conséquent, il faut toujours évaluer un modèle sur un échantillon réel réel complètement indépendant des données d'apprentissage.

Assurez-vous que votre entraînement et vos données de test sont disjoints, par exemple:

x_train = x[659:2635]
x_test = x[0:658]
y_train = y[659:2635]
y_test = y[0:658]
S. Kolassa - Rétablir Monica
la source
2
Il serait préférable d’utiliser sklearn.model_selection.train_test_splitcomme le suggère Juan Ignacio Gil, dans la mesure où cela mélange également les ensembles et évite les problèmes si le jeu de données n’est pas aléatoire. C'est aussi plus clair car cela montre l'intention et gère automatiquement les changements dans la taille du jeu de données.
Jack Aidley
1
@JackAidley: Je suis d'accord (et j'ai voté en faveur de la réponse de Juan il y a quelques jours). Encore mieux serait de rendre la division déterministe pour le débogage en définissant la graine de nombre aléatoire .
S. Kolassa - Réintégrer Monica
@StephanKolassa Bonjour, j'ai peaufiné le jeu de données Iris et, après avoir utilisé GridSearchCVdes données d'entraînement, je vérifie à 100% l'exactitude des tests KNeighborsClassifier. J'ai utilisé test_train_splitpour scinder le jeu de données. Qu'est-ce que j'aurais pu faire de mal ici?
Sndn
19

Vous obtenez une précision de 100% parce que vous utilisez une partie des données d'entraînement pour les tests. Au moment de la formation, l’arbre décisionnel a acquis la connaissance de ces données, et si vous donnez les mêmes données pour les prédire, elles donneront exactement la même valeur. C'est pourquoi l'arbre de décision produit des résultats corrects à chaque fois.

Pour tout problème d’apprentissage automatique, les ensembles de données de formation et d’essai doivent être séparés. La précision du modèle ne peut être déterminée que lorsque nous examinons comment il prévoit des valeurs inconnues.

Sanjay Chandlekar
la source
17

Comme d'autres utilisateurs vous l'ont dit, vous utilisez comme ensemble de test un sous-ensemble de trains et un arbre de décision est très sujet aux surajustements.

Vous avez presque eu quand vous avez importé

from sklearn.cross_validation import train_test_split

Mais alors vous n'utilisez pas la fonction. Vous auriez dû faire:

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

obtenir des ensembles de tests et de trains aléatoires

Juan Ignacio Gil
la source
2

Comme l'ont souligné @Stephan Kolassa et @Sanjay Chandlekar, cela est dû au fait que votre échantillon de test est un sous-ensemble de votre échantillon de formation.

Cependant, pour la sélection de ces échantillons, un échantillonnage aléatoire serait plus approprié pour s'assurer que les deux échantillons sont représentatifs. En fonction de la structure de vos données, vous pouvez également envisager un échantillonnage aléatoire stratifié.

Je ne parle pas couramment Python, mais tout logiciel statistique devrait permettre un échantillonnage aléatoire. Quelques astuces sont également disponibles sur SO .

Nghauran
la source
0

Je veux juste expliquer l' intuition de la raison pour laquelle vous avez besoin de scinder la formation et de tester les échantillons de manière explicite.

nnn-1n=2

C'est ce qu'on appelle l'overfitting, car il est extrêmement peu probable que ce processus de scission prédit des points de données pertinents pour votre problème, mais que vous n'avez pas encore observés .

Bien entendu, l’intérêt de la construction de ces plates-formes de prévision est de créer des outils pouvant être appliqués à des données inédites; Fractionner les données dont nous disposons en échantillons d’entraînement et d’essai est une tentative de simulation de cet aveuglement automatique et de prévention de la sur-adaptation de nos modèles.

MichaelChirico
la source
0

Vous n'avez pas besoin de 100% de précision pour suréquiper. Avec suffisamment de seaux, vous pouvez obtenir des résultats non reproductibles (quelque chose qui pourrait sembler terrible en dehors de l'échantillon).

Voir cet article extrait du Lancet, décrivant la méthode de découpage d’un échantillon en seaux beaucoup trop fins. Grille statistique de Munchausen Il est également la base pour le dessin animé XKCD important

Atteindre une précision de 100% n’est qu’à un pas de la recherche d’un classificateur qui fonctionne faussement bien.

FBN
la source