Phương pháp có thông tin: Thống kê Bayes

Tinh chỉnh siêu tham số trong Python

Alex Scriven

Data Scientist

Giới thiệu Bayes

 

Quy tắc Bayes:

Phương pháp thống kê dùng bằng chứng mới để lặp lại việc cập nhật niềm tin về một kết quả

  • Trực quan phù hợp với tìm kiếm có thông tin: càng có thêm bằng chứng, kết quả càng tốt.
Tinh chỉnh siêu tham số trong Python

Quy tắc Bayes

Quy tắc Bayes có dạng:

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

  • Vế trái = xác suất của A khi B đã xảy ra. B là bằng chứng mới.

    • Gọi là “hậu nghiệm” (posterior)
  • Vế phải là cách tính.

  • P(A) là “tiền nghiệm” (prior): giả thuyết ban đầu về biến cố. Khác với P(A|B), là xác suất khi có bằng chứng mới.
Tinh chỉnh siêu tham số trong Python

Quy tắc Bayes

 

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

  • P(B) là “xác suất biên” (marginal likelihood): xác suất quan sát được bằng chứng này
  • P(B|A) là “likelihood”: xác suất quan sát bằng chứng, khi biến cố quan tâm xảy ra.

Nghe có thể rối; hãy dùng ví dụ chẩn đoán y khoa.

Tinh chỉnh siêu tham số trong Python

Bayes trong y khoa

 

Ví dụ y khoa:

  • 5% dân số mắc một bệnh nào đó
    • P(D)
  • 10% người có yếu tố cơ địa (predisposed)
    • P(Pre)
  • 20% người mắc bệnh có yếu tố cơ địa
    • P(Pre|D)
Tinh chỉnh siêu tham số trong Python

Bayes trong y khoa

Xác suất một người bất kỳ mắc bệnh là bao nhiêu?

$$ P(D) = 0.05 $$

Đây là prior vì chưa có bằng chứng.

Xác suất người có yếu tố cơ địa mắc bệnh là bao nhiêu?

$$ 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 $$

Tinh chỉnh siêu tham số trong Python

Bayes trong tinh chỉnh siêu tham số

Ta áp dụng logic này vào tinh chỉnh siêu tham số:

  • Chọn một tổ hợp siêu tham số
  • Xây dựng mô hình
  • Thu thập bằng chứng mới (điểm của mô hình)
  • Cập nhật niềm tin và chọn siêu tham số tốt hơn ở vòng sau

Tinh chỉnh siêu tham số Bayes còn mới nhưng phổ biến cho bài toán lớn/phức tạp vì giúp tìm tổ hợp tối ưu hiệu quả

Tinh chỉnh siêu tham số trong Python

Tinh chỉnh Bayes với Hyperopt

 

Giới thiệu gói Hyperopt.

Để tinh chỉnh siêu tham số theo Bayes, cần:

  1. Đặt Miền: lưới tham số (có chút khác)
  2. Chọn thuật toán tối ưu (mặc định TPE)
  3. Hàm mục tiêu cần tối thiểu hóa: dùng 1-Accuracy
Tinh chỉnh siêu tham số trong Python

Hyperopt: Đặt Miền (lưới)

Nhiều cách đặt lưới:

  • Số đơn giản
  • Chọn từ danh sách
  • Phân phối giá trị

Hyperopt không dùng giá trị điểm cố định; mỗi điểm là phân phối xác suất cho từng siêu tham số.

Ta sẽ dùng phân phối đều đơn giản; còn nhiều loại khác trong tài liệu.

Tinh chỉnh siêu tham số trong Python

Miền tham số

 

Thiết lập lưới:

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),
}
Tinh chỉnh siêu tham số trong Python

Hàm mục tiêu

Hàm mục tiêu chạy thuật toán:

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
Tinh chỉnh siêu tham số trong Python

Chạy thuật toán

 

Chạy thuật toán:

best_result = fmin(
            fn=objective,
            space=space,
            max_evals=500, 
            rstate=np.random.default_rng(42),
            algo=tpe.suggest)
Tinh chỉnh siêu tham số trong Python

Ayo berlatih!

Tinh chỉnh siêu tham số trong Python

Preparing Video For Download...