贝叶斯优化优化参数,以Kmeans为例

贝叶斯优化有几个步骤:

  1. 构造黑盒目标函数
  2. 确定取值空间
  3. 构造贝叶斯优化器

下面以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
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值