Otrzymuję 100% dokładność dla mojego drzewa decyzyjnego. Co ja robię źle?
To jest mój kod:
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
źródło
źródło
Odpowiedzi:
Twoja próbka testowa jest podzbiorem próbki treningowej:
Oznacza to, że oceniasz swój model na podstawie danych treningowych, tj. Przeprowadzasz ocenę w próbie. Dokładność w próbie jest notorycznie słabym wskaźnikiem dokładności poza próbą, a maksymalizacja dokładności w próbce może prowadzić do przeregulowania. Dlatego zawsze należy oceniać model na prawdziwej próbce wstrzymania, która jest całkowicie niezależna od danych treningowych.
Upewnij się, że twoje szkolenie i dane testowe są rozłączne, np.
źródło
sklearn.model_selection.train_test_split
jak sugeruje Juan Ignacio Gil, ponieważ to również tasuje zestawy i pozwala uniknąć obaw, jeśli zestaw danych nie jest losowy w kolejności. Jest również jaśniejszy, ponieważ pokazuje zamiary i automatycznie obsługuje zmiany wielkości zbioru danych.GridSearchCV
z danymi treningowymi, do testowania dokładności dostaję 100%KNeighborsClassifier
. Użyłemtest_train_split
do podziału zestawu danych. Co mogłem zrobić źle tutaj?Otrzymujesz 100% dokładności, ponieważ do testowania używasz części danych treningowych. W czasie szkolenia drzewo decyzyjne zyskało wiedzę o tych danych, a teraz jeśli podasz te same dane, aby przewidzieć, że uzyska dokładnie taką samą wartość. Dlatego drzewo decyzyjne daje za każdym razem prawidłowe wyniki.
W przypadku każdego problemu związanego z uczeniem maszynowym zestaw danych szkoleniowych i testowych należy oddzielić. Dokładność modelu można ustalić tylko wtedy, gdy zbadamy, w jaki sposób przewiduje on nieznane wartości.
źródło
Jak powiedzieli ci inni użytkownicy, używasz jako zestawu testowego podzbioru zestawu pociągów, a drzewo decyzyjne jest bardzo podatne na nadmierne dopasowanie.
Prawie miałeś to podczas importu
Ale wtedy nie używasz tej funkcji. Powinieneś był zrobić:
aby uzyskać losowe zestawy pociągów i testów
źródło
Jak wskazują @Stephan Kolassa i @Sanjay Chandlekar, wynika to z faktu, że próbka testowa jest podzbiorem próbki treningowej.
Jednak przy wyborze tych próbek losowe pobieranie próbek byłoby bardziej odpowiednie, aby zapewnić reprezentatywność obu próbek. W zależności od struktury danych możesz również rozważyć losowe próbkowanie warstwowe.
Nie mówię płynnie w Pythonie, ale każde oprogramowanie statystyczne powinno umożliwiać losowe próbkowanie; niektóre wskazówki są również dostępne w SO .
źródło
Po prostu chcesz poznać intuicję, dlaczego musisz wyraźnie podzielić trening i przetestować próbki.
Jeśli masz obserwacji i dzielisz swoje dane (właściwie i być może znacznie mniej), doskonale sklasyfikujesz każdy punkt (jeśli nie jest to od razu jasne, zapisz kilka przykładów na małą skalę, np. i przekonaj się o tym).n n - 1 n = 2n n n−1 n=2
Nazywa się to nadmiernym dopasowaniem, ponieważ jest bardzo mało prawdopodobne, aby ten proces podziału przewidywał punkty danych istotne dla twojego problemu, ale których jeszcze nie zaobserwowałeś .
Oczywiście głównym celem budowy tych platform prognozowania jest stworzenie narzędzi, które można zastosować do nigdy wcześniej nie widzianych danych; podzielenie danych, które mamy na próbki szkoleniowe i testowe, jest próbą symulacji tego samoślepienia i uchronienia naszych modeli przed nadmiernym dopasowaniem w powyższy sposób.
źródło
Nie potrzebujesz 100% dokładności, aby się przeregulować. Przy wystarczającej ilości segmentów można uzyskać nieodtwarzalne wyniki (coś, co wyglądałoby okropnie poza próbą).
Zobacz ten fragment artykułu z Lancetu, opisujący metodę krojenia próbki w wiadra, które są zdecydowanie zbyt dobre. Siatka statystyczna Munchausena Jest to także podstawa do kreskówki XKCD S Znaczące
Osiągnięcie 100% dokładności to tylko krótki krok od znalezienia klasyfikatora, który działa zwodniczo dobrze.
źródło