Mengapa saya mendapatkan pohon keputusan akurasi 100%?


38

Saya mendapatkan akurasi 100% untuk pohon keputusan saya. Apa yang saya lakukan salah?

Ini kode saya:

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
Menurut Anda mengapa Anda melakukan sesuatu yang salah? Mungkin data Anda sedemikian rupa sehingga Anda dapat mencapai
klasifikasi

64
Kebetulan, +1 bertanya-tanya apakah ada sesuatu yang salah dengan akurasi 100%. Terlalu banyak orang akan berpikir model mereka hebat ...
S. Kolassa - Reinstate Monica

1
Di R ada paket (tanda sisipan) untuk secara otomatis membagi dataset menjadi dua kelompok, satu untuk data pelatihan dan yang lainnya untuk menguji data. Saya menyebut proses sebagai partisi data. Saya percaya ada paket serupa di Python untuk mencapai partisi data juga.
Anastasiya-Romanova 秀

Bacaan latar belakang yang bermanfaat: Kesalahan Umum dalam ML
smci

3
@ Anastasiya-Romanova 秀 Hampir semua perpustakaan ML serius berisi fungsi ini, termasuk yang digunakan oleh OP (OP bahkan mengimpor fungsionalitas yang relevan, dan hanya tidak menggunakannya karena alasan tertentu).
Konrad Rudolph

Jawaban:


79

Sampel tes Anda adalah bagian dari sampel pelatihan Anda:

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

Ini berarti bahwa Anda mengevaluasi model Anda pada bagian dari data pelatihan Anda, yaitu, Anda melakukan evaluasi dalam sampel. Akurasi dalam sampel adalah indikator yang terkenal buruk untuk akurasi out-of-sample, dan memaksimalkan akurasi dalam sampel dapat menyebabkan overfitting. Oleh karena itu, seseorang harus selalu mengevaluasi suatu model pada sampel ketidaksepakatan yang benar-benar independen dari data pelatihan.

Pastikan pelatihan Anda dan data pengujian Anda terpisah, misalnya,

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

2
Akan lebih baik untuk digunakan sklearn.model_selection.train_test_splitseperti yang disarankan Juan Ignacio Gil karena ini juga mengocok set dan menghindari kekhawatiran jika dataset tidak acak dalam memesan. Ini juga lebih jelas karena menunjukkan niat, dan secara otomatis menangani perubahan dalam ukuran dataset.
Jack Aidley

1
@JackAidley: Saya setuju (dan meningkatkan jawaban Juan beberapa hari yang lalu). Yang lebih baik adalah membuat split deterministik untuk debugging dengan mengatur seed number acak .
S. Kolassa - Reinstate Monica

@StephanKolassa Hai, saya telah mengutak-atik dengan dataset Iris, dan setelah menggunakan GridSearchCVdengan data pelatihan, untuk akurasi pengujian saya mendapatkan 100% KNeighborsClassifier. Saya telah menggunakan test_train_splituntuk memisahkan dataset. Apa yang bisa saya lakukan salah di sini?
Sndn

19

Anda mendapatkan akurasi 100% karena Anda menggunakan bagian dari data pelatihan untuk pengujian. Pada saat pelatihan, pohon keputusan memperoleh pengetahuan tentang data itu, dan sekarang jika Anda memberikan data yang sama untuk memprediksi itu akan memberikan nilai yang persis sama. Itu sebabnya pohon keputusan menghasilkan hasil yang benar setiap kali.

Untuk masalah pembelajaran mesin, pelatihan dan set data uji harus dipisahkan. Keakuratan model dapat ditentukan hanya ketika kita memeriksa bagaimana model memprediksi nilai yang tidak diketahui.


17

Seperti yang dikatakan pengguna lain kepada Anda, Anda menggunakan sebagai set tes subset dari set kereta, dan pohon keputusan sangat rentan terhadap overfitting.

Anda hampir memilikinya ketika Anda mengimpor

from sklearn.cross_validation import train_test_split

Tapi kemudian Anda tidak menggunakan fungsinya. Anda seharusnya sudah melakukan:

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

untuk mendapatkan kereta acak dan set tes


2

Seperti yang ditunjukkan oleh @Stephan Kolassa dan @Sanjay Chandlekar, ini disebabkan oleh fakta bahwa sampel uji Anda adalah bagian dari sampel pelatihan Anda.

Namun, untuk pemilihan sampel tersebut, pengambilan sampel acak akan lebih tepat untuk memastikan bahwa kedua sampel tersebut representatif. Bergantung pada struktur data Anda, Anda mungkin juga mempertimbangkan pengambilan sampel acak bertingkat.

Saya tidak lancar menggunakan Python tetapi perangkat lunak statistik apa pun harus memungkinkan pengambilan sampel secara acak; beberapa petunjuk juga tersedia di SO .


0

Hanya ingin berpadu intuisi untuk alasan mengapa Anda perlu membagi pelatihan dan menguji sampel secara eksplisit.

nnn-1n=2

Ini disebut overfitting karena proses pemisahan ini sangat tidak mungkin untuk memprediksi titik data yang relevan dengan masalah Anda tetapi belum Anda amati .

Tentu saja inti dari membangun platform prediksi ini adalah untuk membuat alat yang dapat diterapkan pada data yang belum pernah dilihat sebelumnya; Memisahkan data yang kita miliki ke dalam pelatihan dan sampel uji adalah upaya untuk mensimulasikan cara menyilaukan diri ini dan menjaga agar model kita tidak overfitting dengan cara di atas.


0

Anda tidak perlu akurasi 100% untuk mendapatkan overfitting. Dengan cukup banyak ember, Anda bisa mendapatkan hasil yang tidak dapat direproduksi (sesuatu yang akan terlihat tidak layak sampel).

Lihat artikel yang dikutip dari Lancet ini, yang menjelaskan metode memotong sampel ke dalam ember yang terlalu halus. Grid Statistik Munchausen Ini juga merupakan dasar untuk kartun XKCD Significant

Mencapai akurasi 100% hanya beberapa langkah dari menemukan classifier yang bekerja dengan baik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.