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)
machine-learning
python
cart
accuracy
Nadjla
fuente
fuente
Respuestas:
Su muestra de prueba es un subconjunto de su muestra de entrenamiento:
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,
fuente
sklearn.model_selection.train_test_split
como 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.GridSearchCV
con los datos de entrenamiento, para la precisión de las pruebas obtengo el 100%KNeighborsClassifier
. Lo he usadotest_train_split
para dividir el conjunto de datos. ¿Qué podría haber hecho mal aquí?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.
fuente
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
Pero entonces no usas la función. Deberías haberlo hecho:
para obtener conjuntos aleatorios de trenes y pruebas
fuente
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 .
fuente
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 = 2n n n−1 n=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.
fuente
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.
fuente