朵小喵儿|LightGBM的参数详解以及如何调优( 四 )


定义一个单独的python函数
def feval_func(preds, train_data): # Define a formula that evaluates the results return ('feval_func_name', eval_result, False)
使用这个函数作为参数:
print('Start training...') lgb_train = lgb.train(..., metric=None, feval=feval_func)
注意:要使用feval函数代替度量 , 您应该设置度量参数 metric "None" 。
分类参数与回归参数
我之前提到的大多数事情对于分类和回归都是正确的 , 但是有些事情需要调整 。
具体你应该:
朵小喵儿|LightGBM的参数详解以及如何调优lightgbm最重要的参数我们已经在前面的部分中回顾并了解了有关lightgbm参数的知识 , 但是如果不提及Laurae令人难以置信的基准测试 , 那么关于增强树的文章将是不完整的 。
您可以了解用于lightGBM和XGBoost的许多问题的最佳默认参数 。
你可以查看这里() , 但一些最重要的结论是:
朵小喵儿|LightGBM的参数详解以及如何调优
朵小喵儿|LightGBM的参数详解以及如何调优
朵小喵儿|LightGBM的参数详解以及如何调优注意:绝对不要理会任何参数值的默认值 , 并根据您的问题进行调整 。也就是说 , 这些参数是超参数调整算法的一个很好的起点 。
Python中的Lightgbm参数调整示例最后 , 在解释完所有重要参数之后 , 该进行一些实验了!
我将使用最受欢迎的Kaggle竞赛之一:Santander Customer Transaction Prediction. 交易预测
我将使用本文介绍如何在任何脚本中的Python中运行超参数调整 。
在开始之前 , 一个重要的问题! 我们应该调整哪些参数?
请注意您要解决的问题 , 例如 , Santander 数据集高度不平衡 , 在调整时应考虑到这一点!
【朵小喵儿|LightGBM的参数详解以及如何调优】一些参数是相互依赖的 , 必须一起调整 。例如 , mindatainleaf取决于训练样本和numleaves的数量 。
注意:为超参数创建两个字典是一个好主意 , 一个字典包含您不想调整的参数和值 , 另一个字典包含您想要调整的参数和值范围 。
SEARCH_PARAMS = {'learning_rate': 0.4,'max_depth': 15,'num_leaves': 20,'feature_fraction': 0.8,'subsample': 0.2}FIXED_PARAMS={'objective': 'binary','metric': 'auc','is_unbalance':True,'boosting':'gbdt','num_boost_round':300,'early_stopping_rounds':30}这样 , 您就可以将基线值与搜索空间分开!
朵小喵儿|LightGBM的参数详解以及如何调优如果您查看了上一节 , 则会发现我在数据集上进行了14个以上的不同实验 。在这里 , 我解释了如何逐步调整超参数的值 。
创建基线训练代码:
from sklearn.metrics import roc_auc_score, roc_curvefrom sklearn.model_selection import train_test_splitimport neptunecontrib.monitoring.skopt as sk_utilsimport lightgbm as lgbimport pandas as pdimport neptuneimport skoptimport sysimport osSEARCH_PARAMS = {'learning_rate': 0.4,'max_depth': 15,'num_leaves': 32,'feature_fraction': 0.8,'subsample': 0.2}FIXED_PARAMS={'objective': 'binary','metric': 'auc','is_unbalance':True,'bagging_freq':5,'boosting':'dart','num_boost_round':300,'early_stopping_rounds':30}def train_evaluate(search_params):# you can download the dataset from this link()# import Dataset to play with itdata= http://kandian.youth.cn/index/pd.read_csv("sample_train.csv")X = data.drop(['ID_code', 'target'], axis=1)y = data['target']X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=1234)train_data = http://kandian.youth.cn/index/lgb.Dataset(X_train, label=y_train)valid_data = lgb.Dataset(X_valid, label=y_valid, reference=train_data)params = {'metric':FIXED_PARAMS['metric'],'objective':FIXED_PARAMS['objective'],**search_params}model = lgb.train(params, train_data,valid_sets=[valid_data],num_boost_round=FIXED_PARAMS['num_boost_round'],early_stopping_rounds=FIXED_PARAMS['early_stopping_rounds'],valid_names=['valid'])score = model.best_score['valid']['auc']return score


推荐阅读