【Python机器学习系列】使用Optuna优化XGBoost分类模型的超参数(案例+源码)

这是我的第338篇原创文章。

一、引言

       Optuna是一个基于贝叶斯优化的超参数优化框架。它的目标是通过智能的搜索策略,尽可能少的实验次数找到最佳超参数组合。Optuna支持各种机器学习框架,包括Scikit-learn、PyTorch和TensorFlow等。比起网格搜索和随机搜索,Optuna最明显的优势就是快。虽然最后的提升效果未必有前两种好,但是在整体效率上来看,Optuna能够大大减少调参时间。

       使用Optuna进行调参的基本步骤如下:

  • 定义超参数搜索空间:使用Optuna的API定义超参数的搜索范围,例如学习率、层数等。
  • 获取最佳超参数:通过Optuna提供的API获取找到的最佳超参数组合。
  • 运行Optuna优化:使用Optuna的optimize函数运行优化过程,选择适当的搜索算法和优化目标。
  • 定义目标函数:编写一个目标函数,用于评估给定超参数组合的模型性能。

       以下是一个使用Optuna进行超参数优化的简单示例,假设我们使用Scikit-learn中的XGBoost进行分类:通过这个示例,你可以看到Optuna的简洁和易用性。通过定义搜索空间和目标函数,Optuna会自动选择最优的超参数组合。

二、实现过程

2.1 准备数据

data = pd.read_csv(r'Dataset.csv')
df = pd.DataFrame(data)
print(df.head())

df:

图片

2.2 提取目标变量和特征变量

target = 'target'
features = df.columns.drop(target)
print(data["target"].value_counts()) # 顺便查看一下样本是否平衡

2.3 划分数据集

X_train, X_test, y_train, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=0)

2.4 Optuna优化超参数

定义目标函数:

def objective(trial):
    # 定义超参数搜索范围
    params = {
        'objective': 'multi:softprob',
        'num_class': 2,
        'booster': 'gbtree',
        'eval_metric': 'mlogloss',
        'max_depth': trial.suggest_int('max_depth', 2, 10),
        'learning_rate': trial.suggest_loguniform('learning_rate', 0.001, 0.1),
        'subsample': trial.suggest_uniform('subsample', 0.1, 1.0),
        'colsample_bytree': trial.suggest_uniform('colsample_bytree', 0.1, 1.0),
        'min_child_weight': trial.suggest_int('min_child_weight', 1, 10),
    }

    # 训练和评估模型
    model = XGBClassifier(**params)
    model.fit(X_train, y_train)
    y_pred = model.predict_proba(X_test)
    loss = log_loss(y_test, y_pred)
    return loss

运行Optuna优化:

study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=50, show_progress_bar=True)

优化过程:

图片

获取最优的超参数:

best_params = study.best_params
print(f"Best Params: {best_params}")

结果:

图片

作者简介:

读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据杂坛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值