LightGBM介绍
LightGBM是2017年由微软推出的可扩展机器学习系统,是微软旗下DMKT的一个开源项目,由2014年首届阿里巴巴大数据竞赛获胜者之一柯国霖老师带领开发。它是一款基于GBDT(梯度提升决策树)算法的分布式梯度提升框架,为了满足缩短模型计算时间的需求,LightGBM的设计思路主要集中在减小数据对内存与计算性能的使用,以及减少多机器并行计算时的通讯代价。
LightGBM可以看作是XGBoost的升级豪华版,在获得与XGBoost近似精度的同时,又提供了更快的训练速度与更少的内存消耗。
LightGBM的主要优点:
- 简单易用。提供了主流的Python\C++\R语言接口,用户可以轻松使用LightGBM建模并获得相当不错的效果。
- 高效可扩展。在处理大规模数据集时高效迅速、高准确度,对内存等硬件资源要求不高。
- 鲁棒性强。相较于深度学习模型不需要精细调参便能取得近似的效果。
- LightGBM直接支持缺失值与类别特征,无需对数据额外进行特殊处理
LightGBM的主要缺点:
- 相对于深度学习模型无法对时空位置建模,不能很好地捕获图像、语音、文本等高维数据。
- 在拥有海量训练数据,并能找到合适的深度学习模型时,深度学习的精度可以遥遥领先LightGBM。
ps:
-
安装LightGBM,详见https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html
-
这个网页介绍了使用lightgbm的两种形式:原生形式(import lightgbm as lgb)和Sklearn接口形式(from lightgbm import LGBMRegressor, LGBMClassifier)具体可查看https://www.cnblogs.com/chenxiangzhen/p/10894306.html
-
原生形式中可以使用lgb.cv做交叉验证选参数, 但要注意数据集必须使用lgb.Dataset函数加以转换
关于LightGBM参数
-
lightgbm参数很多,应仔细阅读https://lightgbm.readthedocs.io/en/latest/Parameters.html
-
关于调参,可以参考https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html
-
1、核心参数:task, objective, boosting, n_estimators, learning_rate, metric
-
2、与决策树相关的参数:num_leaves, max_depth, min_data_in_leaf, feature_fraction_bynode, min_gain_split
-
3、涉及加速与防止过拟合的参数:bagging_fraction, feature_fraction, lambda_l1, lambda_l2, max_bin, min_data_in_bin, bin_construct_sample_cnt(实际上,决策树中的参数max_depth, min_data_in_leaf,
feature_fraction_bynode也有防止过拟合的作用) -
4、处理不平衡的参数:pos_bagging_fraction, neg_bagging_fraction, is_unbalance
-
5、GOSS相关参数(设置boosting=goss才会启用GOSS):top_rate, other_rate
-
6、EFB相关参数:enable_bundle, max_conflict_rate (实际上,这两个参数也可以实现加速)
ps1:网上也有很多调参攻略,例如我随便搜索看到的网页:
- https://www.cnblogs.com/wzdLY/p/9867719.html
- https://blog.csdn.net/u012513618/article/details/78441676
- https://www.cnblogs.com/jiangxinyang/p/9337094.html
- https://www.imooc.com/article/43784?block_id=tuijian_wz
ps2:不需要处理缺失值;不需要独热编码(但不能输入字符串)
算法实战
基于英雄联盟数据集的LightGBM分类实战
数据集变量描述如下:
数据集导入
mport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('./high_diamond_ranked_10min.csv')
y = df.blueWins
drop_cols = ['gameId','blueWins']#删除不必要的变量或预测变量
x = df.drop(drop_cols, axis=1)
x.describe()#进行统计描述
- 不同对局中插眼数和拆眼数的取值范围存在明显差距,甚至有前十分钟插了250个眼的异常值。
- EliteMonsters的取值相当于Deagons + Heralds。
- TotalGold 等变量在大部分对局中差距不大。
- 两支队伍的经济差和经验差是相反数。
- 红队和蓝队拿到首次击杀的概率大概都是50%
可视化描述
data = x
data_std = (data - data.mean()) / data.std()
data = pd.concat([y, data_std.iloc[:, 0:9]], axis=1)
data = pd.melt(data, id_vars='blueWins', var_name='Features', value_name='Values')
fig, ax = plt.subplots(1,2,figsize=(15,5))
# 绘制小提琴图
sns.violinplot(x='Features', y='Values', hue='blueWins', data=data, split=True,
inner='quart', ax=ax[0], palette='Blues')
fig.autofmt_xdate(rotation=45)
data = x
data_std = (data - data.mean()) / data.std()
data = pd.concat([y, data_std.iloc[:, 9:18]], axis=1)
data = pd.melt(data, id_vars='blueWins', var_name='Features', value_name='Values')
# 绘制小提琴图
sns.violinplot(x='Features', y='Values', hue='blueWins'