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)
machine-learning
python
cart
accuracy
Nadjla
sumber
sumber
Jawaban:
Sampel tes Anda adalah bagian dari sampel pelatihan Anda:
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,
sumber
sklearn.model_selection.train_test_split
seperti 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.GridSearchCV
dengan data pelatihan, untuk akurasi pengujian saya mendapatkan 100%KNeighborsClassifier
. Saya telah menggunakantest_train_split
untuk memisahkan dataset. Apa yang bisa saya lakukan salah di sini?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.
sumber
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
Tapi kemudian Anda tidak menggunakan fungsinya. Anda seharusnya sudah melakukan:
untuk mendapatkan kereta acak dan set tes
sumber
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 .
sumber
Hanya ingin berpadu intuisi untuk alasan mengapa Anda perlu membagi pelatihan dan menguji sampel secara eksplisit.
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.
sumber
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.
sumber