Apa strategi yang tepat untuk memisahkan dataset?
Saya meminta umpan balik pada pendekatan berikut (tidak pada parameter individu seperti test_size
atau n_iter
, tetapi jika saya menggunakan X
, y
, X_train
, y_train
, X_test
, dan y_test
tepat dan jika urutan masuk akal):
(memperluas contoh ini dari dokumentasi scikit-learn)
1. Muat dataset
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. Bagi pelatihan dan set tes (misalnya, 80/20)
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
3. Pilih penduga
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. Pilih iterator cross-validasi
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. Setel hyperparameter
menerapkan iterator cross-validasi pada set pelatihan
from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)
6. Algoritme debug dengan kurva belajar
X_train
dibagi secara acak menjadi pelatihan dan satu set tes 10 kali ( n_iter=10
). Setiap titik pada kurva skor pelatihan adalah rata-rata 10 skor di mana model dilatih dan dievaluasi pada contoh pelatihan i pertama . Setiap titik pada kurva skor validasi silang adalah rata-rata 10 skor di mana model dilatih pada contoh pelatihan i pertama dan dievaluasi pada semua contoh set tes.
from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()
plot_learning_curve () dapat ditemukan di versi dev saat ini scikit-learn (0,15-git).
7. Evaluasi akhir pada set tes
classifier.score(X_test, y_test)
7a. Tes terlalu pas dalam pemilihan model dengan validasi silang bersarang (menggunakan seluruh dataset)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
Pertanyaan tambahan: Apakah masuk akal untuk mengganti langkah 7 dengan validasi silang bersarang? Atau harus bersarang cv dilihat sebagai pelengkap untuk langkah 7
(kode ini sepertinya bekerja dengan k-fold cross validation di scikit-learn, tetapi tidak dengan shuffle & split. Jadi cv
perlu diubah di atas untuk membuat kode itu berfungsi)
8. Melatih model akhir pada seluruh dataset
classifier.fit(X, y)
EDIT: Saya sekarang setuju dengan cbeleites bahwa langkah 7a tidak masuk akal dalam urutan ini. Jadi saya tidak akan mengadopsi itu.