Skip to content

Commit f17c96a

Browse files
committed
Add demo script for typed optimization
1 parent 1a03b05 commit f17c96a

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import numpy as np
2+
from bayes_opt import BayesianOptimization, acquisition
3+
from sklearn.ensemble import GradientBoostingClassifier
4+
from sklearn.datasets import load_digits
5+
from sklearn.model_selection import KFold
6+
from sklearn.metrics import log_loss
7+
import matplotlib.pyplot as plt
8+
from tqdm import tqdm
9+
10+
N_FOLDS = 10
11+
N_START = 2
12+
N_ITER = 25 - N_START
13+
# Load data
14+
data = load_digits()
15+
16+
17+
# Define the hyperparameter space
18+
continuous_pbounds = {
19+
'log_learning_rate': (-10, 0),
20+
'max_depth': (1, 6),
21+
'min_samples_split': (2, 6)
22+
}
23+
24+
discrete_pbounds = {
25+
'log_learning_rate': (-10, 0),
26+
'max_depth': (1, 6, int),
27+
'min_samples_split': (2, 6, int)
28+
}
29+
30+
kfold = KFold(n_splits=N_FOLDS, shuffle=True, random_state=42)
31+
32+
res_continuous = []
33+
res_discrete = []
34+
35+
METRIC_SIGN = -1
36+
37+
for i, (train_idx, test_idx) in enumerate(tqdm(kfold.split(data.data), total=N_FOLDS)):
38+
def gboost(log_learning_rate, max_depth, min_samples_split):
39+
clf = GradientBoostingClassifier(
40+
n_estimators=10,
41+
max_depth=int(max_depth),
42+
learning_rate=np.exp(log_learning_rate),
43+
min_samples_split=int(min_samples_split),
44+
random_state=42 + i
45+
)
46+
clf.fit(data.data[train_idx], data.target[train_idx])
47+
#return clf.score(data.data[test_idx], data.target[test_idx])
48+
return METRIC_SIGN * log_loss(data.target[test_idx], clf.predict_proba(data.data[test_idx]), labels=list(range(10)))
49+
50+
continuous_optimizer = BayesianOptimization(
51+
f=gboost,
52+
acquisition_function=acquisition.ExpectedImprovement(1e-1),
53+
pbounds=continuous_pbounds,
54+
verbose=0,
55+
random_state=42,
56+
)
57+
58+
discrete_optimizer = BayesianOptimization(
59+
f=gboost,
60+
acquisition_function=acquisition.ExpectedImprovement(1e-1),
61+
pbounds=discrete_pbounds,
62+
verbose=0,
63+
random_state=42,
64+
)
65+
continuous_optimizer.maximize(init_points=2, n_iter=N_ITER)
66+
discrete_optimizer.maximize(init_points=2, n_iter=N_ITER)
67+
res_continuous.append(METRIC_SIGN * continuous_optimizer.space.target)
68+
res_discrete.append(METRIC_SIGN * discrete_optimizer.space.target)
69+
70+
score_continuous = []
71+
score_discrete = []
72+
73+
for fold in range(N_FOLDS):
74+
best_in_fold = min(np.min(res_continuous[fold]), np.min(res_discrete[fold]))
75+
score_continuous.append(np.minimum.accumulate((res_continuous[fold] - best_in_fold)))
76+
score_discrete.append(np.minimum.accumulate((res_discrete[fold] - best_in_fold)))
77+
78+
mean_continuous = np.mean(score_continuous, axis=0)
79+
quantiles_continuous = np.quantile(score_continuous, [0.1, 0.9], axis=0)
80+
mean_discrete = np.mean(score_discrete, axis=0)
81+
quantiles_discrete = np.quantile(score_discrete, [0.1, 0.9], axis=0)
82+
83+
84+
plt.figure(figsize=(10, 5))
85+
plt.plot((mean_continuous), label='Continuous best seen')
86+
plt.fill_between(range(N_ITER + N_START), quantiles_continuous[0], quantiles_continuous[1], alpha=0.3)
87+
plt.plot((mean_discrete), label='Discrete best seen')
88+
plt.fill_between(range(N_ITER + N_START), quantiles_discrete[0], quantiles_discrete[1], alpha=0.3)
89+
90+
plt.xlabel('Number of iterations')
91+
plt.ylabel('Score')
92+
plt.legend(loc='best')
93+
plt.grid()
94+
plt.savefig('discrete_vs_continuous.png')

0 commit comments

Comments
 (0)