なぜ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
なぜあなたは何か間違ったことをしていると思いますか?おそらく、あなたのデータは...あなたは完璧なclassicationを実現することができるようなものである
Knarpie

64
ちなみに、100%の精度で何かが間違っているかどうか疑問に思う+1。あまりにも多くの人々はちょうど...彼らのモデルは素晴らしいと思うだろう
S. Kolassa -復活モニカ

1
Rには、データセットを2つのグループに自動的に分割するパッケージ(キャレット)があります。1つはトレーニングデータ用、もう1つはデータテスト用です。プロセスをデータパーティションと呼びます。Pythonにもデータパーティションを実現するための同様のパッケージがあると思います。
アナスタシアロマノバ秀

有用なバックグラウンドリーディング:MLの一般的な落とし穴
-smci

3
@ Anastasiya-Romanova秀ほぼすべての本格的なMLライブラリには、OPで使用されるものを含むこの機能が含まれています(OPは関連機能をインポートし、何らかの理由で使用しませんでした)。
コンラッドルドルフ

回答:


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が示唆するように、セットをシャッフルし、データセットの順序がランダムでない場合の懸念を回避するため、使用する方が良いでしょう。また、意図を示し、データセットのサイズの変更を自動的に処理するため、より明確です。
ジャックエイドリー

1
@JackAidley:同意します(数日前にJuanの答えを支持しました)。さらに良いことは、乱数シードを設定することで、デバッグ用に分割を決定論的にすることです
S. Kolassa -復活モニカ

@StephanKolassaこんにちは、私はIrisデータセットを調整してきました。GridSearchCVトレーニングデータを使用した後、精度をテストするためにで100%を得ましたKNeighborsClassifiertest_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が指摘したように、これはテストサンプルがトレーニングサンプルのサブセットであるためです。

ただし、これらのサンプルの選択には、両方のサンプルが代表的であることを保証するために、ランダムサンプリングがより適切です。データ構造によっては、階層化されたランダムサンプリングを検討することもできます。

私はPythonに堪能ではありませんが、統計ソフトウェアはランダムサンプリングを許可する必要があります。SOにもいくつかのヒントがあります。


0

トレーニングを分割し、サンプルを明示的にテストする必要がある理由について、直感に耳を傾けたいだけです。

あなたが持っている場合はの観測やメイク(実際には、、これはすぐに明らかでない場合(、そしておそらくはるかに少ない)、データの分割が、あなたは完全にすべてのポイントを分類する、書き込みいくつかの小規模な例ダウン、例えば、、そしてこれを自分自身に納得させる)。n n 1 n = 2nnn1n=2

この分割プロセスは、問題に関連しているがまだ観察していないデータポイントを予測する可能性非常に低いため、これは過剰適合と呼ばれます。

もちろん、これらの予測プ​​ラットフォームを構築する全体のポイントは、これまでにないデータに適用できるツールを作成することです。データをトレーニングサンプルとテストサンプルに分割することは、この自己盲検をシミュレートし、モデルを上記の方法でオーバーフィットから保護する試みです。


0

オーバーフィッティングを取得するために100%の精度は必要ありません。十分なバケットがあると、再現性のない結果(サンプルからひどく見えるもの)を得ることができます。

ランセットの抜粋記事をご覧ください。サンプルを非常に細かくバケットに切り刻む方法について説明しています。 ミュンヒハウゼンの統計グリッド これは、XKCD漫画の重要な基盤でもあります

100%の精度を達成することは、一見うまく機能する分類器を見つけることからほんの少しの距離です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.