【竞赛系列】机器学习实操项目09——全球城市计算AI挑战赛(基于LightGBM快速搭建baseline)

发布于:2025-09-11 ⋅ 阅读:(18) ⋅ 点赞:(0)

上一章:【竞赛系列】机器学习实操项目08——全球城市计算AI挑战赛(数据可视化分析)
下一章:
机器学习核心知识点目录:机器学习核心知识点目录
机器学习实战项目目录:【从 0 到 1 落地】机器学习实操项目目录:覆盖入门到进阶,大学生就业 / 竞赛必备

本部分基于前期数据探索分析的结果,构建机器学习预测模型。通过提取历史平移特征(前一天同期流量),使用LightGBM回归算法分别对进站人数(inNums)和出站人数(outNums)进行预测。模型采用1月28日数据作为验证集,对1月29日的流量进行预测,旨在利用机器学习方法捕捉复杂的时间序列模式,提升预测精度。

通过网盘分享的文件:天池地铁流量预测
链接: https://pan.baidu.com/s/1k-sI1sDGufBSLJveNTm6nA?pwd=pgkk 提取码: pgkk

一、工具库导入

1.1 导入数据处理与机器学习工具库

该步骤导入数据分析(numpy、pandas)、特征工程(TF-IDF、标准化等)、机器学习模型(XGBoost、LightGBM)及辅助工具(进度条、警告屏蔽等)。其中LightGBM是本部分的核心算法,用于构建流量预测的回归模型。

## 数据工具包(核心用于数值计算与数据处理)
import numpy as np
np.random.seed(42)  # 设置随机种子,确保实验可复现
import pandas as pd  # 用于数据读取、清洗和特征处理
from tqdm import tqdm  # 显示循环进度条,便于监控处理进度

## 字符串处理工具包(本案例暂未使用,备用)
import string  # 字符串操作工具
import re  # 正则表达式,用于文本匹配
import gensim  # 文本语义模型(如Word2Vec)
from collections import Counter  # 计数工具
import pickle  # 数据序列化存储
from nltk.corpus import stopwords  # NLTK停用词表

# 特征工程与模型评估工具
from sklearn.feature_extraction.text import TfidfVectorizer  # 文本TF-IDF特征提取(备用)
from sklearn.decomposition import TruncatedSVD  # 截断奇异值分解(备用)
from sklearn.preprocessing import StandardScaler  # 数据标准化(备用)
from sklearn.model_selection import train_test_split  # 数据集拆分(备用)
from sklearn.metrics import roc_auc_score  # AUC评估指标(备用)
from sklearn.model_selection import KFold  # K折交叉验证(备用)

import warnings
warnings.filterwarnings('ignore')  # 屏蔽警告信息,保持输出简洁

# 梯度提升树模型(核心用于构建预测模型)
import xgboost as xgb  # XGBoost模型(备用)
import lightgbm as lgb  # LightGBM模型(核心)
from functools import partial  # 函数参数固定工具

# 系统与时间工具
import os  # 文件系统操作
import gc  # 垃圾回收,释放内存
from scipy.sparse import vstack  # 稀疏矩阵拼接(备用)
import time  # 时间计时
import datetime  # 日期处理

import joblib  # 模型保存与加载工具

# 多进程与可视化工具
import multiprocessing as mp  # 多进程处理(备用)
import pandas as pd  # 重复导入确保代码块独立运行
import numpy as np  # 重复导入确保代码块独立运行
import matplotlib.pyplot as plt  # 数据可视化(备用)
import re  # 重复导入确保代码块独立运行
%matplotlib inline  # Jupyter中内嵌显示图像
import seaborn as sns  # 高级可视化工具(备用)
%matplotlib inline  # 重复设置确保图像显示

二、数据加载与特征工程

2.1 加载数据集

该步骤读取训练数据(包含历史流量记录)和测试提交模板(用于最终结果输出)。训练数据df_data.csv包含各站点的10分钟级流量数据,是模型训练的基础。

from tqdm import tqdm  # 进度条工具
from tqdm import tqdm_notebook  # Notebook环境进度条(备用)

# 读取训练数据:包含站点ID、时间段、进出站人数等信息
df_data = pd.read_csv('./input/df_data.csv')
# 读取测试提交模板:用于存储1月29日的预测结果
test_A_submit = pd.read_csv('./input/testA_submit_2019-01-29.csv') 

2.2 提取时间特征

该步骤将startTime转换为 datetime 格式,提取日(day)、小时(hours_in_day)、星期几(day_of_week)和日内10分钟段(ten_minutes_in_day)等时间特征,为模型提供时间维度的输入。

# 时间相关特征:将startTime转换为datetime格式
df_data['time'] = pd.to_datetime(df_data['startTime'])
df_data['day'] = df_data['time'].dt.day  # 提取日期(1-31)
df_data['hours_in_day'] = df_data['time'].dt.hour  # 提取小时(0-23)
df_data['day_of_week'] = df_data['time'].dt.dayofweek  # 提取星期几(0-6,0为周一)
# 提取日内10分钟段(0-143):每小时6个段,24*6=144个段
df_data['ten_minutes_in_day'] = df_data['hours_in_day'] * 6 + df_data['time'].dt.minute // 10 
del df_data['time']  # 删除临时时间列,减少冗余

2.3 构建历史平移特征

该步骤创建前一天同期流量特征(bf_inNums、bf_outNums),即某一时间段的流量值等于前一天同一时间段的流量值。历史平移特征能有效捕捉时间序列的连续性,帮助模型学习相邻日期的流量关联。

# 定义需要处理的日期列表:2-25日、28日和29日(覆盖训练、验证和测试日期)
days = [i for i in range(2,26)] + [28,29]
# 初始化历史平移特征列
df_data['bf_inNums'] = 0  # 前一天同期进站人数
df_data['bf_outNums'] = 0  # 前一天同期出站人数

# 遍历日期列表,为每个日期填充前一天的同期流量
for i, d in enumerate(days):
    if d == 1:  # 1日没有前一天数据,跳过
        continue
    # 为当前日期d填充前一天(days[i-1])的进站人数
    df_data.loc[df_data.day==d, 'bf_inNums'] = df_data.loc[df_data.day==days[i-1], 'inNums'].values
    # 为当前日期d填充前一天(days[i-1])的出站人数
    df_data.loc[df_data.day==d, 'bf_outNums'] = df_data.loc[df_data.day==days[i-1], 'outNums'].values

三、数据集拆分

3.1 划分训练集、验证集和测试集

该步骤根据日期拆分数据:1月28日之前的数据作为训练集(df_train),1月28日数据作为验证集(df_valid),1月29日数据作为测试集(df_test)。同时分离输入特征(X)和目标变量(y),为模型训练做准备。

# 定义特征列:排除时间戳(startTime、endTime)和目标变量(inNums、outNums)
cols = [f for f in df_data.columns if f not in ['startTime','endTime','inNums','outNums']]

# 按日期划分数据集
df_train = df_data[df_data.day<28]  # 训练集:1月28日之前的数据
df_valid = df_data[df_data.day==28]  # 验证集:1月28日数据
df_test = df_data[df_data.day==29]   # 测试集:1月29日数据(待预测)

# 提取输入特征
X_train = df_train[cols].values  # 训练集特征
X_valid = df_valid[cols].values  # 验证集特征
X_test  = df_test[cols].values   # 测试集特征

# 提取目标变量(进站人数)
y_train_inNums = df_train['inNums'].values  # 训练集进站人数
y_valid_inNums = df_valid['inNums'].values  # 验证集进站人数

# 提取目标变量(出站人数)
y_train_outNums = df_train['outNums'].values  # 训练集出站人数
y_valid_outNums = df_valid['outNums'].values  # 验证集出站人数

四、LightGBM模型训练与预测

4.1 训练进站人数预测模型

该步骤使用LightGBM回归算法(L1损失)训练进站人数预测模型。通过设置早停机制(early stopping)防止过拟合,以验证集的平均绝对误差(MAE)作为评估指标,最终输出1月29日的进站人数预测结果。

# 定义LightGBM模型参数
params = {
    'num_leaves': 63,  # 叶子节点数量
    'objective': 'regression_l1',  # L1损失(MAE)回归
    'max_depth': 5,  # 树的最大深度,控制复杂度
    'learning_rate': 0.01,  # 学习率
    'boosting': 'gbdt',  # 梯度提升类型
    'metric': 'mae',  # 评估指标:平均绝对误差
    'lambda_l1': 0.1,  # L1正则化系数,防止过拟合
    'verbose': -1,  # 不输出详细日志
}

# 初始化模型:设置迭代次数上限20000,使用4线程并行
model = lgb.LGBMRegressor(**params, n_estimators=20000, nthread=4, n_jobs=-1)

# 训练模型
model.fit(
    X_train, y_train_inNums,  # 训练集特征和目标变量
    eval_set=[(X_train, y_train_inNums), (X_valid, y_valid_inNums)],  # 训练集和验证集
    eval_metric='mae',  # 评估指标
    callbacks=[
        lgb.log_evaluation(period=200),  # 每200轮输出一次训练日志
        lgb.early_stopping(stopping_rounds=50)  # 验证集指标50轮无提升则早停
    ]
)

# 预测测试集(1月29日)的进站人数,使用最佳迭代次数
y_pred_inNums = model.predict(X_test, num_iteration=model.best_iteration_)

输出结果:

Training until validation scores don't improve for 50 rounds
[200]	training's l1: 31.2263	valid_1's l1: 28.5485
[400]	training's l1: 23.6214	valid_1's l1: 19.5735
Early stopping, best iteration is:
[478]	training's l1: 23.0791	valid_1's l1: 19.2685

4.2 训练出站人数预测模型

该步骤重复4.1的逻辑,训练出站人数预测模型。同样采用L1损失和早停机制,最终输出1月29日的出站人数预测结果。

# 初始化模型:参数与进站人数模型一致
model = lgb.LGBMRegressor(** params, n_estimators=20000, nthread=4, n_jobs=-1)

# 训练模型(目标变量改为出站人数)
model.fit(
    X_train, y_train_outNums,  # 训练集特征和出站人数目标变量
    eval_set=[(X_train, y_train_outNums), (X_valid, y_valid_outNums)],  # 训练集和验证集
    eval_metric='mae',  # 评估指标
    callbacks=[
        lgb.log_evaluation(period=200),  # 每200轮输出日志
        lgb.early_stopping(stopping_rounds=50)  # 早停机制
    ]
)

# 预测测试集(1月29日)的出站人数
y_pred_outNums = model.predict(X_test, num_iteration=model.best_iteration_)

输出结果:

Training until validation scores don't improve for 50 rounds
[200]	training's l1: 31.7025	valid_1's l1: 31.0202
[400]	training's l1: 23.9774	valid_1's l1: 21.2645
Early stopping, best iteration is:
[491]	training's l1: 23.3092	valid_1's l1: 20.696

通过上述步骤,我们成功构建了基于LightGBM的地铁流量预测模型,分别得到了1月29日各站点10分钟级的进站和出站人数预测结果。模型利用历史平移特征捕捉时间序列的连续性,通过早停机制控制过拟合,为后续的结果提交和应用奠定了基础。

上一章:【竞赛系列】机器学习实操项目08——全球城市计算AI挑战赛(数据可视化分析)
下一章:
机器学习核心知识点目录:机器学习核心知识点目录
机器学习实战项目目录:【从 0 到 1 落地】机器学习实操项目目录:覆盖入门到进阶,大学生就业 / 竞赛必备


网站公告

今日签到

点亮在社区的每一天
去签到