การปรับ Hyperparameter ใน Python
Alex Scriven
Data Scientist
กฎของ Bayes:
วิธีการทางสถิติที่ใช้ หลักฐานใหม่ เพื่ออัปเดต ความเชื่อ เกี่ยวกับ ผลลัพธ์ บางอย่างซ้ำๆ
กฎของ Bayes มีรูปแบบดังนี้:
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
ฝั่งซ้าย = ความน่าจะเป็นของ A เมื่อ B เกิดขึ้น โดย B คือหลักฐานใหม่
ฝั่งขวาคือวิธีคำนวณค่านี้
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
อาจดูซับซ้อน แต่ลองดูตัวอย่างการวินิจฉัยทางการแพทย์เพื่อทำความเข้าใจ
ตัวอย่างทางการแพทย์:
ความน่าจะเป็นที่บุคคลใดจะเป็นโรคนี้คือเท่าไร?
$$ P(D) = 0.05 $$
นี่คือ prior ของเราเนื่องจากยังไม่มีหลักฐาน
ความน่าจะเป็นที่ผู้มี ความเสี่ยงทางพันธุกรรม จะเป็นโรคนี้คือเท่าไร?
$$ P(D \mid Pre) = \frac{P(Pre \mid D) \, P(D)}{P(pre)} $$
$$ P(D \mid Pre) = \frac{0.2 \, * 0.05}{0.1} = 0.1 $$
นำตรรกะนี้มาใช้กับการปรับ Hyperparameter:
การปรับ Hyperparameter แบบ Bayesian เป็นวิธีที่ค่อนข้างใหม่ แต่ได้รับความนิยมสำหรับงานที่มี Hyperparameter ขนาดใหญ่และซับซ้อน เพราะช่วยหาค่าที่เหมาะสมได้ดีในสถานการณ์เหล่านั้น
แนะนำแพ็กเกจ Hyperopt
ในการปรับ Hyperparameter แบบ Bayesian จำเป็นต้อง:
มีหลายตัวเลือกสำหรับการกำหนดกริด:
Hyperopt ไม่ใช้ค่าจุดบนกริด แต่แต่ละจุดแทนความน่าจะเป็นของค่า Hyperparameter แต่ละค่าแทน
ที่นี่จะใช้การกระจายแบบ uniform อย่างง่าย แต่ยังมีตัวเลือกอื่นอีกมากในเอกสารประกอบ
ตั้งค่ากริด:
space = {
'max_depth': hp.quniform('max_depth', 2, 10, 2),
'min_samples_leaf': hp.quniform('min_samples_leaf', 2, 8, 2),
'learning_rate': hp.uniform('learning_rate', 0.01, 1, 55),
}
Objective Function ทำงานอัลกอริทึม:
def objective(params): params = {'max_depth': int(params['max_depth']), 'min_samples_leaf': int(params['min_samples_leaf']), 'learning_rate': params['learning_rate']} gbm_clf = GradientBoostingClassifier(n_estimators=500, **params)best_score = cross_val_score(gbm_clf, X_train, y_train, scoring='accuracy', cv=10, n_jobs=4).mean() loss = 1 - best_scorewrite_results(best_score, params, iteration) return loss
รันอัลกอริทึม:
best_result = fmin(
fn=objective,
space=space,
max_evals=500,
rstate=np.random.default_rng(42),
algo=tpe.suggest)
การปรับ Hyperparameter ใน Python