一、使用LightGBM解决机器学习问题
1. 数据集的可视化分析
在机器学习的任务中,首先需要对数据集进行可视化分析,以理解数据的分布和特征。
- 柱状图和折线图绘制:
- 使用Python中的matplotlib或者seaborn库绘制柱状图和折线图。
- 柱状图用于展示类别型变量的分布或者计数统计。
- 折线图通常用于展示时间序列数据的趋势变化。
2. 特征工程
特征工程是提升机器学习模型性能的关键步骤,特别是在时间序列数据中。
- 历史平移特征:
- 对于时间序列数据,可以构建历史平移特征,即将过去若干时间点的数据作为新的特征。
- 例如,对于每个时间点,可以添加前一天、前一周或前一个月的特征值。
- 窗口统计特征:
- 通过定义窗口大小,计算在该窗口内的统计量,如均值、标准差、最大最小值等。
- 这种方法能够捕捉数据的局部趋势和周期性。
3. 使用LightGBM模型进行训练和预测
LightGBM是一种高效的梯度提升框架,适用于各种机器学习任务,特别是大规模和高维度数据集。
- 训练步骤:
准备数据集,包括特征工程后的数据。
定义模型参数,如学习率、树的数量、深度等。
使用交叉验证(cross-validation)来调优参数,防止过拟合。
- 预测步骤:
使用训练好的模型对新数据进行预测。
可以根据具体问题调整阈值或者后处理方法来优化预测结果。
4. 深入学习和优化
- 持续改进特征:
通过数据分析和领域知识不断改进特征工程,提高模型的预测能力。
- 模型调优:
尝试不同的模型参数组合和特征选择策略,以提高模型的泛化能力和性能。
二、基本概念
GBDT
1. 模型概述
GBDT是一种集成学习方法,通过串行训练多棵决策树来逐步提升模型的预测能力。它的核心思想是结合多棵树的预测结果,从而获得比单棵树更好的泛化能力和预测精度。
-
集成学习:通过结合多个弱分类器(决策树),GBDT能够减少偏差并提高模型的预测准确性。
-
梯度提升:GBDT采用梯度提升方法,每棵新树的训练目标是减少之前模型的残差(或者对于某些损失函数,是负梯度)。
2. 应用领域和优势
GBDT在各个领域都有广泛的应用,并且在工业界和数据科学竞赛中都表现出色:
-
工业应用:
- 多分类:适用于处理具有多个类别的分类问题,例如文本分类、图像分类等。
- 点击率预测:在在线广告和推荐系统中,GBDT可以预测用户点击某个广告或推荐的概率。
- 搜索排序:用于搜索引擎中,通过学习用户的点击模式和搜索行为来优化搜索结果的排序。
-
竞赛应用:
- Kaggle竞赛:据统计,大量的Kaggle竞赛中的冠军方案都采用了GBDT作为核心模型,因其优秀的预测能力和鲁棒性。
3. 关键优点
GBDT相比其他机器学习模型具有多个显著优点:
- 预测准确性高:通过集成多棵树的方法,GBDT能够有效地捕捉数据中的复杂关系,提升预测精度。
- 不易过拟合:GBDT在训练过程中通过集成学习和梯度提升来逐步优化模型,减少了过拟合的风险。
- 处理多种数据类型:适用于处理数值型、类别型和混合型数据,具有较好的通用性。
LightGBM
1. 场景介绍
在个性化商品推荐场景中,通常需要构建点击预估模型来预测用户点击或购买某个商品的概率。这种模型能够通过分析用户的历史行为(点击、曝光但未点击、购买等),以及用户的属性特征来提供个性化的推荐服务。
2. 特征工程
在构建点击预估模型时,需要从用户行为和用户属性中提取合适的特征,包括:
-
类别特征(Categorical Feature):
- 字符串类型的特征,如性别(男/女)、用户地区等。
- LightGBM能够直接处理类别特征,不需要进行额外的编码工作,因此可以直接将字符串特征作为输入。
-
物品类型:
- 商品的类别信息,如服饰、玩具、电子产品等。
- 这些信息可以帮助模型理解用户对不同类型商品的偏好和行为模式。
-
数值特征(Numerical Feature):
- 整型或浮点型的特征,例如用户的活跃度指标、商品的价格等。
- 这些特征可以直接作为模型的输入,帮助模型更准确地预测用户的行为。
3. LightGBM模型的优势
LightGBM作为一个高效的梯度提升框架,在个性化推荐场景中具有以下优势:
-
训练效率高:
- LightGBM支持高效率的并行训练,能够快速处理大规模数据集,适合处理海量的用户行为数据。
-
内存消耗低:
- LightGBM设计了一些优化算法和数据结构,使得其在训练过程中内存消耗较低,能够处理大规模的特征空间。
-
准确率高:
- 通过梯度提升和优化的训练策略,LightGBM能够提供比较高的预测精度,有效地捕捉用户的偏好和行为模式。
-
支持多种模型:
- LightGBM不仅仅支持GBDT(梯度提升决策树),还支持随机森林和逻辑回归等模型,可以根据具体场景选择合适的模型。
4. 实践建议
-
数据预处理:
- 在使用LightGBM之前,需要对数据进行适当的清洗和特征工程,确保数据质量和模型的效果。
-
参数调优:
- LightGBM有许多参数可以调整,如学习率、树的数量、树的深度等,建议通过交叉验证来优化这些参数,以获得最佳的模型性能。
-
模型评估:
- 使用合适的评估指标(如AUC、准确率、召回率等)来评估模型的预测效果,确保模型在实际应用中具有良好的性能。
三、进阶代码
(1)导入模块
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.metrics import mean_squared_log_error, mean_absolute_error, mean_squared_error
import tqdm
import sys
import os
import gc
import argparse
import warnings
warnings.filterwarnings('ignore')
(2)探索性数据分析(EDA)
train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')
数据简单介绍:
-
其中id为房屋id,
-
dt为日标识,训练数据dt最小为11,不同id对应序列长度不同;
-
type为房屋类型,通常而言不同类型的房屋整体消耗存在比较大的差异;
-
target为实际电力消耗,也是我们的本次比赛的预测目标。
下面进行简单的可视化分析,帮助我们对数据有个简单的了解。
-
不同type类型对应target的柱状图
import matplotlib.pyplot as plt
# 不同type类型对应target的柱状图
type_target_df = train.groupby('type')['target'].mean().reset_index()
plt.figure(figsize=(8, 4))
plt.bar(type_target_df['type'], type_target_df['target'], color=['blue', 'green'])
plt.xlabel('Type')
plt.ylabel('Average Target Value')
plt.title('Bar Chart of Target by Type')
plt.show()
-
id为00037f39cf的按dt为序列关于target的折线图
specific_id_df = train[train['id'] == '00037f39cf'] plt.figure(figsize=(10, 5)) plt.plot(specific_id_df['dt'], specific_id_df['target'], marker='o', linestyle='-') plt.xlabel('DateTime') plt.ylabel('Target Value') plt.title("Line Chart of Target for ID '00037f39cf'") plt.show()
(3)特征工程
历史平移特征(Lag Feature)
历史平移特征是指利用过去时间点的数据来构建新的特征。在时间序列数据或者具有时间关联的数据中,这种特征可以帮助模型捕捉数据的趋势和周期性。
-
例子:
- 对于股票市场数据,可以构建过去几天的股价平移特征,如前一天、前两天、前一周等的收盘价或涨跌幅。
- 对于销售数据,可以构建过去几个月的销售量平移特征,如前一个月、前三个月等的销售量统计。
-
实现方法:
- 使用Python中的pandas库进行时间序列数据的处理和特征构建。
- 可以通过移动窗口函数(rolling)或者手动定义滞后时间来创建历史平移特征。
窗口统计特征(Window Statistics)
窗口统计特征是通过定义一个滑动窗口来计算在该窗口内的统计量。这种特征可以帮助模型捕捉数据的局部统计特性和动态变化。
-
例子:
- 滑动平均值:在每个时间点计算过去一周的平均销售量。
- 滑动标准差:在每个时间点计算过去一个月的收盘价的标准差。
- 滑动最大最小值:在每个时间点计算过去三天的最高和最低温度。
-
实现方法:
- 使用pandas中的rolling函数结合统计函数(如mean、std、max、min等)来计算滑动窗口内的统计特征。
- 可以根据具体问题和数据的周期性来选择窗口大小和统计函数。
# 合并训练数据和测试数据,并进行排序
data = pd.concat([test, train], axis=0, ignore_index=True)
data = data.sort_values(['id','dt'], ascending=False).reset_index(drop=True)
# 历史平移
for i in range(10,30):
data[f'last{i}_target'] = data.groupby(['id'])['target'].shift(i)
# 窗口统计
data[f'win3_mean_target'] = (data['last10_target'] + data['last11_target'] + data['last12_target']) / 3
# 进行数据切分
train = data[data.target.notnull()].reset_index(drop=True)
test = data[data.target.isnull()].reset_index(drop=True)
# 确定输入特征
train_cols = [f for f in data.columns if f not in ['id','target']]
(4)模型训练与测试集预测
这里选择使用Lightgbm模型,也是通常作为数据挖掘比赛的基线模型,在不需要过程调参的情况的也能得到比较稳定的分数。
另外需要注意的训练集和验证集的构建:因为数据存在时序关系,所以需要严格按照时序进行切分,
-
这里选择原始给出训练数据集中dt为30之后的数据作为训练数据,之前的数据作为验证数据,
-
这样保证了数据不存在穿越问题(不使用未来数据预测历史数据)
def time_model(lgb, train_df, test_df, cols):
# 训练集和验证集切分
trn_x, trn_y = train_df[train_df.dt>=31][cols], train_df[train_df.dt>=31]['target']
val_x, val_y = train_df[train_df.dt<=30][cols], train_df[train_df.dt<=30]['target']
# 构建模型输入数据
train_matrix = lgb.Dataset(trn_x, label=trn_y)
valid_matrix = lgb.Dataset(val_x, label=val_y)
# lightgbm参数
lgb_params = {
'boosting_type': 'gbdt',
'objective': 'regression',
'metric': 'mse',
'min_child_weight': 5,
'num_leaves': 2 ** 5,
'lambda_l2': 10,
'feature_fraction': 0.8,
'bagging_fraction': 0.8,
'bagging_freq': 4,
'learning_rate': 0.05,
'seed': 2024,
'nthread' : 16,
'verbose' : -1,
}
# 训练模型
model = lgb.train(lgb_params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix],
categorical_feature=[], verbose_eval=500, early_stopping_rounds=500)
# 验证集和测试集结果预测
val_pred = model.predict(val_x, num_iteration=model.best_iteration)
test_pred = model.predict(test_df[cols], num_iteration=model.best_iteration)
# 离线分数评估
score = mean_squared_error(val_pred, val_y)
print(score)
return val_pred, test_pred
lgb_oof, lgb_test = time_model(lgb, train, test, train_cols)
# 保存结果文件到本地
test['target'] = lgb_test
test[['id','dt','target']].to_csv('submit.csv', index=None)
四、总结
通过学习和实践,掌握了使用LightGBM解决机器学习问题的关键步骤和技巧。特征工程在机器学习竞赛中尤为重要,通过细致的数据分析和有效的特征构建,可以显著提升模型的效果。记住,数据和特征的质量决定了机器学习模型的上限,模型和算法只是逼近这个上限的工具。