python机器学习之lightBGM
Posted 柳小葱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python机器学习之lightBGM相关的知识,希望对你有一定的参考价值。
🍀今天我们就来介绍一下机器学习中最最最出名的算法xgboost,我们一章主要是对xgboost中的超参数进行讲解,关于xgboost的具体原理我将在后面为大家讲解,以前的文章内容如下👇:
- 决策树模型: sklearn之决策树.
- 决策树概念: 决策树详解.
- 线性回归模型: sklearn机器学习之线性回归模型.
- 朴素贝叶斯: sklearn之朴素贝叶斯.
- 集成算法: 机器学习之集成算法.
❤️由于种种原因,MacBook m1芯片在anaconda上使用命令conda install xgboost 或者是 conda install py-xgboost时,一直提示镜像源没有对应的包,网上找了一下原因,这是因为xgboost的包目前还没有适配arm64架构的这款芯片。所以我就抱着试试的心态安装了lightBGM没想到安装成功了,我们就开始介绍一下lightbgm吧。
1.lightGBM介绍
我们主要介绍一下lightGBM的由来,以及和xgboost的主要区别:
- 2014 年 3 月,XGBOOST 最早作为研究项目,由陈天奇提出
- 2017 年 1 月,微软发布首个稳定版 LightGBM
- XGBoost算法的思想:不断添加树,不断进行特征分裂来生成一棵树,每添加一棵树就是学习一个新的函数来拟合上次的残差,当训练完成后得到K棵树,要预测一个样本的分数,其实就是根据样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点对应一个分数,最后需要将每棵树对应的分数加起来就是该样本的预测值。
- LightGBM是个快速、分布式的、高性能的基于决策树的梯度提升算法。可以用于分类、回归、排序等机器学习任务中。因为它是基于决策树算法的,它采用最优的leaf-wise策略分裂叶子节点,其它提升算法一般采用的是depth-wise或者level-wise而不是leaf-wise。因此,在LightGBM算法中,当增长到相同的叶子节点,leaf-wise算法比level-wise算法减少更多的loss。因此导致更高的精度,而其他的任何已存在的提升算法都不能够达。在训练过程中,LightGBM使用基于直方图的算法。例如,它将连续的特征值分桶(buckets)装进离散的箱子(bins),这是的训练过程中变得更快。
2. lightGBM 的调用方式
在查找资料的过程中,我发现lightgbm有两种调用的方式:
- 原生lightbgm包
- sklearn调用lightbgm
开始我以为是两个不同的组织分别为sklearn写了一个包,然后另一波人单独写了一个lightbgm的包,可能会有差异,可是通过查找资料,我发现官方都在介绍时并没有将两者分开,只不过是习惯的问题,如果你习惯用sklearn处理数据,那么你可以使用sklearn处理数据后再放入模型中,你使用原生的lightbgm对数据的预处理可能需要看看官方的API文档。
lightbBGM官方文档: 官方lightbgm英文文档链接.
lightbBGM官方文档: 官方lightbgm中文文档链接.
大家需要注意的就是,两者里面关于模型的超参数含义都是一样的
2.1直接调用调用方法
import lightgbm as lgb#调用lightgbm命名为lgb,并未制定分类还是预测问题
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
#后面处理数据时也需要用lgb对象
# 转换为Dataset数据格式
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
# 参数
params = {
'task': 'train',
'boosting_type': 'gbdt', # 设置提升类型
'objective': 'regression', # 目标函数(是什么问题)
'metric': {'l2', 'auc'}, # 评估函数
'num_leaves': 31, # 叶子节点数
'learning_rate': 0.05, # 学习速率
'feature_fraction': 0.9, # 建树的特征选择比例
'bagging_fraction': 0.8, # 建树的样本采样比例
'bagging_freq': 5, # k 意味着每 k 次迭代执行bagging
'verbose': 1 # <0 显示致命的, =0 显示错误 (警告), >0 显示信息
}
# 模型训练也需要用到lgb对象
gbm = lgb.train(params, lgb_train, num_boost_round=20, valid_sets=lgb_eval, early_stopping_rounds=5)
2.2sklearn的使用方法
rom lightgbm import LGBMRegressor #一开始就说了是什么问题
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
#后面处理数据用的sklearn,只是将lightbgm当初一个算法api,就像其他的神经网络,k近邻,随机森林等等算法一样
# 加载数据
iris = load_iris()
data = iris.data
target = iris.target
# 划分训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2)
# 模型训练(就是当作一个普通的模型API来使用,设置里面的参数)
gbm = LGBMRegressor(objective='regression', num_leaves=31, learning_rate=0.05, n_estimators=20)
gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], eval_metric='l1', early_stopping_rounds=5)
3. lightGBM API中的参数
介绍了怎么用,接下来介绍一下API中的常用参数。
看一下官方的API介绍:
- boosting_type(字符串,可选(默认=‘gbdt’)–“gbdt”,传统的梯度增强决策树)。“省道”,辍学者满足多个加法回归树。“goss”,基于梯度的单边采样。“rf”,随机森林
- num_leaves(int,可选(默认=31))–基础学习者的最大树叶。LightGBM 使用的是 leaf-wise 的算法,因此在调节树的复杂程度时使用的是 num_leaves,它的值的设置应该小于 2^(max_depth)
- max_deep(int,可选(默认=-1))–基本学习者的最大树深度,<=0表示无限制。
- earning_rate (float, optional (default=0.1)) 学习率
- n_estimators(int,可选(默认=100))基学习器的数量 。
- subsample_for_bin (int__, optional (default=50000)) 用来构建直方图的数据的样本数量
- objective(default=None)这个主要是针对直接使用lightgbm的方式,用来指导是分类任务还是回归任务
- min_split_gain 最小切分的信息增益值
- min_child_weight 决定最小叶子节点样本权重和(hessian)的最小阈值,若是基学习器切分后得到的叶节点中样本权重和低于该阈值则不会进一步切分,在线性模型中该阈值就对应每个节点的最小样本数。当它的值较大时,可以避免模型学习到局部的特殊样本,防止模型过拟合。但如果这个值过高,又会导致欠拟合
- min_child_samples(int__, optional (default=20)) 一个叶子节点中最小的数据量,调大可以防止过拟合
- subsample_freq(int,可选(默认=0)–子样本的频率,<=0表示不启用。
- colsample_bytree(浮动,可选(默认=1.))–构建每棵树时列的子样本比率。
- reg_alpha(浮动,可选(默认=0.)– L1 权重正则化项。
- reg_lambda(浮动,可选(默认=0.)– L2 权重正则化术语。
- random_state(int,RandomState对象或None,可选(默认=None))–随机数种子。如果int,这个数字用于种子C++代码。如果RandomState对象(numpy),则根据其状态选择一个随机整数来播种C++代码。如果无,则使用C++代码中的默认种子。
- n_jobs (int__, optional (default=-1)) 多线程,表示可以在机器的多个核上并行的构造树以及计算预测值。不过受限于通信成本,可能效率并不会说分为k个线程就得到k倍的提升,不过整体而言相对需要构造大量的树或者构建一棵复杂的树而言还是高效的
- random_state (int or None__, optional (default=None)) 随机种子,计算机不能产生绝对的随机数,只能产生伪随机数。伪就是有规律的意思。如果每次使用一样的 随机种子,生成的随机数列就是一样的了。
4.实际应用
我们这里就采用sklean的方式来调用lightgbm模型,我们用来预测波士顿的房价。
from sklearn.datasets import load_boston # 波士顿房价数据,回归使用
from sklearn import linear_model
from lightgbm import LGBMRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
boston = load_boston()
data = boston.data
target = boston.target
# 划分训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2)
# 模型训练
gbm = LGBMRegressor(objective='regression', num_leaves=31, learning_rate=0.05, n_estimators=20)
gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], eval_metric='l1', early_stopping_rounds=5)
# 模型预测
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)
# 模型评估
print('mse误差:', mean_squared_error(y_test, y_pred) ** 0.5)
# 特征重要度
print('特征的重要程度', list(gbm.feature_importances_))
# 网格搜索,参数优化
estimator = LGBMRegressor(num_leaves=31)
param_grid = {
'learning_rate': [0.01, 0.1, 1],
'n_estimators': [20, 40]
}
gbm = GridSearchCV(estimator, param_grid)
gbm.fit(X_train, y_train)
print('最好的参数组合', gbm.best_params_)
结果如下:
参考资料
- ightbBGM官方文档: 官方lightbgm英文文档链接.
- lightbgm两种调用方式: 博文链接.
- 《统计学习方法》
- kaggle平台
以上是关于python机器学习之lightBGM的主要内容,如果未能解决你的问题,请参考以下文章