14.2 实战 2:商品销量预测(回归任务 + 时间序列)
Scikit-learn实战教程:商品销量预测(回归与时间序列分析)
本教程通过实战案例讲解如何使用Scikit-learn进行电商商品销量预测,涵盖业务需求分析、时间序列数据处理、特征工程、回归模型训练和评估,帮助初学者掌握回归和时间序列预测的实战技巧。
实战 2:商品销量预测(回归任务 + 时间序列)
欢迎来到Scikit-learn高级教程的实战章节!在这一部分,我们将探索一个电商业务中的常见问题:商品销量预测。这涉及回归任务和时间序列分析,旨在帮助您优化库存管理。教程内容面向新手,力求简单易懂,并配有代码示例和解释。
业务需求分析:电商商品销量预测与库存优化
在电商领域,准确预测商品销量至关重要。为什么?因为它直接影响库存管理:销量过多可能导致库存积压和资金浪费;销量过少则可能脱销,错失销售机会。通过预测,您可以智能备货,提高运营效率。
- 目标:使用历史销量数据预测未来销量,以最小化库存成本和最大化客户满意度。
- 业务价值:优化库存水平,减少浪费,提高利润。
时间序列数据处理:使用TimeSeriesSplit避免数据泄露
时间序列数据有顺序性,不能用随机方式拆分训练和测试集,否则会导致数据泄露(即未来数据影响预测)。Scikit-learn提供了TimeSeriesSplit类来安全处理。
from sklearn.model_selection import TimeSeriesSplit
import pandas as pd
# 假设df是一个包含日期和销量的DataFrame
# 按时间排序
sorted_df = df.sort_values('date')
# 初始化TimeSeriesSplit
n_splits = 5 # 交叉验证折叠数
tscv = TimeSeriesSplit(n_splits=n_splits)
# 拆分特征X和目标y(假设y是销量)
X = sorted_df.drop(columns=['sales', 'date']) # 特征列
y = sorted_df['sales'] # 目标变量
# 使用TimeSeriesSplit进行交叉验证
for train_index, test_index in tscv.split(X):
X_train, X_test = X.iloc[train_index], X.iloc[test_index]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]
# 在此处训练和评估模型
解释:TimeSeriesSplit确保训练集总是先于测试集的时间顺序,避免数据泄露,适合时间序列预测任务。
特征工程:提取时间特征、滚动窗口特征和节假日特征
特征工程是提升模型性能的关键。对于时间序列数据,我们可以提取以下特征:
1. 时间特征
从日期中提取信息,如星期几、月份、年份等。
df['weekday'] = df['date'].dt.weekday # 星期几(0-6)
df['month'] = df['date'].dt.month # 月份
2. 滚动窗口特征
计算过去的统计值,如过去7天、30天的平均销量。
window_size = 7 # 例如,过去7天
df['rolling_mean'] = df['sales'].rolling(window=window_size).mean() # 滚动平均
df['rolling_std'] = df['sales'].rolling(window=window_size).std() # 滚动标准差
3. 节假日特征
添加二元标志,表示是否是节假日或促销期。
def is_holiday(date):
# 定义节假日列表(示例)
holidays = ['2023-01-01', '2023-12-25'] # 新年、圣诞节
return date in holidays
df['is_holiday'] = df['date'].apply(lambda x: 1 if is_holiday(x) else 0)
将所有特征合并到X中,准备用于模型训练。
回归模型训练:使用XGBoost和LightGBM堆叠
堆叠(Stacking)是一种集成学习方法,结合多个模型的预测来提升性能。这里使用XGBoost和LightGBM作为基模型。
首先,安装所需库:XGBoost和LightGBM(如果未安装,可使用pip安装)。
import xgboost as xgb
import lightgbm as lgb
from sklearn.ensemble import StackingRegressor
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
# 定义基模型
base_models = [
('xgb', xgb.XGBRegressor(n_estimators=100, random_state=42)),
('lgb', lgb.LGBMRegressor(n_estimators=100, random_state=42))
]
# 定义元模型
meta_model = LinearRegression()
# 创建堆叠回归器
stacked_model = StackingRegressor(estimators=base_models, final_estimator=meta_model)
# 使用TimeSeriesSplit交叉验证训练
scores = cross_val_score(stacked_model, X, y, cv=tscv, scoring='neg_mean_absolute_percentage_error')
print("平均MAPE分数:", -scores.mean()) # 注意:负分数是因为scikit-learn的惯例
解释:堆叠模型结合了XGBoost和LightGBM的优势,元模型(线性回归)用于综合它们的输出,提升预测精度。使用交叉验证避免过拟合。
模型评估:MAPE与预测结果可视化
模型评估:使用MAPE
MAPE(平均绝对百分比误差)是一种常用的回归评估指标,衡量预测误差的百分比。
from sklearn.metrics import mean_absolute_percentage_error
# 假设有预测结果y_pred和真实值y_true
mape = mean_absolute_percentage_error(y_true, y_pred)
print(f"MAPE: {mape:.2%}") # 输出百分比形式
MAPE值越低,预测越准确。对于电商,MAPE小于10%通常表示良好。
预测结果可视化
可视化有助于直观比较预测值和真实值。
import matplotlib.pyplot as plt
# 绘制真实销量vs预测销量
plt.figure(figsize=(10,6))
plt.plot(y_true.index, y_true.values, label='真实销量', color='blue')
plt.plot(y_pred.index, y_pred, label='预测销量', color='red', linestyle='--')
plt.xlabel('日期')
plt.ylabel('销量')
plt.title('商品销量预测结果')
plt.legend()
plt.show()
总结
在本章中,我们完成了商品销量预测的实战项目。您学习了:
- 业务需求分析:将预测用于库存优化。
- 时间序列数据处理:使用TimeSeriesSplit避免数据泄露。
- 特征工程:提取时间、滚动窗口和节假日特征。
- 回归模型训练:使用XGBoost和LightGBM堆叠提升性能。
- 模型评估:用MAPE衡量误差,并通过可视化展示结果。
通过这个案例,您可以将这些技巧应用到实际电商数据中,提高预测准确性。继续练习,探索更多模型和特征!
如需进一步学习,请参考Scikit-learn文档和相关时间序列预测资源。