Tinh chỉnh siêu tham số trong Python
Alex Scriven
Data Scientist
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ả
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.
Vế phải là cách tính.
$$ P(A \mid B) = \frac{P(B \mid A) \, P(A)}{P(B)} $$
Nghe có thể rối; hãy dùng ví dụ chẩn đoán y khoa.
Ví dụ 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 $$
Ta áp dụng logic này vào tinh chỉnh siêu tham số:
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ả
Giới thiệu gói Hyperopt.
Để tinh chỉnh siêu tham số theo Bayes, cần:
Nhiều cách đặt lưới:
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.
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),
}
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_scorewrite_results(best_score, params, iteration) return loss
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