100 % 정확도 결정 트리를 얻는 이유는 무엇입니까?


38

의사 결정 트리의 정확도가 100 %입니다. 내가 무엇을 잘못하고 있지?

이것은 내 코드입니다.

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
왜 당신이 뭔가 잘못하고 있다고 생각하십니까? 아마도 여러분의 데이터는 완벽한 고 전화를 달성 할 수 있도록하는 것입니다.
Knarpie

64
덧붙여서, 100 % 정확도에 문제가 있는지 궁금해 +1. 너무 많은 사람들이 그들의 모델이 훌륭하다고 생각할 것입니다 ...
S. Kolassa-Reinstate Monica

1
R에는 데이터 집합을 훈련 데이터 용 그룹과 데이터 테스트 용 그룹 두 개로 자동 분할하는 패키지 (캐럿)가 있습니다. 프로세스를 데이터 파티션이라고합니다. 파이썬에는 데이터 파티션을 달성하기 위해 비슷한 패키지가 있다고 생각합니다.
아나스타샤-로마 노바 秀

유용한 배경 독서 : ML의 일반적인 함정
smci

3
@ Anastasiya-Romanova 秀OP가 사용하는 라이브러리를 포함하여 거의 모든 심각한 ML 라이브러리에는이 기능이 포함되어 있습니다 .
Konrad Rudolph

답변:


79

테스트 샘플은 교육 샘플 의 하위 집합 입니다.

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

즉, 훈련 데이터의 일부, 즉 샘플 내 평가를 수행하여 모델을 평가합니다. 샘플 내 정확도는 샘플 외부 정확도에 대한 지표로 악명 높으며, 샘플 내 정확도를 최대화하면 과적 합이 발생할 수 있습니다. 따라서 훈련 데이터와 완전히 독립적 인 실제 홀드 아웃 샘플에서 항상 모델을 평가해야합니다.

예를 들어, 교육 및 테스트 데이터가 분리되어 있는지 확인하십시오.

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

2
sklearn.model_selection.train_test_splitJuan Ignacio Gil이 제안한 것처럼 데이터 세트가 순서에 맞지 않을 경우 세트를 뒤섞 고 우려를 피할 수 있기 때문에 사용하는 것이 좋습니다 . 의도를 표시하고 데이터 세트의 크기 변화를 자동으로 처리하기 때문에 더 명확합니다.
Jack Aidley

1
@ JackAidley : 동의합니다 ( 며칠 전에 Juan의 대답을 찬성했습니다 ). 난수 시드를 설정하여 분할을 결정적으로 디버깅하는 것이 더 좋습니다 .
S. Kolassa-복원 Monica Monica

@StephanKolassa 안녕하세요, Iris 데이터 세트를 조정 GridSearchCV하고 훈련 데이터와 함께 사용한 후 정확도 테스트를 위해 100 %를 얻었습니다 KNeighborsClassifier. test_train_split데이터 세트를 분할하는 데 사용 했습니다. 여기서 내가 뭘 잘못했을 수 있니?
Sndn

19

테스트에 훈련 데이터의 일부를 사용하고 있기 때문에 100 % 정확도를 얻습니다. 훈련 당시 의사 결정 트리는 해당 데이터에 대한 지식을 얻었으며 이제 예측을 위해 동일한 데이터를 제공하면 정확히 동일한 가치를 제공합니다. 이것이 의사 결정 트리가 매번 올바른 결과를 생성하는 이유입니다.

기계 학습 문제의 경우 교육 및 테스트 데이터 세트를 분리해야합니다. 모델의 정확도는 알 수없는 값을 예측하는 방법을 조사 할 때만 결정될 수 있습니다.


17

다른 사용자가 말했듯이 테스트 세트로 기차 세트의 하위 세트를 사용하고 있으며 의사 결정 트리가 과적 합되기 쉽습니다.

당신이 가져올 때 거의 그것을했다

from sklearn.cross_validation import train_test_split

그러나 당신은 그 기능을 사용하지 않습니다. 다음을 수행해야합니다.

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

무작위 열차 및 테스트 세트를 얻기 위해


2

@Stephan Kolassa와 @Sanjay Chandlekar가 지적한 것처럼 이것은 테스트 샘플이 훈련 샘플의 하위 세트이기 때문입니다.

그러나 이러한 샘플을 선택하려면 두 샘플이 모두 대표되도록 임의 샘플링이 더 적합합니다. 데이터 구조에 따라 계층화 된 무작위 샘플링을 고려할 수도 있습니다.

저는 파이썬에 유창하지 않지만 통계 소프트웨어는 무작위 샘플링을 허용해야합니다. SO 에 대한 힌트도 있습니다 .


0

왜 훈련과 테스트 샘플을 명시 적으로 분리해야하는지 직감 에 차임하고 싶습니다 .

당신이있는 경우 관찰과 메이크업 (실제로, 이 즉시 명확하지 않은 경우 (가능성이 훨씬 적은) 데이터에 분할, 당신은 완벽하게 모든 지점을 분류합니다, 쓰기 일부 소규모 예 아래로, 예를 들어, 이고 이것을 확신하십시오).n n 1 n = 2nnn1n=2

이 분할 프로세스가 문제와 관련이 있지만 아직 관찰하지 않은 데이터 요소를 예측할 가능성이 크지 않기 때문에이를 오버 피팅이라고합니다 .

물론 이러한 예측 플랫폼을 구축하는 요점은 전혀 볼 수없는 데이터에 적용 할 수있는 도구를 만드는 것입니다. 우리가 가지고있는 데이터를 훈련 및 테스트 샘플로 분할하는 것은 이러한자가-맹검을 시뮬레이션하고 모델이 위와 같은 방식으로 과적 합되는 것을 막기위한 시도입니다.


0

과적 합을 얻기 위해 100 % 정확도가 필요하지 않습니다. 버킷이 충분하면 재현 할 수없는 결과를 얻을 수 있습니다 (샘플에서 끔찍한 결과).

Lancet에서 발췌 한이 기사를 참조하십시오. 샘플을 너무 미세한 버킷으로 자르는 방법을 설명합니다. 뮌 하우젠의 통계 그리드 또한 XKCD 만화의 기초가 중요한

100 % 정확도를 달성하는 것은 현혹 적으로 잘 작동하는 분류기를 찾는 것에서 멀지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.