กลยุทธ์ที่เหมาะสมสำหรับการแยกชุดข้อมูลคืออะไร?
ผมขอให้ความคิดเห็นเกี่ยวกับวิธีการดังต่อไปนี้ (ไม่ได้อยู่ในแต่ละพารามิเตอร์เหมือนtest_size
หรือn_iter
แต่ถ้าผมใช้X
, y
, X_train
, y_train
, X_test
และy_test
เหมาะสมและถ้าลำดับทำให้รู้สึก):
(ขยายตัวอย่างนี้จากเอกสาร scikit-Learn)
1. โหลดชุดข้อมูล
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
2. แบ่งออกเป็นชุดฝึกอบรมและทดสอบ (เช่น 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. เลือกเครื่องมือประมาณ
from sklearn.svm import SVC
estimator = SVC(kernel='linear')
4. เลือกตัววนซ้ำการตรวจสอบความถูกต้องข้าม
from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)
5. ปรับพารามิเตอร์ไฮเปอร์
การใช้ตัววนซ้ำการตรวจสอบข้ามกับชุดฝึกอบรม
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. แก้ไขอัลกอริทึมด้วยกราฟการเรียนรู้
X_train
จะถูกสุ่มแบ่งเป็นการฝึกอบรมและชุดทดสอบ 10 ครั้ง ( n_iter=10
) แต่ละจุดบนเส้นโค้งคะแนนการฝึกอบรมมีค่าเฉลี่ย 10 คะแนนซึ่งแบบจำลองได้รับการฝึกอบรมและประเมินผลในตัวอย่างการฝึกอบรมi ตัวแรก แต่ละจุดบนเส้นโค้งคะแนนการตรวจสอบข้ามคือค่าเฉลี่ย 10 คะแนนซึ่งแบบจำลองได้รับการฝึกในตัวอย่างการฝึกอบรมi ตัวแรกและประเมินจากตัวอย่างทั้งหมดของชุดการทดสอบ
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 ()สามารถพบได้ในเวอร์ชัน dev ปัจจุบันของ scikit-Learn (0.15-git)
7. การประเมินขั้นสุดท้ายของชุดทดสอบ
classifier.score(X_test, y_test)
7a ทดสอบ over-fitting ในการเลือกแบบจำลองด้วยการตรวจสอบความถูกต้องแบบซ้อน (ใช้ชุดข้อมูลทั้งหมด)
from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)
คำถามเพิ่มเติม: คุณควรแทนที่ขั้นตอนที่ 7 ด้วยการตรวจสอบความถูกต้องข้ามแบบซ้อนหรือไม่? หรือควรซ้อน cv ให้เป็นขั้นตอนที่ 7
(ดูเหมือนว่ารหัสจะทำงานกับการตรวจสอบความถูกต้องข้ามของ k-fold ใน scikit-Learn แต่ไม่ใช่กับ shuffle & split ดังนั้นcv
จะต้องมีการเปลี่ยนแปลงด้านบนเพื่อให้โค้ดทำงานได้)
8. ฝึกโมเดลสุดท้ายบนชุดข้อมูลทั้งหมด
classifier.fit(X, y)
แก้ไข: ตอนนี้ฉันเห็นด้วยกับ cbeleites ขั้นตอนที่ 7a ไม่สมเหตุสมผลในลำดับนี้ ดังนั้นฉันจะไม่ยอมรับสิ่งนั้น