机器学习:基于LightGBM的分类实践

学习时间:2022.04.30~2022.05.1

机器学习:基于LightGBM的分类实践

尝试了一下招行的FinTech比赛,然后说是用LightGBM(lgb)的效果很好,所以临时来突击学习一下。

1. LightGBM简介

LightGBM是轻量级(Light)的梯度提升机器(GBM),是GBDT模型的另一个进化版本。它延续了XGBoost的那一套集成学习的方式,相对于xgboost, 具有训练速度快和内存占用率低的特点。

好吧,我承认,这一段里面的GBM、GBDT、XGBoost我全都不会,而且也不太知道具体是啥,但也不影响对lgb的应用,后续会继续学习机器学习补上的。

模型精度:XGBoost和LightGBM相当;

训练速度:LightGBM远快于XGBoost;

内存消耗:LightGBM远小于XGBoost;

缺失值特征:XGBoost和LightGBM都可以自动处理特征缺失值;

分类特征:XGBoost不支持类别特征,需要OneHot编码预处理。

LightGBM直接支持类别特征。对于类别型特征机器学习算法一般是通过one-hot来处理的,但对于决策树算法来说不推荐使用one-hot,因为当类别种类较多时,会使得:① 产生样本切分不平衡的问题,切分增益会非常小;② 会影响决策树的学习。

LightGBM的优缺点:

  • 速度更快

    • LightGBM 采用了直方图算法将遍历样本转变为遍历直方图,极大的降低了时间复杂度;
    • LightGBM 在训练过程中采用单边梯度算法过滤掉梯度小的样本,减少了大量的计算;
    • LightGBM 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量;
    • LightGBM 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略;
    • LightGBM 对缓存也进行了优化,增加了缓存命中率;
  • 内存更小

    • LightGBM 采用了直方图算法将存储特征值转变为存储 bin 值,且不需要特征值到样本的索引,降低了内存消耗;
    • LightGBM 在训练过程中采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
  • 缺点

    • 可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合;
    • Boosting族是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,所以随着迭代不断进行,误差会越来越小,模型的偏差(bias)会不断降低,所以会对噪点较为敏感;
    • 在寻找最优解时,依据的是最优切分变量,没有将最优解是全部特征的综合这一理念考虑进去。

2. LightGBM实践

pip install lightgbm

LightGBM有两大类接口:LightGBM原生接口和 scikit-learn接口 ,并且LightGBM能够实现分类和回归两种任务。

2.1 数据处理

LightGBM Python 版本的模型能够从以下格式中加载数据:

  • libsvm/tsv/csv/txt format file
  • NumPy 2D array(s), pandas DataFrame, SciPy sparse matrix
  • LightGBM binary file
import pandas as pd
import numpy as np
import lightgbm as lgb
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_auc_score

df = pd.read_excel('data/train.xlsx', sheet_name=0)
df_data = df.drop('LABEL', axis=1)
df_label = df['LABEL']

# 应用自定义的数据预处理函数
df_data = fintech_preprocess(df_data)
tr_x, te_x, tr_y, te_y = train_test_split(df_data, df_label, test_size=0.01, random_state=42)

2.2 参数设置

调用lightgbm提供的sklearn接口进行训练,具体参数含义可见官方文档,应该是最全最详细的了。

gbm = lgb.LGBMClassifier(boosting_type='gbdt', objective='binary', metric='auc')
# 网格搜索(已搜索完成)
params = {
    
    ……}
gsearch = GridSearchCV(gbm, param_grid=params, scoring='roc_auc', cv=n)
gsearch.fit(tr_x, tr_y)

然后输出结果:

print('参数取值:{0}'.format(gsearch.best_params_))
bst = gsearch.best_estimator_

2.3 验证集评估

y_pred = bst.predict(te_x)
AUC = roc_auc_score(te_y, y_pred)
print("验证集AUC: ", AUC)

最后结果(AUC)也只有0.952,只能说文科生半路出家真的好难,各路神仙真的太多了,卷不动了,准备溜~

猜你喜欢

转载自blog.csdn.net/Morganfs/article/details/124529188