案例介绍
本案例将使用LightGBM算法在波士顿房屋数据集上进行房价预测任务。LightGBM是一种轻量级的梯度提升机算法,它具有较快的训练速度和更高的准确率,适用于处理大规模数据集。在本案例中,我们将详细介绍LightGBM的算法原理、公式推导、数据集、计算步骤以及相关的Python代码示例。
算法原理
LightGBM是一种基于梯度提升决策树(GBDT)的机器学习算法。它使用了一种称为”局部直方图算法”的高效训练策略,能够在保持较高准确率的同时,具有较快的训练速度。
GBDT
GBDT是一种集成学习算法,通过逐步提升弱学习器(通常为决策树)的准确率来构建最终的强学习器。GBDT通过梯度下降的方法最小化损失函数来训练模型。假设我们有一个回归任务,损失函数可以定义为平方损失函数$Loss(y_i, \hat{y}_i) = (y_i – \hat{y}_i)^2$,其中$y_i$是真实值,$\hat{y}_i$是模型预测值。我们的目标是找到一个拟合函数$F(x)$,使得损失函数$Loss(y_i, F(x_i))$最小化。GBDT的基本步骤如下:
1. 初始化拟合函数$F_0(x) = 0$
2. 对于迭代轮次$t = 1, 2, …, T$:
– 计算在当前拟合函数$F_{t-1}(x)$下样本的负梯度残差:$r_{it} = -\frac{\partial Loss(y_i, F_{t-1}(x_i))}{\partial F(x_i)}$
– 根据负梯度残差拟合一个弱学习器$h_t(x)$
– 更新拟合函数:$F_t(x) = F_{t-1}(x) + \eta \cdot h_t(x)$,其中$\eta$是学习率(步长)
3. 得到最终的拟合函数$F_T(x)$
LightGBM
LightGBM在GBDT的基础上进行了一些优化,以提高训练速度和准确率。
局部直方图算法
局部直方图算法是LightGBM的核心算法之一。在构建决策树的过程中,通常需要对样本进行排序以找到最佳分割点,这是一个非常耗时的操作。局部直方图算法通过构造直方图近似方式来高效地找到最佳分割点,从而减少了排序的计算量。
以某一特征为例,我们可以将特征值按照阈值进行划分,然后计算对应的损失函数。对于一个样本,其特征值落在某个划分区间时,我们可以将其所在划分的梯度值和梯度平方值累加到对应区间的直方图中。然后,我们可以通过遍历所有划分点,选择使得损失函数最小化的划分点作为最佳分割点。
局部直方图算法可以减少数据集的排序次数,从而大幅度提高训练速度。
其他优化技术
除了局部直方图算法,LightGBM还应用了其他一些优化技术,例如互斥特征捆绑、稀疏特征优化和直方图差异权重等,以进一步提高训练速度和准确率。
公式推导
在LightGBM的算法原理中,已经推导了GBDT的原理和公式。这里我们主要介绍局部直方图算法相关的公式。
特征直方图计算
对于一个特征,我们将其划分为$b$个离散的bin(划分点)。对于第$t$轮迭代中的样本$i$,记它在特征$feat$上的值为$x_{it}$。我们可以根据划分点将$x_{it}$分到对应的bin中。对于每个bin$j$,LightGBM使用两个累加器来记录样本和它们对应的梯度值和梯度平方值:
– $G_{jt} = \sum_{i:I(x_{it})=j}g_{it}$
– $H_{jt} = \sum_{i:I(x_{it})=j}h_{it}$
其中,$g_{it}$和$h_{it}$分别是样本$i$在第$t$轮迭代中的一阶和二阶梯度值。在遍历所有样本后,我们就可以得到特征$feat$上的直方图。
直方图差异权重
直方图差异权重是LightGBM中用于进一步优化的一项技术。在每次节点分裂时,LightGBM计算当前节点的直方图中左、右两个区间的梯度平方和,然后通过以下公式计算直方图差异权重$A$:
$A = \sqrt{\frac{G_L^2}{H_L + \lambda}} + \sqrt{\frac{G_R^2}{H_R + \lambda}} + \sqrt{\lambda}$
其中,$G_L$和$G_R$分别是左右两个区间的梯度和,$H_L$和$H_R$分别是左右两个区间的梯度平方和,$\lambda$是正则化参数。
数据集
本案例将使用波士顿房屋数据集进行房价预测任务。该数据集包含506个样本和13个特征,目标是预测房屋的中位数价值(MEDV),其余特征包括犯罪率、住宅占地面积等。
计算步骤
本案例的计算步骤如下:
- 准备数据集:加载波士顿房屋数据集并分割为训练集和测试集。
- 定义模型:使用LightGBM的API定义回归模型。
- 训练模型:在训练集上训练模型。
- 预测:在测试集上使用训练好的模型做预测,并计算评估指标。
- 绘制重要特征图:可视化模型中的重要特征。
Python代码示例
下面是使用LightGBM进行波士顿房价预测的Python代码示例,包括了数据集准备、模型定义、训练和预测等步骤。
import lightgbm as lgb
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
# 加载波士顿房屋数据集
data = load_boston()
X, y = data.data, data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建LightGBM数据集
train_data = lgb.Dataset(X_train, label=y_train)
# 定义模型参数
params = {
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': {'l2'},
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9
}
# 训练模型
model = lgb.train(params, train_data, num_boost_round=100)
# 在测试集上预测
y_pred = model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
# 绘制重要特征图
lgb.plot_importance(model, figsize=(10, 6))
plt.show()
代码细节解释
- 第2行:导入所需的库和模块。
- 第5-8行:加载波士顿房屋数据集,并将特征和目标值分别赋值给
X
和y
。 - 第11行:使用
train_test_split
函数将数据集划分为训练集和测试集。 - 第14行:使用
lgb.Dataset
构建LightGBM模型所需的数据集。 - 第17-25行:定义模型参数,包括 boosting_type、目标函数、评估指标等。
- 第28行:使用
lgb.train
函数在训练集上训练模型,并指定迭代轮次为100。 - 第31行:使用训练好的模型在测试集上进行预测。
- 第34行:使用
mean_squared_error
函数计算预测结果与真实值之间的均方误差。 - 第37行:使用
lgb.plot_importance
函数绘制模型中的重要特征图。 - 第38行:使用
plt.show
显示图形。