用贝叶斯优化的方法优化xgboost的参数

除了我们平常所做的网格搜索,随机搜索外,我发现贝叶斯优化的方法挺不错,然后我就尝试了一下,发现效果挺好的,我这里把我的代码分享出来:

贝叶斯优化通过基于目标函数的过去评估结果建立替代函数(概率模型),来找到最小化目标函数的值。贝叶斯方法与随机或网格搜索的不同之处在于,它在尝试下一组超参数时,会参考之前的评估结果,因此可以省去很多无用功。

超参数的评估代价很大,因为它要求使用待评估的超参数训练一遍模型,而许多深度学习模型动则几个小时几天才能完成训练,并评估模型,因此耗费巨大。贝叶斯调参发使用不断更新的概率模型,通过推断过去的结果来“集中”有希望的超参数。

1 导入库包

from skopt import BayesSearchCV
import xgboost as xgb
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.model_selection import StratifiedKFold
import numpy as np
from sklearn.utils import shuffle

2 加载数据


train_path='ads_train.csv'
train_data=pd.read_csv(train_path)

3 数据集特征处理

train_data = shuffle(train_data)
X=train_data[['isbuyer', 'buy_freq', 'visit_freq', 'buy_interval',
       'sv_interval', 'expected_time_buy', 'expected_time_visit', 'last_buy', 'multiple_buy', 'multiple_visit', 'uniq_urls',
       'num_checkins']]
Y=train_data[['y_buy']]
X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.2)

优化代码

ITERATIONS=100
# Classifier
bayes_cv_tuner = BayesSearchCV(
    estimator = xgb.XGBClassifier(
        n_jobs = 1,
        objective = 'binary:logistic',
        eval_metric = 'auc',
        silent=1,
        tree_method='approx'
    ),
    search_spaces = {
        'learning_rate': (0.01, 1.0, 'log-uniform'),
        'min_child_weight': (0, 10),
        'max_depth': (0, 50),
        'max_delta_step': (0, 20),
        'subsample': (0.01, 1.0, 'uniform'),
        'colsample_bytree': (0.01, 1.0, 'uniform'),
        'colsample_bylevel': (0.01, 1.0, 'uniform'),
        'reg_lambda': (1e-9, 1000, 'log-uniform'),
        'reg_alpha': (1e-9, 1.0, 'log-uniform'),
        'gamma': (1e-9, 0.5, 'log-uniform'),
        'min_child_weight': (0, 5),
        'n_estimators': (50, 100),
        'scale_pos_weight': (1e-6, 500, 'log-uniform')
    },    
    scoring = 'roc_auc',
    cv = StratifiedKFold(
        n_splits=5,
        shuffle=True,
        random_state=42
    ),
    n_jobs = 6,
    n_iter = ITERATIONS,   
    verbose = 0,
    refit = True,
    random_state = 42
)

def status_print(optim_result):
    """Status callback durring bayesian hyperparameter search"""
    
    # Get all the models tested so far in DataFrame format
    all_models = pd.DataFrame(bayes_cv_tuner.cv_results_)    
    
    # Get current parameters and the best parameters    
    best_params = pd.Series(bayes_cv_tuner.best_params_)
    print('Model #{}\nBest ROC-AUC: {}\nBest params: {}\n'.format(
        len(all_models),
        np.round(bayes_cv_tuner.best_score_, 4),
        bayes_cv_tuner.best_params_
    ))
    print(dict(bayes_cv_tuner.best_params_))
    
    
    # Save all model results
    clf_name = bayes_cv_tuner.estimator.__class__.__name__
    all_models.to_csv(clf_name+"_cv_results.csv")

result = bayes_cv_tuner.fit(X.values, Y.values, callback=status_print)

参考文献

Bayesian hyperparameter tuning of xgBoost
自动机器学习超参数调整(贝叶斯优化)

贝叶斯优化是一种用于优化黑盒函数的方法,它通过不断地探索和利用已知的函数值来寻找全局最优解。而XGBoost是一种梯度提升树算法,它在机器学习中广泛应用于分类和回归问题。 贝叶斯优化XGBoost是指使用贝叶斯优化方法来调整XGBoost模型的超参数,以获得更好的性能。在传统的网格搜索或随机搜索中,需要手动指定超参数的搜索范围和步长,然后通过交叉验证等方法评估模型性能。而贝叶斯优化则可以自动地根据已有的观测结果来选择下一个要尝试的超参数组合,从而更高效地找到最优解。 在贝叶斯优化XGBoost中,首先需要定义一个目标函数,该函数接受XGBoost的超参数作为输入,并返回模型在验证集上的性能指标,例如准确率或均方误差。然后,通过不断地观测目标函数的输出结果,贝叶斯优化算法会根据已有的观测结果来估计超参数的性能,并选择下一个要尝试的超参数组合。这样循环迭代,直到达到预定的迭代次数或找到满意的超参数组合。 贝叶斯优化XGBoost的步骤如下: 1. 定义目标函数:根据问题的具体情况,定义一个评估XGBoost模型性能的目标函数。 2. 定义超参数空间:确定XGBoost模型的超参数以及它们的搜索范围。 3. 初始化观测结果:随机选择一组超参数进行初始观测,并记录它们的性能指标。 4. 迭代优化:根据已有的观测结果,使用贝叶斯优化算法选择下一个要尝试的超参数组合,并进行模型训练和性能评估。 5. 终止条件:达到预定的迭代次数或找到满意的超参数组合时终止。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

农民小飞侠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值