วิธีการแบบมีข้อมูล: สถิติ Bayesian

การปรับ Hyperparameter ใน Python

Alex Scriven

Data Scientist

บทนำ Bayes

 

กฎของ Bayes:

วิธีการทางสถิติที่ใช้ หลักฐานใหม่ เพื่ออัปเดต ความเชื่อ เกี่ยวกับ ผลลัพธ์ บางอย่างซ้ำๆ

  • สอดคล้องกับแนวคิดของการค้นหาแบบ มีข้อมูล ยิ่งมีหลักฐานมากขึ้น ยิ่งแม่นยำขึ้น
การปรับ Hyperparameter ใน Python

กฎของ Bayes

กฎของ Bayes มีรูปแบบดังนี้:

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • ฝั่งซ้าย = ความน่าจะเป็นของ A เมื่อ B เกิดขึ้น โดย B คือหลักฐานใหม่

    • เรียกว่า 'posterior'
  • ฝั่งขวาคือวิธีคำนวณค่านี้

  • P(A) คือ 'prior' หรือสมมติฐานเริ่มต้นเกี่ยวกับเหตุการณ์ ต่างจาก P(A|B) ซึ่งคือความน่าจะเป็น เมื่อมี หลักฐานใหม่
การปรับ Hyperparameter ใน Python

กฎของ Bayes

 

$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$

  • P(B) คือ 'marginal likelihood' หรือความน่าจะเป็นในการสังเกตหลักฐานใหม่นี้
  • P(B|A) คือ 'likelihood' หรือความน่าจะเป็นในการสังเกตหลักฐาน เมื่อกำหนดเหตุการณ์ที่สนใจ

อาจดูซับซ้อน แต่ลองดูตัวอย่างการวินิจฉัยทางการแพทย์เพื่อทำความเข้าใจ

การปรับ Hyperparameter ใน Python

Bayes ในทางการแพทย์

 

ตัวอย่างทางการแพทย์:

  • ประชากรทั่วไป 5% เป็นโรคหนึ่ง
    • P(D)
  • ประชากร 10% มีความเสี่ยงทางพันธุกรรม
    • P(Pre)
  • ผู้ป่วย 20% ที่เป็นโรคนี้มีความเสี่ยงทางพันธุกรรม
    • P(Pre|D)
การปรับ Hyperparameter ใน Python

Bayes ในทางการแพทย์

ความน่าจะเป็นที่บุคคลใดจะเป็นโรคนี้คือเท่าไร?

$$ 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 ใน Python

Bayes กับการปรับ Hyperparameter

นำตรรกะนี้มาใช้กับการปรับ Hyperparameter:

  • เลือกชุด Hyperparameter
  • สร้างโมเดล
  • รับ หลักฐาน ใหม่ (คะแนนของโมเดล)
  • อัปเดตความเชื่อและเลือก Hyperparameter ที่ดีขึ้นในรอบถัดไป

การปรับ Hyperparameter แบบ Bayesian เป็นวิธีที่ค่อนข้างใหม่ แต่ได้รับความนิยมสำหรับงานที่มี Hyperparameter ขนาดใหญ่และซับซ้อน เพราะช่วยหาค่าที่เหมาะสมได้ดีในสถานการณ์เหล่านั้น

การปรับ Hyperparameter ใน Python

การปรับ Hyperparameter แบบ Bayesian ด้วย Hyperopt

 

แนะนำแพ็กเกจ Hyperopt

ในการปรับ Hyperparameter แบบ Bayesian จำเป็นต้อง:

  1. กำหนด Domain: กริดของเรา (พร้อมรายละเอียดเพิ่มเติม)
  2. กำหนดอัลกอริทึมการหาค่าเหมาะสม (ใช้ค่าเริ่มต้น TPE)
  3. กำหนด Objective Function ที่ต้องการลดค่า: ใช้ 1-Accuracy
การปรับ Hyperparameter ใน Python

Hyperopt: กำหนด Domain (กริด)

มีหลายตัวเลือกสำหรับการกำหนดกริด:

  • ตัวเลขเดี่ยว
  • เลือกจากรายการ
  • การกระจายของค่า

Hyperopt ไม่ใช้ค่าจุดบนกริด แต่แต่ละจุดแทนความน่าจะเป็นของค่า Hyperparameter แต่ละค่าแทน

ที่นี่จะใช้การกระจายแบบ uniform อย่างง่าย แต่ยังมีตัวเลือกอื่นอีกมากในเอกสารประกอบ

การปรับ Hyperparameter ใน Python

Domain

 

ตั้งค่ากริด:

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),
}
การปรับ Hyperparameter ใน Python

Objective Function

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_score
write_results(best_score, params, iteration) return loss
การปรับ Hyperparameter ใน Python

รันอัลกอริทึม

 

รันอัลกอริทึม:

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
การปรับ Hyperparameter ใน Python

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

การปรับ Hyperparameter ใน Python

Preparing Video For Download...