贝叶斯优化有几个步骤:
- 构造黑盒目标函数
- 确定取值空间
- 构造贝叶斯优化器
下面以kmeans
为例:
步骤一:构造黑盒目标函数
这个函数主要是运行需要的函数,然后使用计算一个指标(只能是一个指标哈!),然后贝叶斯优化会在迭代的时候最大化这个指标,如果需要最小化这个指标,则可以在目标值前面加一个负号
def f_score(n_clusters, n_init, my_iter):
k_means = KMeans(n_clusters=int(n_clusters), n_init=int(n_init), max_iter=int(my_iter))
k_means.fit(data)
if k_means.labels_.max() == -1 or k_means.labels_.max() == 0 or \
k_means.labels_.max() == k_means.labels_.shape[0] - 1:
return -1
score = metrics.silhouette_score(data, k_means.labels_, metric='euclidean') # 使用轮廓系数作为最终指标,最大化轮廓系数
return score # 最后要输出一个指标,贝叶斯优化器会尝试最大化这个指标
步骤二:确定取值空间
这个主要是确定搜索值的范围的:[最小,最大]
pbounds = {'n_clusters': (4, 20),
'n_init': (5, 20),
'my_iter': (200, 500), }
步骤三:构造贝叶斯优化器
optimizer = BayesianOptimization(
f=f_score, # 黑盒目标函数
pbounds=pbounds, # 取值空间
verbose=2, # verbose = 2 时打印全部,verbose = 1 时打印运行中发现的最大值,verbose = 0 将什么都不打印
random_state=1,
)
全部代码
import pandas as pd
import numpy as np
from sklearn import metrics
from bayes_opt import BayesianOptimization
from sklearn.cluster import KMeans
# 步骤一:构造黑盒目标函数
def f_score(n_clusters, n_init, my_iter):
k_means = KMeans(n_clusters=int(n_clusters), n_init=int(n_init), max_iter=int(my_iter))
k_means.fit(data)
if k_means.labels_.max() == -1 or k_means.labels_.max() == 0 or \
k_means.labels_.max() == k_means.labels_.shape[0] - 1:
return -1
score = metrics.silhouette_score(data, k_means.labels_, metric='euclidean') # 使用轮廓系数作为最终指标,最大化轮廓系数
return score # 最后要输出一个指标,贝叶斯优化器会尝试最大化这个指标
if __name__ == '__main__':
data = pd.DataFrame(data=np.random.randint(0, 10, size=(2000, 10))) # 生成数据
# 步骤二:确定取值空间
pbounds = {'n_clusters': (4, 20),
'n_init': (5, 20),
'my_iter': (200, 500), }
# 步骤三:构造贝叶斯优化器
optimizer = BayesianOptimization(
f=f_score, # 黑盒目标函数
pbounds=pbounds, # 取值空间
verbose=2, # verbose = 2 时打印全部,verbose = 1 时打印运行中发现的最大值,verbose = 0 将什么都不打印
random_state=1,
)
# 开始运行
optimizer.maximize( # 运行
init_points=10, # 随机搜索的步数
n_iter=50, # 执行贝叶斯优化迭代次数
)
print(optimizer.max['params']) # 最优参数
print(optimizer.max['target']) # 最优值
输出为:
{'my_iter': 235.44227635380747, 'n_clusters': 19.807354168254797, 'n_init': 17.245557591846417}
0.08350507522285436