lgb多分类参数设置

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41089007/article/details/90510248

数据

train_x, test_x, train_y, test_y = train_test_split(data, target, shuffle = True, random_state = 2019)
X_train = train_x.values
X_test = test_x.values
y_train = train_y.values
y_test = test_y.values

方式一:直接跑

params = {  
    'boosting_type': 'gbdt',  
    'objective': 'multiclass',  
    'num_class': 7,  
    'metric': 'multi_error',  
    'num_leaves': 120,  
    'min_data_in_leaf': 100,  
    'learning_rate': 0.06,  
    'feature_fraction': 0.8,  
    'bagging_fraction': 0.8,  
    'bagging_freq': 5,  
    'lambda_l1': 0.4,  
    'lambda_l2': 0.5,  
    'min_gain_to_split': 0.2,  
    'verbose': -1, 
}  
print('Training...')
trn_data = lgb.Dataset(X_train, y_train)
val_data = lgb.Dataset(X_test, y_test)
clf = lgb.train(params, 
                trn_data, 
                num_boost_round = 1000,
                valid_sets = [trn_data,val_data], 
                verbose_eval = 100, 
                early_stopping_rounds = 100)
print('Predicting...')
y_prob = clf.predict(X_test, num_iteration=clf.best_iteration)
y_pred = [list(x).index(max(x)) for x in y_prob]
print("AUC score: {:<8.5f}".format(metrics.accuracy_score(y_pred, test_y)))

方式二:加入交叉验证

param = { 
    'boosting_type': 'gbdt',  
    'objective': 'multiclass',  
    'num_class': 7,  
    'metric': 'multi_error',  
    'num_leaves': 300,  
    'min_data_in_leaf': 500,  
    'learning_rate': 0.01,  
    'feature_fraction': 0.8,  
    'bagging_fraction': 0.8,  
    'bagging_freq': 5,  
    'lambda_l1': 0.4,  
    'lambda_l2': 0.5,  
    'min_gain_to_split': 0.2,  
    'verbose': -1,
    'num_threads':4,
}
 
# 五折交叉验证
folds = KFold(n_splits=5, shuffle=False, random_state=2019)
oof = np.zeros([len(X_train),7])
predictions = np.zeros([len(X_test),7])
 
for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train, y_train)):
    print("fold n°{}".format(fold_+1))
    trn_data = lgb.Dataset(X_train[trn_idx], y_train[trn_idx])
    val_data = lgb.Dataset(X_train[val_idx], y_train[val_idx])
 
    num_round = 1000
    clf = lgb.train(param, 
                    trn_data, 
                    num_round, 
                    valid_sets = [trn_data, val_data], 
                    verbose_eval = 100, 
                    early_stopping_rounds = 100)
    #oof[val_idx] = clf.predict(X_train[val_idx], num_iteration=clf.best_iteration)    
    predictions += clf.predict(X_test, num_iteration=clf.best_iteration) / folds.n_splits
    #print(predictions)

————————————————
版权声明:本文为CSDN博主「睡熊猛醒」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41089007/article/details/90510248

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LGB(LightGBM)是一种基于决策树的集成学习算法,被广泛应用于分类、回归和排序等机器学习任务中。下面我们以分类问题为例,详细讲解LGB分类算法的流程和参数调优。 ## 数据准备 首先我们需要准备一个分类数据集,例如Iris数据集。这个数据集共有150个样本,每个样本包含4个特征和1个目标值(分别表示花萼长度、花萼宽度、花瓣长度、花瓣宽度和鸢尾花的类别)。我们需要将数据集划分为训练集和测试集,一般采用80%的数据作为训练集,20%的数据作为测试集。 ```python import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据集 iris = load_iris() X = pd.DataFrame(iris.data, columns=iris.feature_names) y = pd.Series(iris.target) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` ## 模型训练 接下来我们使用LGB算法来训练分类模型。LGB的核心思想是在训练过程中根据梯度信息调整样本的权重,从而提高模型的训练效率和精度。具体来说,LGB针对传统GBDT算法的缺陷进行了改进,如采用基于直方图的决策树算法、支持并行训练和预测等。 在训练LGB模型之前,我们需要先定义一些超参数,例如学习率、树的数量、最大深度、叶子节点数等。这些参数会影响模型的性能,因此需要通过交叉验证等方法进行调优。 ```python import lightgbm as lgb from sklearn.metrics import accuracy_score # 定义超参数 params = { 'learning_rate': 0.05, 'max_depth': 5, 'num_leaves': 30, 'objective': 'multiclass', 'num_class': 3, 'metric': 'multi_logloss', 'random_state': 42 } # 创建数据集 train_data = lgb.Dataset(X_train, label=y_train) test_data = lgb.Dataset(X_test, label=y_test) # 训练模型 model = lgb.train(params, train_data, num_boost_round=100, valid_sets=[train_data, test_data], early_stopping_rounds=10, verbose_eval=10) # 预测测试集 y_pred = model.predict(X_test, num_iteration=model.best_iteration) y_pred = [np.argmax(line) for line in y_pred] # 计算准确率 acc = accuracy_score(y_test, y_pred) print('Accuracy:', acc) ``` 在训练模型时,我们传入了训练集和测试集,并设置了最大迭代轮数为100轮,当模型在连续10轮中都没有提高时就停止训练。在训练过程中,LGB会显示每一轮的训练结果,包括训练集和测试集上的损失值。最后,我们通过预测测试集并计算准确率来评估模型的性能。 ## 超参数调优 上面的模型训练中,我们使用了一组默认的超参数。实际上,不同的数据集和任务可能需要不同的超参数设置,因此需要进行调优。下面介绍几种常用的调优方法。 ### 网格搜索 网格搜索是最简单的调优方法之一,它通过穷举所有超参数组合来寻找最优模型。例如,我们可以定义一个学习率列表、一个最大深度列表和一个叶子节点数列表,然后遍历所有组合,找到最优组合。 ```python from sklearn.model_selection import GridSearchCV # 定义超参数范围 param_grid = { 'learning_rate': [0.01, 0.05, 0.1], 'max_depth': [3, 5, 7], 'num_leaves': [10, 20, 30] } # 创建分类lgb_clf = lgb.LGBMClassifier(objective='multiclass', num_class=3, random_state=42) # 网格搜索 grid_search = GridSearchCV(estimator=lgb_clf, param_grid=param_grid, cv=5, scoring='accuracy', verbose=10, n_jobs=-1) grid_search.fit(X_train, y_train) # 输出最优参数 print('Best params:', grid_search.best_params_) ``` ### 随机搜索 网格搜索虽然简单易行,但它有一个明显的弱点:当超参数数量较多时,计算量会非常庞大。因此,我们可以采用随机搜索来替代网格搜索,它不需要遍历所有组合,而是从超参数空间中随机采样一些点进行训练和评估。 ```python from sklearn.model_selection import RandomizedSearchCV from scipy.stats import randint as sp_randint from scipy.stats import uniform as sp_uniform # 定义超参数分布 param_dist = { 'learning_rate': sp_uniform(loc=0.01, scale=0.1), 'num_leaves': sp_randint(10, 50), 'max_depth': sp_randint(3, 10) } # 随机搜索 random_search = RandomizedSearchCV(estimator=lgb_clf, param_distributions=param_dist, cv=5, scoring='accuracy', verbose=10, n_jobs=-1, n_iter=10) random_search.fit(X_train, y_train) # 输出最优参数 print('Best params:', random_search.best_params_) ``` ### 贝叶斯优化 贝叶斯优化是一种基于贝叶斯定理的超参数调优方法,它通过构建一个概率模型来估计不同超参数组合对模型性能的影响,并根据这个模型进行采样和评估。相比于网格搜索和随机搜索,贝叶斯优化能够更快地找到最优解,因为它能够利用历史数据来指导搜索过程。 ```python from skopt import BayesSearchCV from skopt.space import Real, Integer # 定义超参数空间 params_space = { 'learning_rate': Real(0.01, 0.1, prior='log-uniform'), 'max_depth': Integer(3, 10), 'num_leaves': Integer(10, 50) } # 贝叶斯优化 bayes_search = BayesSearchCV(estimator=lgb_clf, search_spaces=params_space, cv=5, scoring='accuracy', verbose=10, n_jobs=-1, n_iter=10) bayes_search.fit(X_train, y_train) # 输出最优参数 print('Best params:', bayes_search.best_params_) ``` ## 结论 本文介绍了LGB分类算法的流程和超参数调优方法,希望对读者有所帮助。在实际应用中,我们应该根据自己的数据集和任务来选择合适的超参数,并结合交叉验证等方法来评估模型的性能。同时,LGB算法还有很多其他的扩展和优化,例如使用GPU加速、集成学习等,读者可以进一步探索。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值