查看全课大纲(第 32 / 35 节)

电商销量预测项目背景介绍

约 6 分钟

小象实战讲义 · 特征工程精讲与实践

在本节中,我们将正式开启《特征工程精讲与实践》课程的最终实战环节。我们将聚焦一个来自 Kaggle 的真实电商场景比赛——Predict Future Sales,通过剖析其项目背景、数据构成与评估目标,为后续的特征工程与建模实战奠定基础。学完本节,你将清晰理解一个工业级销量预测任务的全貌,并了解如何从公开竞赛中获取思路与灵感。

💡 核心导读

  • 项目来源:了解 Kaggle 平台上的 “Predict Future Sales” 比赛背景及其现实意义。
  • 数据概览:认识比赛提供的多份数据文件(销量、商品、商店信息)及其关联关系。
  • 任务目标:明确预测未来月销量这一回归问题的具体形式与评估指标(RMSE)。
  • 解法生态:学习如何利用 Kaggle Notebooks 分享区借鉴他人思路,构建自己的解决方案。
  • 实践理念:建立“数据驱动场景无标准答案”的工程思维,理解解决方案的迭代优化本质。

项目背景与场景价值

我们今天为大家挑选了一个实际场景的案例,来带大家看一看在解决这类真实问题时,特征工程部分具体会用到哪些处理,以及我们是如何完成这个过程的。

这个案例来源于 Kaggle 上一个非常典型的比赛,名为 Predict Future Sales(预测未来销量)。这个场景之所以出色,是因为其背景是我们日常高频接触的电商领域。在电商场景下,数据形态通常非常丰富,为我们进行特征工程提供了广阔的舞台。

该比赛由俄罗斯的一家公司举办,它整合了自身的历史销售数据,以及一部分希望进行预测的未来商品信息,最终构建了本数据集。这是一个非常贴近实际业务的预估场景。

数据与任务说明

点击比赛的 Data 页面,我们可以看到实际的数据文件说明。比赛提供了多个数据文件,主要包括:

  1. 训练集:包含历史销量数据,因为任务目标是预测未来商品销量。
  2. 辅助信息:提供了商品和商店的详细属性信息。 我们需要结合这些多源信息,共同完成销量预测任务。

具体任务目标:需要提交的是训练集数据之后的下一个月,42家商店中每家商店对应的5100件商品的销量预测。 最终预测结果的范围被限制在 0~20 之间(可能是对原始销量做了某种变换处理)。由于是连续值预测,即一个回归问题,比赛采用的评估指标是 RMSE(均方根误差;课程视频中口述为 MSE,而 Kaggle 官方页面定义的是 RMSE——两者只差一次开方,对模型优劣的排序结论没有影响)。

比赛为我们提供了预测月份之前 34个月 的历史销量数据(date_block_num 取值 0~33 共 34 个唯一月份,预测目标月为 34,即 2015 年 11 月),这为模型学习时序规律和特征构建提供了基础。

学习社区与解决方案参考

对于此类公开比赛,一个非常重要的学习途径是 Kaggle 的 Notebooks 分享区。在该比赛的 Notebooks 界面,有大量参赛者分享自己的解决方案(Solution)。这些 Notebook 通常包含:

  • EDA:数据探索性分析。
  • Preprocessing:数据预处理。
  • Feature Engineering:各式各样的特征工程。
  • Modeling & Optimization:建模及优化。

我们参考了分享区中的许多优秀思路,整理形成了一个解决方案。该方案在 1 万多支队伍中可以达到前 30 名左右的排名(例如第 28 名),这是一个相对靠前的成绩。需要特别说明的是,这个解决方案融合了许多参赛者的不同想法。

更重要的是,我们必须建立这样一个认知:对于数据驱动的建模场景,不存在所谓的“标准答案”。我们提供的、以及任何你在分享区看到的解决方案,都仅仅是一个参考。如果你能根据对业务场景的更深理解,构建新的特征,或者借鉴其他 Notebook 中的好想法,整合或改进现有的数据处理流程,模型的性能仍有提升空间。

因此,本项目实战的核心目的,是结合电商这一典型场景,带领大家回顾并综合运用课程中学到的各种数据处理与特征构建方法,将理论知识转化为解决实际问题的能力。

下面,我们通过一个极简的代码示例,来感受一下数据的基本形态。请注意,此处我们使用手动构造的微型样例来模拟数据关系,真实比赛数据规模庞大(如 sales_train.csv 约 90MB),字段也更复杂。

import pandas as pd

# 构造微型样例数据,模拟核心数据表间关系
# 1. 商品信息表 (items)
items_data = {
    'item_id': [100, 101, 102],
    'item_category_id': [5, 5, 8]
}
items_df = pd.DataFrame(items_data)

# 2. 商店信息表 (shops)
shops_data = {
    'shop_id': [10, 11],
    'shop_city': ['City_A', 'City_B']
}
shops_df = pd.DataFrame(shops_data)

# 3. 销售训练集 (sales_train) - 核心事实表
# 字段说明:date (日期), date_block_num (月份编号), shop_id, item_id, item_price (单价), item_cnt_day (日销量)
sales_data = {
    'date': ['01.10.2013', '02.10.2013', '03.10.2013'],
    'date_block_num': [1, 1, 1],
    'shop_id': [10, 10, 11],
    'item_id': [100, 101, 102],
    'item_price': [299.0, 199.0, 499.0],
    'item_cnt_day': [1.0, 2.0, 1.0]
}
sales_df = pd.DataFrame(sales_data)

print("商品表样例:")
print(items_df)
print("\n商店表样例:")
print(shops_df)
print("\n销售训练集样例:")
print(sales_df)

# 展示如何通过关键字段关联数据 (模拟)
print("\n--- 关联查询示例:获取10月1日销售的商品类别信息 ---")
merged_sample = sales_df.merge(items_df, on='item_id', how='left')
print(merged_sample[['date', 'shop_id', 'item_id', 'item_category_id', 'item_cnt_day']])
商品表样例:
   item_id  item_category_id
0      100                 5
1      101                 5
2      102                 8

商店表样例:
   shop_id shop_city
0       10    City_A
1       11    City_B

销售训练集样例:
         date  date_block_num  shop_id  item_id  item_price  item_cnt_day
0  01.10.2013               1       10      100       299.0           1.0
1  02.10.2013               1       10      101       199.0           2.0
2  03.10.2013               1       11      102       499.0           1.0

--- 关联查询示例:获取10月1日销售的商品类别信息 ---
         date  shop_id  item_id  item_category_id  item_cnt_day
0  01.10.2013       10      100                 5           1.0
1  02.10.2013       10      101                 5           2.0
2  03.10.2013       11      102                 8           1.0

📝 动手练一练

  1. 概念辨析:为什么说电商销量预测场景下进行特征工程有“广阔的舞台”?请结合你了解的电商业务,列举2-3个可能用于预测销量的特征方向(例如:时间相关、商品属性相关、促销相关等)。
👉 点击查看参考答案

电商业务数据源多、维度广。特征方向举例:

  • 时间相关:月份、星期几、是否节假日、距离大促天数。
  • 商品属性相关:商品类别、品牌、价格段、上架时长。
  • 商店相关:商店所在城市、规模、历史平均销量。
  • 行为相关:商品近期浏览量、加购次数、历史销量统计量(如过去1/3/6个月的平均销量)。
  • 交叉相关:特定商品在特定商店的历史销量、商品类别在节假日的销量表现等。
  1. 动手实践:在上述代码示例中,我们构造了 sales_df、items_df 和 shops_df。请尝试编写一个独立的代码块,计算每个 item_category_id 在示例数据中的总销售额(提示:销售额 = item_price * item_cnt_day)。你的代码块需要包含必要的 import 和数据构造。
👉 点击查看参考答案
import pandas as pd

# 独立构造数据(自包含)
items_data = {'item_id': [100, 101, 102], 'item_category_id': [5, 5, 8]}
items_df = pd.DataFrame(items_data)

sales_data = {
    'date': ['01.10.2013', '02.10.2013', '03.10.2013'],
    'shop_id': [10, 10, 11],
    'item_id': [100, 101, 102],
    'item_price': [299.0, 199.0, 499.0],
    'item_cnt_day': [1.0, 2.0, 1.0]
}
sales_df = pd.DataFrame(sales_data)

# 关联并计算
merged_df = sales_df.merge(items_df, on='item_id', how='left')
merged_df['revenue'] = merged_df['item_price'] * merged_df['item_cnt_day']
category_revenue = merged_df.groupby('item_category_id')['revenue'].sum().reset_index()

print("各商品类别总销售额:")
print(category_revenue)
各商品类别总销售额:
   item_category_id  revenue
0                 5    697.0
1                 8    499.0

本章小结

本节我们引入了课程的综合实战项目——Kaggle “Predict Future Sales” 电商销量预测。我们明确了项目的业务背景、数据构成(多表关联)、预测任务(回归问题,评估指标为 RMSE)以及从竞赛社区汲取灵感的学习方法。最重要的是,我们建立了“解决方案是迭代优化的起点而非终点”的工程实践观。

📋 行动清单

  • 访问 Kaggle 平台,搜索 “Predict Future Sales” 比赛,浏览其 Overview 和 Data 页面,熟悉官方数据描述。
  • 进入该比赛的 Notebooks 分享区,快速浏览2-3个高票 Solution,感受不同参赛者在特征工程上的思路差异。
  • 思考:如果让你来预测销量,仅基于已介绍的有限字段,你会最先尝试构建哪几个特征?为什么?

—— 小象教研组