Perché ricevo un albero decisionale con un'accuratezza del 100%?


38

Sto ottenendo una precisione del 100% per il mio albero decisionale. Che cosa sto facendo di sbagliato?

Questo è il mio codice:

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
Perché pensi di fare qualcosa di sbagliato? Forse i tuoi dati sono tali che puoi ottenere una perfetta classicizzazione ...
Knarpie

64
Per inciso, +1 per chiedersi se qualcosa non va con una precisione del 100%. Troppe persone penserebbero semplicemente che il loro modello è fantastico ...
S. Kolassa - Reinstalla Monica il

1
In R c'è un pacchetto (cursore) per dividere automaticamente un set di dati in due gruppi, uno per i dati di allenamento e l'altro per i dati di test. Chiamo il processo come partizione dati. Credo che ci sia un pacchetto simile in Python per realizzare anche una partizione di dati.
Anastasiya-Romanova 秀

Letture utili di fondo: insidie ​​comuni in ML
smci

3
@ Anastasiya-Romanova 秀 Praticamente ogni seria libreria ML contiene questa funzionalità, inclusa quella usata da OP (OP ha persino importato la relativa funzionalità e non l'ha usata per qualche motivo).
Konrad Rudolph,

Risposte:


79

Il tuo campione di prova è un sottoinsieme del tuo campione di allenamento:

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

Ciò significa che si valuta il proprio modello su una parte dei dati di allenamento, ovvero si sta effettuando una valutazione nel campione. L'accuratezza nel campione è un indicatore notoriamente scarso dell'accuratezza fuori dal campione e la massimizzazione della precisione nel campione può portare a un eccesso di adattamento. Pertanto, si dovrebbe sempre valutare un modello su un vero campione di controllo completamente indipendente dai dati di addestramento.

Assicurati che la tua formazione e i tuoi dati di test siano disgiunti, ad es.

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

2
Sarebbe meglio usare sklearn.model_selection.train_test_splitcome suggerisce Juan Ignacio Gil poiché questo mescola anche i set ed evita preoccupazioni se il set di dati non è casuale nell'ordinamento. È anche più chiaro perché mostra l'intento e gestisce automaticamente le modifiche alle dimensioni del set di dati.
Jack Aidley,

1
@JackAidley: sono d'accordo (e ho votato a favore della risposta di Juan qualche giorno fa). Ancora meglio sarebbe rendere deterministica la divisione per il debug impostando il seme di numero casuale .
S. Kolassa - Ripristina Monica il

@StephanKolassa Ciao, ho modificato il set di dati di Iris e, dopo averlo utilizzato GridSearchCVcon i dati di allenamento, per la precisione dei test ottengo il 100% con KNeighborsClassifier. Ho usato test_train_splitper dividere il set di dati. Cosa avrei potuto fare di sbagliato qui?
Sndn,

19

Ottieni una precisione del 100% perché stai utilizzando una parte dei dati di allenamento per i test. Al momento della formazione, l'albero decisionale ha acquisito la conoscenza di tali dati e ora se si forniscono gli stessi dati per prevederli, si otterrà esattamente lo stesso valore. Ecco perché l'albero decisionale produce sempre risultati corretti.

Per qualsiasi problema di apprendimento automatico, l'insieme di dati di addestramento e test deve essere separato. La precisione del modello può essere determinata solo quando esaminiamo come prevede valori sconosciuti.


17

Come altri utenti ti hanno detto, stai usando come set di test un sottoinsieme del set di treni e un albero decisionale è molto incline al sovradimensionamento.

L'hai quasi avuto quando hai importato

from sklearn.cross_validation import train_test_split

Ma poi non usi la funzione. Avresti dovuto fare:

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

per ottenere treni casuali e set di test


2

Come sottolineato da @Stephan Kolassa e @Sanjay Chandlekar, ciò è dovuto al fatto che il campione di test è un sottoinsieme del campione di allenamento.

Tuttavia, per la selezione di tali campioni, il campionamento casuale sarebbe più appropriato per garantire che entrambi i campioni siano rappresentativi. A seconda della struttura dei dati, potresti anche prendere in considerazione un campionamento casuale stratificato.

Non sono fluente in Python ma qualsiasi software statistico dovrebbe consentire campionamenti casuali; alcuni suggerimenti sono disponibili anche su SO .


0

Voglio solo intuire l' intuizione sul perché è necessario dividere l'allenamento e testare i campioni in modo esplicito.

nnn-1n=2

Questo è chiamato overfitting perché è estremamente improbabile che questo processo di suddivisione sia predittivo di punti dati rilevanti per il tuo problema ma che non hai ancora osservato .

Naturalmente lo scopo principale di costruire queste piattaforme di previsione è creare strumenti che possano essere applicati a dati mai visti prima; dividere i dati che abbiamo in formazione e testare i campioni è un tentativo di simulare questa auto-accecamento e sorvegliare i nostri modelli dal sovra-adattamento nel modo sopra indicato.


0

Non è necessaria una precisione del 100% per ottenere un overfitting. Con un numero sufficiente di bucket, puoi ottenere risultati non producibili (qualcosa che sembrerebbe terribile fuori campione).

Vedi questo articolo estratto da Lancet, che descrive il metodo di tagliare un campione in secchi che sono fin troppo bene. Griglia statistica di Munchausen È anche la base per il fumetto XKCD Significant

Raggiungere una precisione del 100% è a pochi passi dalla ricerca di un classificatore che funziona in modo ingannevole.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.