GBDT调参--贝叶斯调参

在这里插入图片描述
随机抽特征和随机抽样本

  n_estimators 是控制森林中树木的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越 大,模型的效果往往越好。但是相应的,任何模型都有决策边  n_estimators达到一定的程度之后,随机森林的 精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越 长。对于这个参数,我们是渴望在训练难度和模型效果之间取得平衡。
  ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e97ba27347c84304984b822aefd61399.png)

在这里插入图片描述
在这里插入图片描述

import pandas as pd
import numpy as np
import sklearn
import matplotlib as mlp
import matplotlib.pyplot as plt
import time
from sklearn.ensemble import RandomForestClassifier as RFR
from sklearn.ensemble import GradientBoostingRegressor as GBR
from sklearn.model_selection import cross_validate,KFold
import hyperopt
from hyperopt import hp,fmin,tpe,Trials,partial
from hyperopt.early_stop import no_progress_loss
data=pd.read_csv(r"D:\caicai_sklearn\caicai_datasets\House Price\train_encode.csv",index_col=0)
X=data.iloc[:,:-1]
y=data.iloc[:,-1]
#定义参数init需要的算法
rf=RFR(n_estimators=89,max_depth=22,max_features=14,min_impurity_decrease=0,
      random_state=1412,verbose=False,n_jobs=-1)
#第三步骤,定义目标函数、参数空间,优化函数,验证函数
#目标函数:
def hyperopt_objective(params):
    reg=GBR(n_estimators=int(params['n_estimators'])
            ,learning_rate=params['lr']
            ,criterion=params['criterion']
            ,loss=params['loss']
            ,max_depth=int(params['max_depth'])
            ,max_features=params['max_features']
            ,subsample=params['subsample']
            ,min_impurity_decrease=params['min_impurity_decrease']
            ,init=rf#初始化
            ,random_state=1412
            ,verbose=False#是否打印过程
            )
    cv=KFold(n_splits=5,shuffle=True,random_state=1412)
    validation_loss=cross_validate(reg,X,y
                                  ,scoring='neg_root_mean_squared_error'
                                   ,cv=cv
                                   ,verbose=False
                                   ,n_jobs=-1
                                   ,error_score='raise'
                                  )
    return np.mean(abs(validation_loss['test_score']))
    #cross_validate返回train/test数据集上的每折得分
    '''cross_validate函数在error_score='raise'时,如果在交叉验证过程中出现错误,
    它会抛出一个异常。这通常用于调试模型的目的,因为它会中断交叉验证过程,
    提醒开发者注意到一些潜在的问题,如数据质量问题、模型不适合数据等。
    2.2 平均平方误差(MSE)
均方误差是指参数估计值与参数真值之差平方的期望值,记为MSE。MSE是衡量平均误差的一种较方便的方法,
MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
MSE数值大小本身没有意义,随着样本增加,MSE必然增加,也就是说,不同的数据集的情况下,MSE比较没有意义
均方根误差(RMSE====MSE取根号
'''

```c
#参数空间
param_grid_simple={'n_estimators':hp.quniform("n_estimators",25,200,25)#均匀分布的浮点数,所以参数里面需要int,
                   #不均匀分布的浮点数,用uniform
                   ,'lr':hp.quniform("learning_rate",0.05,2.05,0.05)
                   ,"criterion":hp.choice("criterion",['friedman_mse',"squared_error",'mse'])
                   ,'loss':hp.choice('loss',['squared_error','absolute_error','huber','quantile'])
                   ,'max_depth':hp.quniform('max_depth',2,30,2)
                   ,'subsample':hp.quniform('subsample',0.1,0.8,0.1)
                   ,'max_features':hp.choice('max_features',['log2','sqrt',16,32,64,'auto'])
                   ,"min_impurity_decrease":hp.quniform('min_impurity_decrease',0,5,1)
                  }
#优化函数
def param_hyperopt(max_evals=100):
    #保存迭代过程
    trials=Trials()
    #设置提前停止
    early_stop_fn=no_progress_loss(100)#如果连续100次损失函数都没有下降的话,就停止
    #定义代理模型
    params_best=fmin(hyperopt_objective#目标函数
                    ,space=param_grid_simple
                    ,algo=tpe.suggest#代理模型,使用tpe
                    ,max_evals=max_evals
                    ,verbose=True
                    ,trials=trials
                    ,early_stop_fn=early_stop_fn
                    )
    #打印最有参数,fmin会自动打印最佳分数
    print("\n","\n",'best params:',params_best,"\n")
    return params_best,trials#就返回最优的参数
#验证函数(可选),这个过程和目标函数一样,boosting随机性,不一定能够被复现
def hyperopt_validation(params):
    reg=GBR(n_estimators=int(params['n_estimators'])
            ,learning_rate=params['lr']
            ,criterion=params['criterion']
            ,loss=params['loss']
            ,max_depth=int(params['max_depth'])
            ,max_features=params['max_features']
            ,subsample=params['subsample']
            ,min_impurity_decrease=params['min_impurity_decrease']
            ,init=rf#初始化
            ,random_state=1412
            ,verbose=False#是否打印过程
            )
    cv=KFold(n_splits=5,shuffle=True,random_state=1412)
    validation_loss=cross_validate(reg,X,y
                                  ,scoring='neg_root_mean_squared_error'
                                   ,cv=cv
                                   ,verbose=False
                                   ,n_jobs=-1
                                   ,error_score='raise'
                                  )
    return np.mean(abs(validation_loss['test_score']))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到best loss逐渐在缩小,说明缩小参数空间的方向是对的,可以不断地迭代这个过程

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用贝叶斯优化来调整LightGBM的参数是一种有效的方法。下面是一个使用贝叶斯调参的示例代码: ```python import lightgbm as lgb import numpy as np from sklearn.datasets import make_multilabel_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, f1_score from bayes_opt import BayesianOptimization # 生成随机的多标签分类数据集 X, y = make_multilabel_classification(n_samples=1000, n_features=20, n_classes=5) # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 将标签转换为LightGBM所需的格式 lgb_train = lgb.Dataset(X_train, y_train) # 定义要优化的目标函数 def lgb_eval(num_leaves, learning_rate, feature_fraction, bagging_fraction): params = { 'task': 'train', 'boosting_type': 'gbdt', 'objective': 'multilabel', 'metric': 'binary_logloss', 'num_leaves': int(num_leaves), 'learning_rate': learning_rate, 'feature_fraction': max(min(feature_fraction, 1), 0), 'bagging_fraction': max(min(bagging_fraction, 1), 0), } # 训练模型 model = lgb.train(params, lgb_train, num_boost_round=100) # 预测测试集 y_pred_prob = model.predict(X_test) y_pred = np.round(y_pred_prob) # 计算模型评估指标 f1 = f1_score(y_test, y_pred, average='micro') return f1 # 定义参数的搜索空间 pbounds = { 'num_leaves': (10, 50), 'learning_rate': (0.01, 0.1), 'feature_fraction': (0.1, 0.9), 'bagging_fraction': (0.8, 1.0), } # 创建Bayesian优化对象 optimizer = BayesianOptimization( f=lgb_eval, pbounds=pbounds, random_state=42, ) # 开始优化 optimizer.maximize(init_points=10, n_iter=10) # 输出最优参数 print(optimizer.max) ``` 在这个示例中,我们使用`make_multilabel_classification`函数生成了一个随机的多标签分类数据集,并将数据集划分为训练集和测试集。然后,我们定义了一个目标函数`lgb_eval`,其中包含将参数传递给LightGBM模型并计算F1得分的逻辑。接下来,我们定义了参数的搜索空间`pbounds`,并创建了一个Bayesian优化对象。最后,我们使用`maximize`函数开始进行优化,并输出最优参数。 请注意,这里使用了第三方库`bayes_opt`来实现贝叶斯优化,你需要先安装该库。你可以根据自己的数据和需求修改参数的搜索空间和目标函数。希望对你有帮助!如果有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值