lightbgm参数_参数调优LightGBM-商品分类-代码

article/2025/10/20 9:50:37

1.直接调用LightGBM内嵌的cv寻找最佳的参数n_estimators(弱分类器数目)

Otto商品分类数据

导入必要模型import lightgbm as lgbm

import pandas as pd

import numpy as np

from sklearn.model_selection import GridSearchCV

from sklearn.model_selection import StratifiedKFold

from sklearn.metrics import log_loss

from matplotlib import pyplot

import seaborn as sns

%matplotlib inline#读取数据

dpath = './logistic/'

train = pd.read_csv(dpath + "Otto_train_test.csv")

train.head()

355a6ec067f8056ad4ba33b5cb723b66.png

2b4be12b6019551365b385774fa23339.png

Variable Identification

选择该数据集是因为该数据特征单一,我们可以在特征工程方面少做些工作,集中精力放在参数调优上;

Target分布,看看各类样本分布是否均衡sns.countplot(train.target)

pyplot.xlabel('target')

pyplot.ylabel('Number of occurrences')

fe1a7533f9699c4cda3fd49bf65a0fdc.png

每类样本分布不是很均匀

特征编码# 将类别字符串变成数字

y_train = train['target'] #形式为Class_x

y_train = y_train.map(lambda s: s[6:])

y_train = y_train.map(lambda s: int(s) - 1)#将类别的形式由Class_x变为0-8之间的整数

train = train.drop(["id" , "target"] , axis = 1)

X_train = np.array(train)

默认参数,此时学习率为0.1,比较大,观察弱分类数目的大致范围(采用默认参数配置,看看模型是过拟合还是欠拟合)#直接调用lightgbm内嵌的交叉验证(cv),可对连续的n_estimators参数进行快速交叉验证

#而GridSearchCV只能对有限个参数进行交叉验证,且速度相对较慢

import json

def modelfit(params , alg , X_train , y_train , early_stopping_rounds=10):

lgbm_params = params.copy()

lgbm_params['num_class'] = 9

lgbm_params.pop('silent');

lgbmtrain = lgbm.Dataset(X_train , y_train , silent=True)

#num_boost_round为弱分类器数目,下面的代码参数里因为已经设置了early_stopping_rounds

#即性能未提升的次数超过过早停止设置的数值,则停止训练

cv_result = lgbm.cv(lgbm_params , lgbmtrain , num_boost_round=10000 , nfold=5 , stratified=True , shuffle=True , metrics='multi_logloss' , early_stopping_rounds=early_stopping_rounds , show_stdv=True , seed=0 )

print('best n_estimators:' , len(cv_result['multi_logloss-mean']))

print('best cv score:' , cv_result['multi_logloss-mean'][-1])

#cv_result.to_csv('lgbm1_nestimators.csv' , index_label='n_estimators')

json.dump(cv_result , open('lgbm_1.json' , 'w'))

#采用交叉验证得到的最佳参数n_estimators,训练模型

alg.set_params(n_estimators=len(cv_result['multi_logloss-mean']))

alg.fit(X_train , y_train)

#Predict training set:

train_predprob = alg.predict_proba(X_train)

logloss = log_loss(y_train , train_predprob)

#Print model report:

print("logloss of train :")

print (logloss)params = {'boosting_type': 'gbdt',

'objective': 'multiclass',

'nthread': -1,

'silent': True,#是否打印信息,默认False

'learning_rate': 0.1,

'num_leaves': 80,

'max_depth': 5,

'max_bin': 127,

'subsample_for_bin': 50000,

'subsample': 0.8,

'subsample_freq': 1,

'colsample_bytree': 0.8,

'reg_alpha': 1,

'reg_lambda': 0,

'min_split_gain': 0.0,

'min_child_weight': 1,

'min_child_samples': 20,

'scale_pos_weight': 1}

lgbm1 = lgbm.sklearn.LGBMClassifier(num_class=9 , n_estimators=1000 , seed=0 , **params)

modelfit(params , lgbm1 , X_train , y_train)

7c1dd1df8d9e89ab0b59d070fc55bac6.png#cv_result = pd.read_json('lgbm_1.json')

2.调整树的参数:max_depth & min_child_weight

(参数的步长为1;下一步是在最佳参数周围,将步长降为0.5,进行精细调整)

第一轮参数调整得到的n_estimators最优值(97),其余参数继续默认值

用交叉验证评价模型性能时,用scoring参数定义评价指标。评价指标是越高越好,因此用一些损失函数当评价指标时,需要再加负号,如neg_log_loss,neg_mean_squared_error详见sklearn文档:http://scikit-learn.org/stable/modules/model_evaluation.html#log-loss#max_depth 建议3-10,min_child_weight=1 / sqrt(ratio_rare_event) = 5.5

max_depth = range(6 , 10 , 1)

min_child_weight = range(1 , 5 , 1)

param_test2_1 = dict(max_depth=max_depth , min_child_weight=min_child_weight)

param_test2_1

7ac19dd6a7cf9c24801be139fcae6b09.png#prepare cross validation

from sklearn.model_selection import StratifiedKFold

kfold = StratifiedKFold(n_splits=5 , shuffle=True , random_state=3)params2 = {'boosting_type': 'gbdt',

'objective': 'multiclass',

'nthread': -1,

'silent': True,

'learning_rate': 0.1,

'num_leaves': 80,

'max_depth': 5,

'max_bin': 127,

'subsample_for_bin': 50000,

'subsample': 0.8,

'subsample_freq': 1,

'reg_alpha': 1,

'reg_lambda': 0,

'min_split_gain': 0.0,

'min_child_weight': 1,

'min_child_samples': 20,

'scale_pos_weight': 1}

lgbm2_1 = lgbm.sklearn.LGBMClassifier(num_class=9 , n_estimators=97 , seed=0 , **params2)

#GridSearchCV参数说明:(学习器 ,参数范围 ,评价指标 , cpu核心的使用数(-1为并行,使用全部的核) , 交叉验证一共多少折)

gsearch2_1 = GridSearchCV(lgbm2_1 , param_grid=param_test2_1 , scoring='neg_log_loss' , n_jobs = -1 , cv = kfold)

gsearch2_1.fit(X_train , y_train)

gsearch2_1.grid_scores_ , gsearch2_1.best_params_ , gsearch2_1.best_score_

1f50106e607e5ca27c2038e8cc8000fe.pnggsearch2_1.cv_results_{'mean_fit_time': array([0.76969552, 1.18755584, 1.14692926, 1.10005512, 1.48944592,

1.59057088, 1.21840544, 1.12013426, 1.28924704, 1.24068198,

1.15943041, 1.1189312 , 1.28796062, 1.25322876, 1.47233396,

1.35659175]),

'std_fit_time': array([0.37958056, 0.05846628, 0.04375209, 0.00765705, 0.22566673,

0.07160577, 0.06428244, 0.00558019, 0.01377198, 0.01874956,

0.03336754, 0.01611188, 0.00576565, 0.02922022, 0.20602699,

0.26722857]),

'mean_score_time': array([0.00937595, 0.00937572, 0.009376  , 0.00624833, 0.00845222,

0.00660481, 0.00760546, 0.00660472, 0.00312538, 0.0093771 ,

0.00312519, 0.00745149, 0.00600429, 0.00920706, 0.01297846,

0.00625076]),

'std_score_time': array([7.65543414e-03, 7.65523945e-03, 7.65547306e-03, 7.65261232e-03,

7.10425215e-03, 3.93223963e-03, 1.96087089e-03, 3.66865115e-03,

6.25076294e-03, 7.65636865e-03, 6.25038147e-03, 7.02576503e-03,

4.10190833e-07, 2.22884135e-03, 3.48157103e-03, 7.65558986e-03]),

'param_max_depth': masked_array(data=[6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9],

mask=[False, False, False, False, False, False, False, False,

False, False, False, False, False, False, False, False],

fill_value='?',

dtype=object),

'param_min_child_weight': masked_array(data=[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4],

mask=[False, False, False, False, False, False, False, False,

False, False, False, False, False, False, False, False],

fill_value='?',

dtype=object),

'params': [{'max_depth': 6, 'min_child_weight': 1},

{'max_depth': 6, 'min_child_weight': 2},

{'max_depth': 6, 'min_child_weight': 3},

{'max_depth': 6, 'min_child_weight': 4},

{'max_depth': 7, 'min_child_weight': 1},

{'max_depth': 7, 'min_child_weight': 2},

{'max_depth': 7, 'min_child_weight': 3},

{'max_depth': 7, 'min_child_weight': 4},

{'max_depth': 8, 'min_child_weight': 1},

{'max_depth': 8, 'min_child_weight': 2},

{'max_depth': 8, 'min_child_weight': 3},

{'max_depth': 8, 'min_child_weight': 4},

{'max_depth': 9, 'min_child_weight': 1},

{'max_depth': 9, 'min_child_weight': 2},

{'max_depth': 9, 'min_child_weight': 3},

{'max_depth': 9, 'min_child_weight': 4}],

'split0_test_score': array([-1.1095002 , -1.10093944, -1.11068332, -1.12581965, -1.10990165,

-1.11763534, -1.10955467, -1.12785983, -1.1136691 , -1.11892955,

-1.11057671, -1.1226148 , -1.11458382, -1.11135853, -1.11057671,

-1.1226148 ]),

'split1_test_score': array([-0.98243464, -0.98239904, -0.99364646, -0.98426716, -0.9881632 ,

-0.99487678, -0.9818681 , -0.98405452, -0.99288509, -0.99638123,

-0.98479146, -0.9849888 , -0.9911613 , -0.98937118, -0.98431879,

-0.98514942]),

'split2_test_score': array([-1.00126664, -1.01613241, -1.00794652, -1.00294229, -1.01308502,

-1.00274243, -1.00408767, -1.01815955, -1.01927451, -1.01020295,

-1.01639531, -1.00958675, -1.0077591 , -1.00663798, -1.00333139,

-1.00958675]),

'split3_test_score': array([-1.01232842, -1.02250884, -1.0030879 , -1.01277954, -1.01514669,

-1.01574748, -0.99794459, -1.00521546, -1.01651413, -1.02306997,

-1.00166031, -1.00335696, -1.01769405, -1.01429272, -1.01154655,

-1.00335696]),

'split4_test_score': array([-0.9463619 , -0.94191154, -0.9392704 , -0.93742344, -0.93413134,

-0.94852178, -0.93567824, -0.93623709, -0.93590173, -0.92139132,

-0.93674013, -0.93661415, -0.93260223, -0.92303758, -0.93283531,

-0.9423284 ]),

'mean_test_score': array([-1.01080394, -1.01318863, -1.01139132, -1.01314344, -1.01255294,

-1.01635726, -1.00628856, -1.01480885, -1.01612362, -1.01453347,

-1.01049274, -1.01192524, -1.01324849, -1.00944898, -1.00899433,

-1.01308246]),

'std_test_score': array([0.05450906, 0.05262808, 0.05568242, 0.06236204, 0.05702129,

0.05579946, 0.05724072, 0.06336497, 0.05748917, 0.06324661,

0.05705526, 0.06132002, 0.05889466, 0.06050685, 0.05798539,

0.05995049]),

'rank_test_score': array([ 5, 11,  6, 10,  8, 16,  1, 14, 15, 13,  4,  7, 12,  3,  2,  9]),

'split0_train_score': array([-0.22483986, -0.23538244, -0.25604178, -0.28157385, -0.22259988,

-0.23411482, -0.25594814, -0.28056406, -0.22186875, -0.23392338,

-0.2555759 , -0.28162284, -0.2221092 , -0.23315246, -0.2555759 ,

-0.28162284]),

'split1_train_score': array([-0.2345002 , -0.24488599, -0.26307177, -0.28744509, -0.23171022,

-0.24164092, -0.26087359, -0.2863303 , -0.23128738, -0.24139842,

-0.26197134, -0.28735066, -0.23066162, -0.24099122, -0.26102265,

-0.28680798]),

'split2_train_score': array([-0.23258495, -0.24242771, -0.26181423, -0.2903389 , -0.22922374,

-0.23886099, -0.25941357, -0.29098331, -0.2285759 , -0.23862621,

-0.26003545, -0.28989784, -0.22866432, -0.239149  , -0.25920104,

-0.28989784]),

'split3_train_score': array([-0.22121767, -0.23215098, -0.25292121, -0.28210613, -0.22001708,

-0.2292082 , -0.25010069, -0.28048109, -0.21965813, -0.22997443,

-0.25059737, -0.28105454, -0.22053079, -0.22889495, -0.24872066,

-0.28105454]),

'split4_train_score': array([-0.23422352, -0.24482203, -0.26375801, -0.29152319, -0.23042566,

-0.24206089, -0.260888  , -0.29126432, -0.23031942, -0.24173811,

-0.25993661, -0.28903779, -0.22975252, -0.2404106 , -0.26083158,

-0.29096251]),

'mean_train_score': array([-0.22947324, -0.23993383, -0.2595214 , -0.28659743, -0.22679532,

-0.23717717, -0.2574448 , -0.28592462, -0.22634192, -0.23713211,

-0.25762334, -0.28579274, -0.22634369, -0.23651964, -0.25707037,

-0.28606914]),

'std_train_score': array([0.00542477, 0.00521394, 0.00427741, 0.00410824, 0.00462124,

0.00488863, 0.00409058, 0.00474626, 0.00468937, 0.00454263,

0.00408976, 0.00373223, 0.00418021, 0.00472275, 0.00460995,

0.00410038])}#用交叉验证得到的最佳max_depth和min_child_weight进行训练及预测

params2 = {'boosting_type': 'gbdt',

'objective': 'multiclass',

'nthread': -1,

'silent': True,#是否打印信息,默认False

'learning_rate': 0.1,

'num_leaves': 80,

'max_depth': 7,#第二次交叉验证得到的参数

'max_bin': 127,

'subsample_for_bin': 50000,

'subsample': 0.8,

'subsample_freq': 1,

'colsample_bytree': 0.8,

'reg_alpha': 1,

'reg_lambda': 0,

'min_split_gain': 0.0,

'min_child_weight': 3,#第二次交叉验证得到的参数

'min_child_samples': 20,

'scale_pos_weight': 1}

lgbm2 = lgbm.sklearn.LGBMClassifier(num_class=9 , n_estimators=97 , seed=0 , **params2)

lgbm2.fit(X_train , y_train)

#Predict training set:

train_predprob = lgbm2.predict_proba(X_train)

logloss = log_loss(y_train , train_predprob)

#Print model report:

print("logloss of train :")

print (logloss)

1a1a6475f67014bfd9c017be4c318be4.png

注:因数据是原来6万多的基础上,随便在各个分类找的一共701条数据,此处交叉验证后得到的最佳参数的性能还没原来的好,lightgbm处理数据的颗粒度比XGBoost大,所以在数据很少的情况下,性能比不上XGBoost;#summarize results

print("Best: %f using %s" % (gsearch2_1.best_score_ , gsearch2_1.best_params_))

test_means = gsearch2_1.cv_results_['mean_test_score']

test_stds = gsearch2_1.cv_results_['std_test_score']

train_means = gsearch2_1.cv_results_['mean_train_score']

train_stds = gsearch2_1.cv_results_['std_train_score']

pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weight.csv')

# plot results

test_scores = np.array(test_means).reshape(len(max_depth) , len(min_child_weight))

train_scores = np.array(train_means).reshape(len(max_depth) , len(min_child_weight))

for i,value in enumerate(max_depth):

pyplot.plot(min_child_weight , -test_scores[i] , label='test_max_depth:' + str(value))

#for i,value in enumerate(min_child_weight):

#pyplot.plot(max_depth , train_scores[i] , label='train_min_child_weight:' + str(value))

pyplot.legend()

pyplot.xlabel('max_depth')

pyplot.ylabel('Log Loss')

pyplot.savefig('max_depth_vs_min_child_weight_1.png')

9c963d14aa63aecb2e97d82c484fefcd.png

b7d812b70761575b0386f207bb3be6ed.png


http://chatgpt.dhexx.cn/article/9InEcdsi.shtml

相关文章

Xgboost回归四种调参方法及Python简单实现

前言 Xgboost对特征工程和数据处理比较友好,相比之下调参成为用好Xgboost重要的一环,本文分别从参数、调参方法、Python实现的维度进行梳理,作为调参思路的记录。 本文将关注以下几个问题: 1.Xgboost哪些参数需要调参&#xff…

Python机器学习10——梯度提升

本系列所有的代码和数据都可以从陈强老师的个人主页上下载:Python数据程序 参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021. 本系列基本不讲数学原理,只从代码角度去让读者们利用最简洁的Python代码实现机器学…

【机器学习】集成学习代码练习

课程完整代码:https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释:黄海广,haiguang2000wzu.edu.cn import warnings warnings.filterwarnings("ignore") import pandas as pd from sklearn.model_selection …

Keras 1.0 与 2.0 中 Convolution1D 的区别(其实是tf1.0 2.0 区别)

1.0 Convolution1D: 一维卷积层 nb_filter: 卷积核的个数 filter_length: 每个卷积核的长度 init: 权重初始化函数名称 weights: 权重初始化 border_mode: valid, same or full 如果是‘valid ’ 进行有效的卷积,对边界数据不处理,‘same表示保留…

数据挖掘入门_Task04

线性回归模型 线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。 可以直接使用sklearn建立线性模型: from sklearn.linear_model import LinearRegression model LinearRegression(n…

task4 建模调参

1 读取数据 import pandas as pd import numpy as np import warnings warnings.filterwarnings(ignore)note: 将整型变量的类型尽量压缩,逐步判断并转化为int8,int16,int32,int64 def reduce_mem_usage(df):""" iterate through all the columns …

深度学习与神经网络(七)——卷积神经网络之池化pooling 上采样upsample与降采样downsample(下采样)(subsample)(nn.MaxPool2d)

池化层pooling与采样 upsample与downsample upsample(interpolating)是上采样,是图片的放大 unpool是上采样的一种 downsample(subsample)是下采样,是图片的缩小 在卷积神经网络中使用的采样方式就是pooling,有点类似下采样,但不太…

有放回随机抽样:重要参数subsample

原理透析 确认了有多少棵树之后,我们来思考一个问题:建立了众多的树,怎么就能够保证模型整体的效果变强呢?集成的目的是为了模型在样本上能表现出更好的效果,所以对于所有的提升集成算法,每构建一个评估器&…

Subsample子采样(CloudCompare软件)

之前一直以为CC软件里面没有子采样这个功能,不过找了找之后发现还是有的,感觉这些小的功能挺有意思的,所以也就记录一下。 文章目录 一、Random采样二、space采样三、octree采样四、小结 一、Random采样 有时候我总是喜欢使用一些小的样本来…

Android Content Providers(三)——Contacts Provider

接着上篇Android Content Providers(二)——Contacts Provider继续,接下来要说明的是顶层的Contacts,Contacts是聚合联系人表,在之前讨论的RawContacts是原始联系人表,在Android通讯录的架构中,…

Android contacts 的详解

一、包结构分析 相关联的的projects 1、Contacts相关 联系人分为了Contacts和ContactsCommon,与sim卡联系人相关的是在Telephony中,数据库是在ContactsProvider,apk要push到/system/priv-app/Contacts下 2、Contacts的包结构 3、ContactsComm…

由ContactsProvider的升级引发的OTA首次开机卡白米问题分析

上午的宁静被一个OTA卡白米问题打破,接下来不断有人反馈不同机型都复现了OTA后卡白米,10.9号OTA升级到10.10号的版本,全机型问题,线刷没有问题,好吧,接下来就根据这些信息开始初步分析log吧! 初…

Android Content Providers(二)——Contacts Provider

Contacts Provider是Android中一个强大并且灵活的组件,负责管理系统通讯录的数据,对外提供访问接口来对系统通讯录进行访问和操作。 以下是Contacts Provider的组织结构图: 可以看出Android的系统通讯录是三层架构,通过URI进行访…

API Guides Contacts Provider (二)

Data From Sync Adapters 用户直接输入联系人的数据到设备中,但是也可以通过sync adapters从服务器上获取联系人的数据。sync adapter 会自动同步设备和服务器上的数据。sync adapter运行在后台,由系统来控制。系统调用ContentResolver去管理数据。 在A…

Android 7.0后SettingProvider ContactsProvider TelephonyProvider MediaProvider数据库位置

在Android7.0之后,很多Provider数据库的位置都发生了改变,在这记录下,免得以后又忘记了,找起来费劲。 1、SettingsProvider 在之前SettingsProvider是是以settings.db的方法存在,在Android N之后SettingsProvider数据存…

利用Contacts Provider读取手机联系人信息

参考:https://developer.android.google.cn/guide/topics/providers/contacts-provider.html Contacts Provider组织结构 Contacts Provider组织结构由三部分构成,如下图所示: (联系人)Contact:代表联系人,包含了多种联系渠道。(原始联系人)RawContact:每个原始联…

API Guides Contacts Provider

Contacts Provider Contacts Provider是Android的一个强大组件,它管理联系人的核心数据。你在手机联系人看到联系人信息,来源于Contact Provider。当然,你可以在自己的应用用访问ContactProvider的数据,也可以同步手机和服务…

Android官方文档—APP组件(Content Providers)(Contacts Provider)

通讯录内容提供者 Contacts Provider是一个功能强大且灵活的Android组件,用于管理设备的人员数据中​​央存储库。联系人提供程序是您在设备的联系人应用程序中看到的数据源,您还可以在自己的应用程序中访问其数据,并在设备和在线服务之间传…

理清contactsprovider

初步了解android contact provider android的联系人数据单独拿出来做成ContactsProvider,众多的table和view整体看下来,使得联系人的数据错综复杂。但是我们在开发的过程并不需要将所有的table都搞清楚。用到最多的是 ContactsContract.Contacts、Contac…

Android ContactsProvider源码分析

Android源码目录packages\providers下的应用是下载,通话等内置基本应用提供数据存储和操作的provider应用,本文章将针对ContactsProvider源码的架构和实现展开分析。(注:本文使用使用android4.0版本进行分析) 1、架构设…