怎么使用Optuna根据数据找到XGBoost模型的最佳参数
时间: 2024-06-09 16:04:51 浏览: 146
optuna参数优化官方中文版帮助文档
5星 · 资源好评率100%
Optuna 是一个开源的超参数自动化调整框架,可以帮助我们快速找到最佳的超参数组合。下面是使用Optuna调整XGBoost模型参数的步骤:
1.导入必要的库
```python
import optuna
import xgboost as xgb
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
2.准备数据
这里使用波士顿房价数据集作为示例数据集。
```python
boston = load_boston()
X, y = boston.data, boston.target
```
3.划分训练集和测试集
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
4.定义目标函数
目标函数就是我们需要优化的函数,也就是模型的性能指标。这里我们使用均方误差(MSE)作为目标函数。
```python
def objective(trial):
# 定义超参数搜索空间
param = {
'objective': 'reg:squarederror',
'eval_metric': 'rmse',
'booster': 'gbtree',
'lambda': trial.suggest_loguniform('lambda', 1e-8, 1.0),
'alpha': trial.suggest_loguniform('alpha', 1e-8, 1.0),
'max_depth': trial.suggest_int('max_depth', 1, 9),
'eta': trial.suggest_loguniform('eta', 1e-8, 1.0),
'gamma': trial.suggest_loguniform('gamma', 1e-8, 1.0),
'grow_policy': trial.suggest_categorical('grow_policy', ['depthwise', 'lossguide']),
'subsample': trial.suggest_discrete_uniform('subsample', 0.1, 1.0, 0.1),
'colsample_bytree': trial.suggest_discrete_uniform('colsample_bytree', 0.1, 1.0, 0.1),
'min_child_weight': trial.suggest_int('min_child_weight', 1, 300)
}
# 训练模型
model = xgb.train(param, dtrain, num_boost_round=100)
y_pred = model.predict(dtest)
rmse = mean_squared_error(y_test, y_pred, squared=False)
return rmse
```
在这里,定义了一个名为 objective 的函数,它的输入参数是 trial,表示 Optuna 的一个试验对象。在函数中,首先定义了超参数的搜索空间,通过 trial 对象的 suggest_* 方法来设置每个超参数的搜索范围和方式。然后,使用 XGBoost 模型训练数据,并计算在测试集上的均方根误差(RMSE),作为目标函数的返回值。
5.创建数据集
```python
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
```
6.运行超参数自动化调整
```python
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=100)
```
在这里,首先创建了一个 study 对象,它代表了一个 Optuna 的试验。然后,调用 study 的 optimize 方法来运行超参数自动化调整,其中 n_trials 表示试验的次数。
7.输出结果
```python
print('Number of finished trials:', len(study.trials))
print('Best trial:', study.best_trial.params)
```
在这里,输出了试验的次数和最佳参数组合。
完整代码如下:
阅读全文