这是我的第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、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。