ค่าไฮเปอร์พารามิเตอร์

การปรับ Hyperparameter ใน Python

Alex Scriven

Data Scientist

ค่าไฮเปอร์พารามิเตอร์

 

ไฮเปอร์พารามิเตอร์บางตัวควรปรับก่อนตัวอื่น

แล้วควรลองค่าไหนสำหรับไฮเปอร์พารามิเตอร์?

  • ขึ้นอยู่กับอัลกอริทึมและไฮเปอร์พารามิเตอร์แต่ละตัว
  • มีแนวทางปฏิบัติที่ดีและเคล็ดลับอยู่บ้าง

มาดูเคล็ดลับสำคัญกัน!

การปรับ Hyperparameter ใน Python

ไฮเปอร์พารามิเตอร์ที่ขัดแย้งกัน

ระวังการเลือกไฮเปอร์พารามิเตอร์ที่ขัดแย้งกัน

  • 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!

การปรับ Hyperparameter ใน Python

ค่าไฮเปอร์พารามิเตอร์ที่ไม่เหมาะสม

 

ระวังการตั้งค่าที่ไม่สมเหตุสมผลสำหรับอัลกอริทึมต่างๆ:

  • Random forest ที่มีจำนวนต้นไม้น้อยเกินไป
    • มี 2 ต้นแล้วจะเรียกว่า "ป่า" ได้หรือ?
  • KNN ที่ใช้เพียง 1 เพื่อนบ้าน
    • การเฉลี่ย "โหวต" จากคนเดียวไม่น่าเชื่อถือเท่าไร!
  • เพิ่มค่าไฮเปอร์พารามิเตอร์ทีละน้อยมากเกินไป

การบันทึกค่าที่เหมาะสมสำหรับไฮเปอร์พารามิเตอร์ไว้เป็นสิ่งที่คุ้มค่า

การปรับ Hyperparameter ใน Python

การทำให้การเลือกไฮเปอร์พารามิเตอร์เป็นอัตโนมัติ

 

ในแบบฝึกหัดก่อนหน้า เราสร้างโมเดลแบบนี้:

knn_5 =  KNeighborsClassifier(n_neighbors=5)
knn_10 = KNeighborsClassifier(n_neighbors=10)
knn_20  = KNeighborsClassifier(n_neighbors=20)

วิธีนี้ค่อนข้างไม่มีประสิทธิภาพ มีวิธีที่ดีกว่านี้ไหม?

การปรับ Hyperparameter ใน Python

การปรับไฮเปอร์พารามิเตอร์แบบอัตโนมัติ

ลองใช้ 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)
การปรับ Hyperparameter ใน Python

การปรับไฮเปอร์พารามิเตอร์แบบอัตโนมัติ

เก็บผลลัพธ์ไว้ใน DataFrame เพื่อดูข้อมูล:

results_df = pd.DataFrame({'neighbors':neighbors_list, 'accuracy':accuracy_list})
print(results_df)

ตารางค่าความแม่นยำตามจำนวนเพื่อนบ้าน

การปรับ Hyperparameter ใน Python

Learning Curves

มาสร้างกราฟ 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})
การปรับ Hyperparameter ใน Python

Learning Curves

พล็อต 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()
การปรับ Hyperparameter ใน Python

Learning Curves

กราฟที่ได้:

learning curve ของความแม่นยำเทียบกับจำนวนเพื่อนบ้านสำหรับ KNN

การปรับ Hyperparameter ใน Python

เคล็ดลับการสร้างชุดค่า

ฟังก์ชัน 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

มาฝึกกันเถอะ!

การปรับ Hyperparameter ใน Python

Preparing Video For Download...