LGBMClassifier:入门指南
LGBMClassifier Getting Started Guide
有大量的机器学习算法适用于建模特定现象。一些模型利用一组属性来优于其他模型,另一些模型则包括弱学习器,利用剩余的属性为模型提供额外的信息,这些模型被称为集成模型。
集成模型的前提是通过减少错误来结合不同模型的预测结果来提高模型性能。有两种流行的集成技术:装袋和提升。
装袋,也称为自助聚合,对训练数据的不同随机子集进行多次训练,然后平均它们的预测结果以产生最终的预测。相反,提升是顺序训练单个模型,其中每个模型试图纠正先前模型的错误。
现在我们对集成模型有了一定的了解,让我们来详细了解提升集成模型,特别是由微软开发的Light GBM (LGBM)算法。
什么是LGBMClassifier?
LGBMClassifier代表轻量级梯度提升机分类器。它使用决策树算法进行排名、分类和其他机器学习任务。LGBMClassifier使用一种新颖的梯度单边采样(GOSS)和独特特征绑定(EFB)技术来处理大规模数据,具有高准确性,同时提高了速度并减少了内存使用。
什么是梯度单边采样(GOSS)?
传统的梯度提升算法使用所有的数据进行训练,当处理大型数据集时,这可能非常耗时。LightGBM的GOSS只保留具有大梯度的实例,并对具有小梯度的实例进行随机采样。其背后的理念是具有大梯度的实例更难拟合,因此包含更多的信息。GOSS对于具有小梯度的数据实例引入了一个常数倍增器,以弥补采样过程中的信息损失。
什么是独特特征绑定(EFB)?
在稀疏数据集中,大多数特征都是零。EFB是一种接近无损的算法,它将互斥特征(即不同时为非零的特征)捆绑/组合在一起,以减少维度的数量,从而加快训练过程。由于这些特征是“独特的”,原始特征空间保留了,并且没有显著的信息损失。
安装
可以直接使用pip(Python的包管理器)安装LightGBM包。在终端或命令提示符上输入下面的命令,可以下载并安装LightGBM库:
pip install lightgbm
Anaconda用户可以使用以下命令来安装:
conda install -c conda-forge lightgbm
根据您的操作系统,您可以根据此指南选择安装方法。
实践操作!
现在,让我们导入LightGBM和其他必要的库:
import numpy as np
import pandas as pd
import seaborn as sns
import lightgbm as lgb
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
准备数据集
我们使用了广受欢迎的泰坦尼克号数据集,其中包含有关泰坦尼克号上的乘客的信息,目标变量表示他们是否幸存。您可以从Kaggle下载数据集,也可以使用以下代码直接从Seaborn加载数据集,如下所示:
titanic = sns.load_dataset('titanic')
删除不必要的列,例如“deck”、“embark_town”和“alive”,因为它们是多余的或不对任何人的生存贡献。接下来,我们观察到特征“age”、“fare”和“embarked”存在缺失值 – 不同的属性使用适当的统计量进行插补。
# 删除不必要的列
titanic = titanic.drop(['deck', 'embark_town', 'alive'], axis=1)
# 用中位数或众数替换缺失值
titanic['age'] = titanic['age'].fillna(titanic['age'].median())
titanic['fare'] = titanic['fare'].fillna(titanic['fare'].mode()[0])
titanic['embarked'] = titanic['embarked'].fillna(titanic['embarked'].mode()[0])
最后,我们使用pandas的分类编码将分类变量转换为数值变量。现在,数据准备好开始模型训练过程。
# 将分类变量转换为数值变量
titanic['sex'] = pd.Categorical(titanic['sex']).codes
titanic['embarked'] = pd.Categorical(titanic['embarked']).codes
# 将数据集拆分为输入特征和目标变量
X = titanic.drop('survived', axis=1)
y = titanic['survived']
训练LGBMClassifier模型
为了开始训练LGBMClassifier模型,我们需要使用scikit-learn的train_test_split函数将数据集拆分为输入特征和目标变量,以及训练集和测试集。
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
让我们对分类变量(”who”)和有序数据(”class”)进行标签编码,以确保模型使用的是数值数据,因为LGBM不接受非数值数据。
class_dict = {
"Third": 3,
"First": 1,
"Second": 2
}
who_dict = {
"child": 0,
"woman": 1,
"man": 2
}
X_train['class'] = X_train['class'].apply(lambda x: class_dict[x])
X_train['who'] = X_train['who'].apply(lambda x: who_dict[x])
X_test['class'] = X_test['class'].apply(lambda x: class_dict[x])
X_test['who'] = X_test['who'].apply(lambda x: who_dict[x])
接下来,我们将模型超参数作为参数传递给构造函数,或者可以将它们作为字典传递给set_params方法。
开始模型训练的最后一步是通过创建LGBMClassifier类的实例并将其拟合到训练数据来加载数据集。
params = {
'objective': 'binary',
'boosting_type': 'gbdt',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9
}
clf = lgb.LGBMClassifier(**params)
clf.fit(X_train, y_train)
接下来,让我们评估训练好的分类器在未见过的测试数据集上的性能。
predictions = clf.predict(X_test)
print(classification_report(y_test, predictions))
precision recall f1-score support
0 0.84 0.89 0.86 105
1 0.82 0.76 0.79 74
accuracy 0.83 179
macro avg 0.83 0.82 0.82 179
weighted avg 0.83 0.83 0.83 179
超参数调优
LGBMClassifier通过可以调整的超参数提供了很大的灵活性,以获得最佳性能。在这里,我们将简要讨论一些关键的超参数:
- num_leaves:这是控制树模型复杂度的主要参数。理想情况下,num_leaves的值应小于或等于2^(max_depth)。
- min_data_in_leaf:这是一个重要的参数,用于防止叶子树过拟合。其最佳值取决于训练样本数和num_leaves。
- max_depth:您可以使用此参数来明确限制树的深度。在出现过拟合的情况下,最好调整此参数。
</
让我们调整这些超参数并训练一个新模型:
model = lgb.LGBMClassifier(num_leaves=31, min_data_in_leaf=20, max_depth=5)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
精确度 召回率 f1-得分 支持数
0 0.85 0.89 0.87 105
1 0.83 0.77 0.80 74
准确度 0.84 179
宏平均 0.84 0.83 0.83 179
加权平均 0.84 0.84 0.84 179
请注意,实际超参数调整是一个需要试错的过程,可能还需要根据经验和对提升算法以及业务问题的领域知识的深入理解进行引导。
在本文中,您学习了LightGBM算法及其Python实现。这是一种灵活的技术,适用于各种类型的分类问题,并应该是您机器学习工具箱的一部分。 Vidhi Chugh 是一位人工智能战略家和数字化转型领导者,致力于在产品、科学和工程的交叉点上构建可扩展的机器学习系统。她是一位屡获殊荣的创新领导者、作家和国际演讲者。她的使命是使机器学习民主化,并为每个人打破术语障碍,参与到这场变革中来。