上一章:【竞赛系列】机器学习实操项目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 落地】机器学习实操项目目录:覆盖入门到进阶,大学生就业 / 竞赛必备