机器学习:lightGBM 算法
油焖尖椒怎么做
lightGBM是基于GBDT的⼀个算法。因为传统的GBDT在每⼀次迭代时需要多次遍历整个训练数据,所以GBDT的训练会受内存等的限制。尤其在处理⼯业级海量数据的数据时,GBDT不能满⾜其需求。⽽lightGBM⽀持⾼效率的并⾏训练,并且具有更快的迭代速度,更低的内存消耗、更好的准确率,⽀持分布式可以快速处理海量数据。lightGBM的优缺点主要如下:
1.优点
XGBoost也是GBDT框架下的⼀个算法。相对于XGBoost, lightGBM的优点主要集中在内存和速度两个⽅⾯。
lightGBM采⽤基于直⽅图的决策树算法,该算法将遍历样本转化为遍历直⽅图。既降低了内存使⽤率⼜可以利⽤直⽅图做差的⽅式降低计算复杂度;⽽XGBoost采⽤的是基于预排序的决策树算法,不仅需要额外的空间保存特征排序结果,⽽且需要遍历每⼀个分割点计算分裂增益,计算代价⼤。
ligthGBM算法在训练过程中采⽤单边梯度算法(GOSS)过滤掉梯度⼩的样本,减少了⼤量的计算。GOSS先将要进⾏分裂的特征的所有绝对值⼤⼩进⾏降序排序,选取绝对值最⼤的个数据,然后在剩下的较⼩梯度数据中随机选择个数据。接着将这个数据乘以⼀个常数,这样算法既可以更关注训练不⾜的样本,⼜不⽤担⼼会改变原数据集的分布。
lightGBM采⽤了leaf-wi算法的增长策略构建树,减少了很多不必要的计算。XGBoost采⽤按层(level-wi)⽣长策略,该策略遍历⼀次数据可以同时分裂同⼀层的叶⼦,虽然这样⽅便进⾏多线程优化,控制模型复杂度并且不容易过拟合,但这种策略不加区分低对待同⼀层的叶⼦,⾮常低效。⽽lightGBM采⽤的leaf-wi算法每次只对当前分裂增益最⼤的叶⼦结点进⾏分裂。这种⽅法很容易长出⽐较深的树从⽽导致过拟合,所以⼀般会在树的最⼤深度上加⼀个限制。lightGBM采⽤优化后的特征并⾏、数据并⾏⽅法加速计算,当数据量⾮常⼤的时候还可以采⽤投票并⾏的策略。lightGBM对缓存进⾏了优化,增加了缓存命中率。
lightGBM算法在训练过程可以将两两互斥或冲突率低的特征捆绑成⼀个特征进⾏处理,减少了特征数量,降低了内存消耗(使⽤图着⾊原理选择要捆绑在⼀起的特征)。
操场的英语lightGBM可以直接处理类别型特征。
2.缺点可能会长⽐深的决策树,产⽣过拟合。lightGBM是基于偏差的算法,所以会对异常值⽐较敏感。
在寻找最优解的时候,没有将最优解是全部特征的综合这⼀理念考虑进去。
3.案例
这⾥使⽤lightGBM的sklearn接⼝。下⾯以LGBMClassifier()为例,介绍其中的主要参数。
a ×100%
北京二日游b ×100%b ×100%b 1−a
boosting_type:‘gbdt’(传统的GBDT模型)、‘dart’、‘goss’、‘rf’(随机森林)
dart: Dropouts meet Multiple Additive Regression Trees. 在每棵树的迭代过程中不再单单去拟合前⼀棵树的残差,⽽是从前⾯已有的树中采样⼀部分树,组合成⼀个新的树,然后去拟合这部分的残差,从⽽使后⾯的树贡献变⼤⼀些。
工作面试goss:Gradient-bad One-Side Sampling,单边梯度采样。⽬的是丢弃⼀些对计算增益没有帮助的样本留下有帮助的,降低计算复杂度。num_leaves:基学习器的最⼤叶⼦节点数。
max_depth: 基学习器的最⼤树深度。若则意味着对树深度不加限制。learning_rate: 学习率。n_estimators:学习器的个数。
导气汤
subsample_for_bin: 构成bins的样本数。lightGBM中使⽤基于直⽅图算法的决策树算法。对每个特征进⾏直⽅图统计,然后根据直⽅图的离散值,遍历寻找最优的分割点。objective: ‘binary’、‘multiclass’class_weight: 该参数主要⽤于多分类任务中;在⼆分类任务中,可以使⽤is_unbalance或者scale_pos_weight。colsample_bytree:构造每棵树时特征的抽样⽐率。reg_alpha: L1正则化项。reg_lambda: L2正则化项。
silent: 是否打印每次的运⾏结果。
LGBMClassifier()的fit()⽅法中也有⼏个重要参数需要说明。具体如下:
≤0
缩阴宝eval_metric:评价指标。分类任务默认使⽤’logloss‘。lightGBM中常⽤的评价指标有:
categorical_feature: 类别特征。lightGBM是⽬前唯⼀能直接处理类别特征的算法。在lightGBM中类别特征不需要在⽤one-hot进⾏转换了。
import pandas as pd
from lightgbm import LGBMClassifier
del_lection import train_test_split
ics import roc_auc_score,accuracy_score
from sklearn.impute import SimpleImputer
del_lection import GridSearchCV
ad_csv('ain.csv')
#删除⽆⽤字段
data=data.drop(['PasngerId','Name','Ticket','Cabin'],axis=1)
分式求导公式#对Age字段的缺失值⽤均值进⾏填充。也可以使⽤模型预测缺失值。
imputer=SimpleImputer(strategy='mean')
data['Age']=imputer.fit_transform(data[['Age']])
#把object型转换category型(lightGBM不接受object型)
for col lumns:
if data[col].dtype=='object':
data[col]=data[col].astype('category')
x=data.drop(['Survived'],axis=1)
y=data['Survived']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
三角公式大全params={'max_depth':[2,3,4],
'learning_rate':[0.05,0.1,0.15,0.2,1],
'n_estimators':[30,50,80,100]}
estimator=LGBMClassifier(objective='binary',reg_alpha=0.1,
reg_lambda=0.2)
gbm=GridSearchCV(estimator,params)
gbm.fit(x_train,y_train,early_stopping_rounds=10,
categorical_feature=['Sex','Embarked'],
eval_metric=['auc','binary'],
eval_t=[(x_train,y_train)],
eval_names='train',
verbo=10)
model=gbm.best_estimator_
y_pred=model.predict(x_test)
roc_auc=roc_auc_score(y_test,model.predict_proba(x_test)[:,1])
accuracy=accuracy_score(y_test,y_pred)
print("lightGBM模型的准确率为{:.3f},AUC={:.3f}".format(accuracy,roc_auc))
其运⾏结果如下:
lightGBM模型的准确率为0.849,AUC=0.904
参考资料
1.
2.