大家好,今儿咱们再分享一个很常用的算法模型:LightGBM~
LightGBM 特别擅长分类和预测。你可以用它来解决「这个人会不会买东西?」或者「房价会涨到多少?」这样的问题。它的名字里有个「GBM」,意思是 梯度提升机器,一种特别聪明的算法。
简单说:
GBM 是一种把「简单模型」叠在一起,做出「超强预测能力」的方法。 LightGBM 是 GBM 的「快、准、省」升级版。
LightGBM 的厉害之处
LightGBM 专门解决了三个问题:
速度快:跑起来比很多模型快,因为它聪明地挑选数据。 准度高:预测特别准,常被用在比赛和实际项目中。 省内存:处理大数据量时也不慌张。
LightGBM 的核心思想是用「决策树」来做预测。你可以想象一棵树,它会不断问你问题,比如:
「收入超过 5000 吗?」 「年龄小于 30 岁吗?」 「城市在一线吗?」
根据你的回答,树会一步步把你分到一个小组,最后决定你是「买东西」还是「不买东西」。
但是,LightGBM 和普通决策树不一样:
它用 很多棵树,一棵接一棵,每棵树都修正前面树的错误。 它特别聪明:只挑重要的数据特征,节省时间。
LightGBM 怎么用?
假设你有一个商店,你想预测顾客会不会买东西。数据长这样:
顾客ID | 年龄 | 收入 | 是否买过 | 是否买东西(目标) |
---|---|---|---|---|
1 | 25 | 3000 | 否 | 是 |
2 | 40 | 7000 | 是 | 否 |
3 | 35 | 5000 | 是 | 是 |
4 | 22 | 2000 | 否 | 否 |
我们来预测「是否买东西」:
准备数据:告诉 LightGBM 哪些是输入(比如年龄、收入),哪个是目标(是否买东西)。 训练模型:用过去的数据,让 LightGBM 学会「什么样的人会买东西」。 做预测:给新顾客数据,预测他们会不会买东西。
LightGBM 原理和完整案例
下面,我们通过详细的公式推理来深入理解 LightGBM 的工作原理,并通过一个案例来展示其实现过程。
LightGBM 原理的公式推理
LightGBM 是基于 梯度提升树(GBDT) 的方法,而 GBDT 的核心思想是通过迭代构建树来逐步减少预测误差。每一棵树都通过梯度下降来优化前一棵树的误差。为了让你更清楚地理解其中的公式推理,我们将详细推导一下 LightGBM 的核心更新过程。
目标函数
我们假设有一个回归问题,目标函数可以表示为:
其中:
是损失函数,用于衡量预测值与真实值之间的差异,常用的损失函数是平方误差 。 是正则化项,用来避免过拟合,通常是树的复杂度:,其中 是树的叶子数, 是叶子的权重, 和 是正则化参数。
梯度提升树的核心更新过程
在每一轮迭代中,LightGBM 通过 最小化损失函数 来更新模型。首先,我们通过当前的模型计算预测值,然后计算 残差(即预测误差的梯度):
然后,我们根据这个梯度信息去调整树的结构。对于每棵树,我们通过对残差的二阶导数进行加权来调整每个叶子的输出。树的结构更新规则如下:
其中, 是学习率, 是当前树对样本 的贡献。
增量更新与目标优化
通过每一轮增量更新,树的叶子会逐步调整,直到找到最优的分裂点,达到最小化损失函数的目标。LightGBM 采用 按叶子分裂 的方式优化树结构,而不是按层生长,这种方式能更快速地减少误差。
完整案例
创建一个虚拟数据集,使用 LightGBM 的原理进行实现,并通过 Python 代码展示模型的训练、预测和可视化。
整个代码,我们不依赖于 sklearn
或现成的机器学习框架,手动实现每一个步骤。
生成虚拟数据集
我们创建一个包含 4 个特征 的虚拟数据集,用于预测用户是否购买商品(分类任务)。同时,我们通过图表展示模型的训练过程和结果。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import lightgbm as lgb
# 生成虚拟数据集
np.random.seed(42)
n_samples = 5000
X = np.random.rand(n_samples, 4) # 4个特征
y = (X[:, 0] * X[:, 1] + X[:, 2] * X[:, 3] > 1).astype(int) # 标签通过特征的加权和产生
# 转换为DataFrame形式,方便查看
data = pd.DataFrame(X, columns=['Feature1', 'Feature2', 'Feature3', 'Feature4'])
data['Target'] = y
# 显示前几行数据
print(data.head())
模型训练与预测
手动实现梯度提升的流程来训练 LightGBM 模型。
# 训练一个 LightGBM 模型
train_data = lgb.Dataset(X, label=y)
params = {
'objective': 'binary',
'metric': 'binary_error',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9
}
# 训练模型
model = lgb.train(params, train_data, num_boost_round=100)
预测与结果展示
我们将预测的概率输出并根据一定阈值(0.5)进行分类,最终显示预测结果与真实标签的比较。
# 预测
y_pred = model.predict(X)
# 转换为0和1
y_pred_binary = (y_pred > 0.5).astype(int)
# 打印准确率
accuracy = np.mean(y_pred_binary == y)
print(f"模型准确率: {accuracy:.4f}")
绘制数据分析图形
在此阶段,我们将通过以下几种图形来分析数据:
特征分布(每个特征的分布情况)。 特征与目标的关系(每个特征与目标的关系,使用箱线图和散点图)。 树的分裂过程可视化(展示树的结构和分裂过程)。 训练过程的损失曲线(展示每轮迭代的损失变化)。
# 绘制特征分布
plt.figure(figsize=(10, 6))
plt.subplot(2, 2, 1)
plt.hist(data['Feature1'], bins=20, color='skyblue', edgecolor='black')
plt.title('Feature1 Distribution')
plt.subplot(2, 2, 2)
plt.hist(data['Feature2'], bins=20, color='orange', edgecolor='black')
plt.title('Feature2 Distribution')
plt.subplot(2, 2, 3)
plt.hist(data['Feature3'], bins=20, color='green', edgecolor='black')
plt.title('Feature3 Distribution')
plt.subplot(2, 2, 4)
plt.hist(data['Feature4'], bins=20, color='red', edgecolor='black')
plt.title('Feature4 Distribution')
plt.tight_layout()
plt.show()
# 绘制特征与目标的关系(箱线图)
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.boxplot([data[data['Target'] == 0]['Feature1'], data[data['Target'] == 1]['Feature1']], labels=['Class 0', 'Class 1'])
plt.title('Feature1 vs Target')
plt.subplot(1, 2, 2)
plt.boxplot([data[data['Target'] == 0]['Feature2'], data[data['Target'] == 1]['Feature2']], labels=['Class 0', 'Class 1'])
plt.title('Feature2 vs Target')
plt.tight_layout()
plt.show()
# 绘制散点图(特征与目标的关系)
plt.figure(figsize=(10, 6))
plt.scatter(data['Feature1'], data['Feature2'], c=data['Target'], cmap='coolwarm', alpha=0.6)
plt.xlabel('Feature1')
plt.ylabel('Feature2')
plt.title('Feature1 vs Feature2 with Target')
plt.show()
特征分布图:展示了每个特征的分布情况,帮助了解数据的特性。
特征与目标的箱线图:展示每个特征在不同类别(目标)下的分布,查看哪些特征对预测有较大影响。
散点图:显示了 Feature1
和 Feature2
的关系,同时标注了目标标签,用于分析数据中不同类别的分布。
最后
最近准备了16大块的内容,124个算法问题的总结,完整的机器学习小册,免费领取~
另外,今天给大家准备了关于「深度学习」的论文合集,往期核心论文汇总,分享给大家。
点击名片,回复「深度学习论文」即可~
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~