Python中LightGBM提升算法的完整指南

1,193 阅读4分钟

梯度提升决策树(GBDT)是一种流行的机器学习算法。它有相当有效的实现方式,如XGBoost,因为许多优化技术都是从这个算法中采用的。然而,当数据中存在更多的特征时,其效率和可扩展性仍然不能令人满意。对于这种行为,主要原因是每个特征需要扫描所有的数据实例来估计所有可能的分割点的信息增益,这非常耗时。

为了解决这个问题,LightGBM(梯度提升机)使用了两种技术,即基于梯度的单侧采样(GOSS)和独家特征捆绑(EFB)。所以GOSS排除了相当一部分具有小梯度的数据实例,只使用剩余的数据来估计信息增益。由于具有大梯度的数据实例在信息增益的计算中起着更重要的作用,GOSS可以用一个相对较小的数据集获得相当准确的信息增益。

在EFB中,它将互斥的特征捆绑在一起,但它很少同时取非零值以减少特征的数量;这导致了有效的特征消除而不损害分割点的准确性。

加上这两个变化,它使算法的训练时间加快了20倍;有了这个,LightGBM可以被认为是加入了GOSS和EFB的梯度提升树。

LightGBM的官方文件指出,它是垂直生长的,而另一种基于树的学习算法是水平生长的;LightGBM是沿叶生长的,它选择最大delta损失来生长。它可以通过下面的视觉效果得到最好的解释。

图片来源

LightGBM具有以下优势。

  • 更快的训练速度和更高的准确性。
  • 更低的内存使用率。
  • 比任何其他提升算法有更好的准确性,特别是在处理小数据集时能很好地处理过拟合问题。
  • 与大型数据集的兼容性,以及
  • 支持并行学习。

有了这样的特点和优势,LightGBM已经成为机器学习竞争中的事实算法,在处理回归和分类这两种问题的表格数据时。

今天在这篇文章中,我们将演示LightGBM的实现。

在Python中实现LightGBM

LightGBM可以使用Python包管理器pip install lightgbm来安装。LightGBM有其自定义的API支持。使用这种支持,我们同时使用了Regressor和Classifier算法,两种模型的操作方式相同。

这里使用的数据集包括泰坦尼克号乘客的数据,将在我们的任务中使用。

导入所有的依赖项

import lightgbm as lgb
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import metrics

加载数据。

data = pd.read_csv('/content/SVMtrain.csv')
data.head()

我们有8个列,其中PassengerID将被删除,而Embarked将被选为分类问题的目标变量。

加载变量。

# define input and output feature
x = data.drop(['Embarked','PassengerId'],axis=1)
y = data.Embarked
# train test split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.33,random_state=42)

加载和拟合模型。

初始化模型的过程与普通模型的初始化过程相似;主要的是它有更多的参数设置。在初始化模型时,我们将定义学习率、最大深度和随机状态。

model = lgb.LGBMClassifier(learning_rate=0.09,max_depth=-5,random_state=42)
model.fit(x_train,y_train,eval_set=[(x_test,y_test),(x_train,y_train)],
          verbose=20,eval_metric='logloss')

在拟合方法中,我们传递了eval_set和eval_metrix,以便在训练过程中评估我们的模型。

训练本身。

对模型进行评估。

我们的数据集有明显的非常低的实例;最好首先检查这个模型是否过拟合;如果没有,我们将进入进一步的评估。

print('Training accuracy {:.4f}'.format(model.score(x_train,y_train)))
print('Testing accuracy {:.4f}'.format(model.score(x_test,y_test)))

我们可以看到,两者的准确度没有明显的差别,所以该模型对信息的估计几乎是好的。

LightGBM带有额外的绘图功能,如绘制特征重要性,绘制度量评估,以及绘制树状图。下面我们将看到特征重要性和度量评估。

lgb.plot_importance(model)

如果你在拟合过程中没有提到eval_set,那么你在绘制度量评估时就会出现错误。

lgb.plot_metric(model)

正如你所看到的,验证曲线在第100次迭代后趋于增加;这可以通过设置和调整模型下的超参数来解决。

下面让我们用sklearn库绘制一些指标。

metrics.plot_confusion_matrix(model,x_test,y_test,cmap='Blues_r')

print(metrics.classification_report(y_test,model.predict(x_test)))

从混淆矩阵和分类报告中我们可以看到,由于可用的实例相对较少,该模型在预测第1类时很吃力,但如果我们将这个结果与其他集合算法相比较,LightGBM的表现最好。 回归问题也遵循同样的程序;我们需要将估计器改为LGBMRegressor()。

结束语。

从这篇文章中,我们已经看到了LightGBM的直觉,以及它是如何通过使用GOSS和EFB来处理问题的。后来,我们将其用于分类问题,其过程与其他ML算法相似。此外,内置的绘图功能使这个库更有吸引力,并减少了评估方面的工作。

参考文献。

The postComplete Guide To LightGBM Boosting Algorithm in Pythonappeared first onAnalytics India Magazine.