一、LightGBM原理简介
传统的boosting算法(如GBDT和XGBoost)已经有相当好的效率,但是在如今的大样本和高维度的环境下,传统的boosting似乎在效率和可扩展性上不能满足现在的需求了,主要的原因就是传统的boosting算法需要对每一个特征都要扫描所有的样本点来选择最好的切分点,这是非常的耗时。为了解决这种在大样本高纬度数据的环境下耗时的问题,Lightgbm使用了如下两种解决办法:一是GOSS(Gradient-based One-Side Sampling, 基于梯度的单边采样),不是使用所用的样本点来计算梯度,而是对样本进行采样来计算梯度;二是EFB(Exclusive Feature Bundling, 互斥特征捆绑) ,这里不是使用所有的特征来进行扫描获得最佳的切分点,而是将某些特征进行捆绑在一起来降低特征的维度,是寻找最佳切分点的消耗减少。这样大大的降低的处理样本的时间复杂度,但在精度上,通过大量的实验证明,在某些数据集上使用Lightgbm并不损失精度,甚至有时还会提升精度。
大部分决策树的学习通过level-wise策略生长树,如下图所示:
lightGBM通过left-wise策略生长树。它将选取最大的delta-loss的叶子节点来生长,当生长相同的leaf,left-wise算法可以比level-wise算法减少更多的损失。
当delta较小时,left-wise算法可能会造成过拟合。所以lightGBM可以利用额外的参数max_depth来限制树的深度从而防止过拟合(树的生长仍然通过left-wise策略),如下图所示:
二、模型实现
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_train, y_test, reference=lgb_train)
model_lgb=lgb.sklearn.LGBMClassifier(num_leaves=30,learning_rate=0.1,n_estimators=20)
lgb.fit(X_train,y_train)
lgb_y_pred = lgb.predict(X_test)
f1_lgb = f1_score(y_test, y_pred_lgb,average='micro')
模型结果:
三、网络搜索调参
lgb_grid =lgb.sklearn.LGBMClassifier(num_leaves=30)
param_grid = {
'learning_rate': [0.01, 0.05, 0.1, 0.5],
'n_estimators': [20, 30, 40, 50]
}
re_model = GridSearchCV(lgb_grid, param_grid)
re_model.fit(X_train, y_train)
参数简单优化后得到的F1得分为: