การปรับ Hyperparameter ใน Python
Alex Scriven
Data Scientist
งานที่ผ่านมา:
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 เพื่อวิเคราะห์
ถ้าต้องการทดสอบค่าของ 2 hyperparameter ล่ะ?
ใช้อัลกอริทึม GBM:
learn_rate [0.001, 0.01, 0.05]max_depth [4,6,8,10]ใช้ for loop (ซ้อนกัน) ได้เลย!
ขั้นแรก สร้างฟังก์ชันสร้างโมเดล:
def gbm_grid_search(learn_rate, max_depth): model = GradientBoostingClassifier( learning_rate=learn_rate, max_depth=max_depth)predictions = model.fit(X_train, y_train).predict(X_test)return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
ทีนี้วนลูปผ่านรายการ hyperparameter และเรียกใช้ฟังก์ชันได้เลย:
results_list = []
for learn_rate in learn_rate_list:
for max_depth in max_depth_list:
results_list.append(gbm_grid_search(learn_rate,max_depth))
นำผลลัพธ์ใส่ DataFrame แล้วแสดงผล:
results_df = pd.DataFrame(results_list, columns=['learning_rate', 'max_depth', 'accuracy'])
print(results_df)

การเพิ่ม hyperparameter และค่าต่าง ๆ ทำให้สร้างโมเดลมากขึ้นมาก
ถ้าใช้ cross-validation ล่ะ?
ถ้าต้องการเพิ่ม hyperparameter อีกล่ะ?
ซ้อน loop เพิ่มได้เลย!
# Adjust the list of values to test
learn_rate_list = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5]
max_depth_list = [4,6,8, 10, 12, 15, 20, 25, 30]
subsample_list = [0.4,0.6, 0.7, 0.8, 0.9]
max_features_list = ['auto', 'sqrt']
ปรับฟังก์ชัน:
def gbm_grid_search(learn_rate, max_depth,subsample,max_features):
model = GradientBoostingClassifier(
learning_rate=learn_rate,
max_depth=max_depth,
subsample=subsample,
max_features=max_features)
predictions = model.fit(X_train, y_train).predict(X_test)
return([learn_rate, max_depth, accuracy_score(y_test, predictions)])
ปรับ for loop (ซ้อนกัน):
for learn_rate in learn_rate_list:
for max_depth in max_depth_list:
for subsample in subsample_list:
for max_features in max_features_list:
results_list.append(gbm_grid_search(learn_rate,max_depth,
subsample,max_features))
results_df = pd.DataFrame(results_list, columns=['learning_rate',
'max_depth', 'subsample', 'max_features','accuracy'])
print(results_df)
ตอนนี้มีกี่โมเดล?
ซ้อน loop ไปเรื่อย ๆ ไม่ได้!
ยิ่งไปกว่านั้น ถ้าต้องการ:
มาสร้าง grid กัน:

ทำงานผ่านแต่ละเซลล์ใน grid:

(4,0.001) เทียบเท่ากับการสร้าง estimator ดังนี้:
GradientBoostingClassifier(max_depth=4, learning_rate=0.001)
ข้อดีของวิธีนี้:
ข้อดี:
ข้อเสียของวิธีนี้:
เราจะกล่าวถึงวิธี "เรียนรู้" ในภายหลัง!
การปรับ Hyperparameter ใน Python