การปรับ Hyperparameter ใน Python
Alex Scriven
Data Scientist
ไฮเปอร์พารามิเตอร์บางตัวควรปรับก่อนตัวอื่น
แล้วควรลองค่าไหนสำหรับไฮเปอร์พารามิเตอร์?
มาดูเคล็ดลับสำคัญกัน!
ระวังการเลือกไฮเปอร์พารามิเตอร์ที่ขัดแย้งกัน
LogisticRegression() มีตัวเลือก solver และ penalty ที่อาจขัดแย้งกันThe 'newton-cg', 'sag' and 'lbfgs' solvers support only l2 penalties.
บางกรณีไม่มีข้อความแจ้งชัด แต่จะถูก 'ละเว้น' แทน (เช่น ElasticNet กับไฮเปอร์พารามิเตอร์ normalize):
This parameter is ignored when fit_intercept is set to False
อย่าลืมอ่านเอกสารของ Scikit Learn!
ระวังการตั้งค่าที่ไม่สมเหตุสมผลสำหรับอัลกอริทึมต่างๆ:
การบันทึกค่าที่เหมาะสมสำหรับไฮเปอร์พารามิเตอร์ไว้เป็นสิ่งที่คุ้มค่า
ในแบบฝึกหัดก่อนหน้า เราสร้างโมเดลแบบนี้:
knn_5 = KNeighborsClassifier(n_neighbors=5)
knn_10 = KNeighborsClassifier(n_neighbors=10)
knn_20 = KNeighborsClassifier(n_neighbors=20)
วิธีนี้ค่อนข้างไม่มีประสิทธิภาพ มีวิธีที่ดีกว่านี้ไหม?
ลองใช้ for loop วนซ้ำผ่านตัวเลือกต่างๆ:
neighbors_list = [3,5,10,20,50,75]accuracy_list = []for test_number in neighbors_list: model = KNeighborsClassifier(n_neighbors=test_number) predictions = model.fit(X_train, y_train).predict(X_test)accuracy = accuracy_score(y_test, predictions) accuracy_list.append(accuracy)
เก็บผลลัพธ์ไว้ใน DataFrame เพื่อดูข้อมูล:
results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
print(results_df)

มาสร้างกราฟ learning curve กัน
คราวนี้จะทดสอบค่าเพิ่มเติมอีกมาก
neighbors_list = list(range(5,500, 5))accuracy_list = [] for test_number in neighbors_list: model = KNeighborsClassifier(n_neighbors=test_number) predictions = model.fit(X_train, y_train).predict(X_test) accuracy = accuracy_score(y_test, predictions) accuracy_list.append(accuracy) results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
พล็อต DataFrame ขนาดใหญ่ขึ้นได้เลย:
plt.plot(results_df['neighbors'], results_df['accuracy'])# Add the labels and title plt.gca().set(xlabel='n_neighbors', ylabel='Accuracy', title='Accuracy for different n_neighbors') plt.show()
กราฟที่ได้:

ฟังก์ชัน range ของ Python ไม่รองรับค่าทศนิยม
เคล็ดลับที่มีประโยชน์คือใช้ np.linspace(start, end, num) ของ NumPy
num) ที่กระจายเท่ากันในช่วง (start, end) ที่กำหนดprint(np.linspace(1,2,5))
[1. 1.25 1.5 1.75 2. ]
การปรับ Hyperparameter ใน Python