Estou obtendo uma precisão de 100% para minha árvore de decisão. O que estou fazendo errado?
Este é o meu 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
fonte
fonte
Respostas:
Sua amostra de teste é um subconjunto da sua amostra de treinamento:
Isso significa que você avalia seu modelo em uma parte dos dados de treinamento, ou seja, está fazendo uma avaliação dentro da amostra. A precisão dentro da amostra é um indicador notoriamente ruim da precisão fora da amostra, e maximizar a precisão dentro da amostra pode levar ao excesso de ajuste. Portanto, deve-se sempre avaliar um modelo em uma amostra de validação verdadeira que seja completamente independente dos dados de treinamento.
Verifique se seu treinamento e seus dados de teste são disjuntos, por exemplo,
fonte
sklearn.model_selection.train_test_split
como Juan Ignacio Gil sugere, pois isso também embaralha os conjuntos e evita preocupações se o conjunto de dados não for aleatório no pedido. Também é mais claro porque mostra a intenção e lida automaticamente com alterações no tamanho do conjunto de dados.GridSearchCV
com dados de treinamento, para testar a precisão, recebo 100%KNeighborsClassifier
. Eu useitest_train_split
para dividir o conjunto de dados. O que eu poderia ter feito de errado aqui?Você está obtendo 100% de precisão porque está usando uma parte dos dados de treinamento para testes. No momento do treinamento, a árvore de decisão adquiriu conhecimento sobre esses dados e, agora, se você fornecer os mesmos dados para prever, obterá exatamente o mesmo valor. É por isso que a árvore de decisão produz resultados sempre corretos.
Para qualquer problema de aprendizado de máquina, o conjunto de dados de treinamento e teste deve ser separado. A precisão do modelo pode ser determinada apenas quando examinamos como ele está prevendo valores desconhecidos.
fonte
Como outros usuários disseram, você está usando como conjunto de teste um subconjunto do conjunto de trens, e uma árvore de decisão é muito propensa a sobreajuste.
Você quase teve quando importou
Mas então você não usa a função Você deveria ter feito:
obter conjuntos aleatórios de trem e teste
fonte
Conforme apontado por @Stephan Kolassa e @Sanjay Chandlekar, isso se deve ao fato de sua amostra de teste ser um subconjunto da sua amostra de treinamento.
No entanto, para a seleção dessas amostras, a amostragem aleatória seria mais apropriada para garantir que ambas as amostras sejam representativas. Dependendo da sua estrutura de dados, você também pode considerar amostragem aleatória estratificada.
Não sou fluente em Python, mas qualquer software estatístico deve permitir amostragem aleatória; algumas dicas também estão disponíveis no SO .
fonte
Só quero enfatizar a intuição do motivo pelo qual você precisa dividir o treinamento e testar as amostras explicitamente.
Isso é chamado de ajuste excessivo, porque é improvável que esse processo de divisão preveja pontos de dados relevantes para o seu problema, mas que você ainda não observou .
Obviamente, o objetivo principal da construção dessas plataformas de previsão é criar ferramentas que possam ser aplicadas a dados nunca antes vistos; dividir os dados que temos em amostras de treinamento e teste é uma tentativa de simular essa auto-cegueira e policiar nossos modelos de sobreajuste da maneira acima.
fonte
Você não precisa de 100% de precisão para obter o ajuste excessivo. Com baldes suficientes, você pode obter resultados irreprodutíveis (algo que pareceria terrível fora da amostra).
Veja este artigo extraído do Lancet, descrevendo o método de cortar uma amostra em baldes muito finos. De Munchausen Estatística Grade É também a base para o desenho animado XKCD Significativo
Atingir 100% de precisão está a um pequeno passo de encontrar um classificador que funcione enganosamente bem.
fonte