¿Por qué obtengo un árbol de decisión de precisión del 100%?


38

Estoy obteniendo una precisión del 100% para mi árbol de decisiones. ¿Qué estoy haciendo mal?

Este es mi código:

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)

44
¿Por qué crees que estás haciendo algo mal? Quizás sus datos sean tales que pueda lograr una
clasificación

64
Por cierto, +1 por preguntarse si algo está mal con una precisión del 100%. Demasiadas personas pensarían que su modelo es genial ...
S. Kolassa - Restablece a Monica el

1
En R hay un paquete (caret) para dividir automáticamente un conjunto de datos en dos grupos, uno para datos de entrenamiento y otro para datos de prueba. Llamo al proceso como la partición de datos. Creo que hay un paquete similar en Python para lograr una partición de datos también.
Anastasiya-Romanova 秀

Lectura de fondo útil: Errores comunes en ML
smci

3
@ Anastasiya-Romanova 秀 Casi todas las bibliotecas de ML serias contienen esta funcionalidad, incluida la utilizada por OP (OP incluso importó la funcionalidad relevante, y simplemente no la usó por alguna razón).
Konrad Rudolph el

Respuestas:


79

Su muestra de prueba es un subconjunto de su muestra de entrenamiento:

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

Esto significa que evalúa su modelo en una parte de sus datos de capacitación, es decir, está haciendo una evaluación dentro de la muestra. La precisión en la muestra es un indicador notoriamente pobre de la precisión fuera de la muestra, y maximizar la precisión en la muestra puede conducir a un sobreajuste. Por lo tanto, siempre se debe evaluar un modelo en una muestra de reserva verdadera que sea completamente independiente de los datos de entrenamiento.

Asegúrese de que su entrenamiento y sus datos de prueba sean disjuntos, por ejemplo,

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

2
Sería mejor usarlo sklearn.model_selection.train_test_splitcomo sugiere Juan Ignacio Gil, ya que esto también baraja los conjuntos y evita preocupaciones si el conjunto de datos no es aleatorio en el orden. También es más claro porque muestra intención y maneja automáticamente los cambios en el tamaño del conjunto de datos.
Jack Aidley

1
@JackAidley: Estoy de acuerdo (y voté la respuesta de Juan hace unos días). Aún mejor sería hacer la división determinista para la depuración estableciendo la semilla de número aleatorio .
S. Kolassa - Restablece a Monica el

@StephanKolassa Hola, he estado retocando con el conjunto de datos de Iris, y después de usarlo GridSearchCVcon los datos de entrenamiento, para la precisión de las pruebas obtengo el 100% KNeighborsClassifier. Lo he usado test_train_splitpara dividir el conjunto de datos. ¿Qué podría haber hecho mal aquí?
Sndn

19

Está obteniendo una precisión del 100% porque está utilizando una parte de los datos de entrenamiento para las pruebas. En el momento de la capacitación, el árbol de decisión adquirió el conocimiento sobre esos datos, y ahora, si proporciona los mismos datos para predecir, obtendrá exactamente el mismo valor. Es por eso que el árbol de decisiones produce resultados correctos cada vez.

Para cualquier problema de aprendizaje automático, el conjunto de datos de entrenamiento y prueba debe estar separado. La precisión del modelo solo se puede determinar cuando examinamos cómo está prediciendo valores desconocidos.


17

Como otros usuarios le han dicho, está utilizando como conjunto de prueba un subconjunto del conjunto de trenes, y un árbol de decisión es muy propenso a sobreajustar.

Casi lo tenías cuando importaste

from sklearn.cross_validation import train_test_split

Pero entonces no usas la función. Deberías haberlo hecho:

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

para obtener conjuntos aleatorios de trenes y pruebas


2

Como lo señalaron @Stephan Kolassa y @Sanjay Chandlekar, esto se debe al hecho de que su muestra de prueba es un subconjunto de su muestra de entrenamiento.

Sin embargo, para la selección de esas muestras, el muestreo aleatorio sería más apropiado para asegurar que ambas muestras sean representativas. Dependiendo de su estructura de datos, también puede considerar el muestreo aleatorio estratificado.

No soy fluido en Python, pero cualquier software estadístico debería permitir un muestreo aleatorio; algunos consejos también están disponibles en SO .


0

Solo quiero intervenir en la intuición de por qué necesita dividir el entrenamiento y probar muestras explícitamente.

Si tiene observaciones y realiza (en realidad, , y posiblemente mucho menos) divisiones en sus datos, clasificará perfectamente cada punto (si esto no está claro de inmediato, escriba algunos ejemplos a pequeña escala, por ejemplo, , y convéncete de esto).n n - 1 n = 2nnn1n=2

Esto se llama sobreajuste porque es extremadamente improbable que este proceso de división sea ​​predictivo de puntos de datos que son relevantes para su problema pero que aún no ha observado .

Por supuesto, el objetivo de construir estas plataformas de predicción es crear herramientas que puedan aplicarse a datos nunca antes vistos; dividir los datos que tenemos en muestras de entrenamiento y prueba es un intento de simular este auto cegamiento y evitar que nuestros modelos se sobreajusten de la manera anterior.


0

No necesita una precisión del 100% para obtener un sobreajuste. Con suficientes cubos, puede obtener resultados irreproducibles (algo que se vería terrible fuera de la muestra).

Vea este artículo extraído de The Lancet, que describe el método de cortar una muestra en cubos que son demasiado finos. Cuadrícula estadística de Munchausen También es la base de la caricatura XKCD Significante

Lograr una precisión del 100% está a solo un paso de encontrar un clasificador que funcione engañosamente bien.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.