Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

14.2 实战 2:商品销量预测(回归任务 + 时间序列)

Scikit-learn实战教程:商品销量预测(回归与时间序列分析)

Scikit-learn 中文教程

本教程通过实战案例讲解如何使用Scikit-learn进行电商商品销量预测,涵盖业务需求分析、时间序列数据处理、特征工程、回归模型训练和评估,帮助初学者掌握回归和时间序列预测的实战技巧。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

实战 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文档和相关时间序列预测资源。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包