电子游戏日本市场销量预测实战 从 Kaggle 回归赛题到区域销售判断

这道 Kaggle 赛题聚焦一个很典型的业务问题:已知游戏平台、发行年份、类型、厂商、评分表现以及北美和欧洲等区域销量,预测游戏在日本市场的销售规模。任务形式是结构化数据回归,业务本质却是跨区域市场迁移判断,适合用来训练从数据理解到建模验证的完整分析能力。

这类题目的价值不在榜单本身,而在于它高度接近内容发行、区域备货和市场进入评估场景。面对日本这样偏好独特、区域差异明显的市场,仅凭海外销量做线性外推往往不够,只有把类别特征、评分信息和销售结构一起纳入建模,预测结果才更接近真实经营判断。

文章目录

赛题概述

本案例地址 Предсказание объемов продаж компьютерных игр

这是一道典型的结构化数据回归预测赛题,核心任务是依据游戏平台、发行年份、类型、发行商、海外区域销量以及评分信息,预测游戏在日本市场的销售规模。题目表面是 Kaggle 刷榜,实质更接近区域市场需求预估:当目标市场历史不充分或波动较强时,需要借助其他地区表现与产品属性做销售推断。练习价值集中在特征理解、偏态目标处理、类别变量建模、验证集设计与误差分析上,也适合作为业务预测建模与数据分析结合的入门项目。

模块名称 内容简介 所需技能 数据类型 应用场景
赛题背景 赛题聚焦跨区域销量迁移预测,本质是在已有北美、欧洲及其他地区销售表现的条件下,估计日本市场的销量水平。难点不只在于回归建模,还在于日本游戏消费偏好具有明显地域特征,导致同一产品在不同市场之间并不存在简单线性映射,项目更贴近真实商业中的区域化市场评估。 需要具备业务问题抽象能力,能够把"海外销量已知、目标区域销量未知"的场景转化为监督学习问题,并结合异常值识别、分布分析、类别特征处理和区域差异理解完成建模。 以结构化表格数据为主,包含产品基础属性、时间信息、品类标签、厂商信息、区域销量、专业评分与用户反馈等多源业务字段。 游戏发行评估、区域市场进入决策、内容本地化投入测算、跨市场销售预测,也可迁移到图书、影视、消费电子等具有区域差异的商品需求判断场景。
竞赛目标 参赛结果需要交付针对测试集游戏样本的日本销量预测值,输出形式是标准提交文件。项目本质不是做用户画像或文本理解,而是构建一套可解释的数值预测流程,用历史样本学习"产品属性 + 海外表现"到"目标市场销量"的映射关系。 重点在特征工程设计、回归模型选择、缺失值处理、目标变量变换、交叉验证方案制定,以及针对长尾销量样本进行稳健建模的能力。 训练数据与测试数据均为结构化商品级样本,伴随数值特征、离散特征、稀疏类别特征和偏态目标变量,通常还需要自建验证切分数据。 适用于新品上市预测、区域备货规划、发行节奏评估、商业潜力筛选等需要在信息不完整条件下提前做经营判断的业务流程。
评价指标 评审采用平均绝对误差,关注预测值与真实销量之间的绝对偏差,评价导向偏向"实际误差控制"而非极端样本放大惩罚。这意味着模型不仅要追求整体拟合,还要尽量减少常规样本上的平均预测偏差,避免被少数大销量样本牵着走。 需要理解回归评估逻辑,能够围绕业务误差定义调整建模策略,并通过验证集复现线上评分趋势,处理公开榜与隐藏榜可能存在的分布偏移问题。 涉及真实标签、预测结果、验证切分结果以及误差分析数据,必要时会扩展到残差分布、分桶评估和按品类或平台分组的效果对比。 适合用于销量预测、需求预估、预算测算等强调平均偏差可控的业务场景,能够直接对应经营侧对预测误差容忍度的管理要求。
业务意义 这类任务在真实项目中对应"先判断值不值得进入某个细分市场",价值不在单次榜单成绩,而在于把分散的产品属性、外部市场反馈和历史销售记录转成可执行的市场判断依据。对企业而言,这类模型可服务于发行决策、资源投放优先级排序和风险预估。 需要从数据分析走向业务落地,具备把预测结果转化为经营建议的能力,包括结果解释、置信区间意识、特征贡献分析、方案复盘与上线前验证思维。 除核心训练表外,真实落地时往往还会结合渠道数据、预售数据、营销投放记录、竞品表现和时间序列补充信息形成更完整的数据资产。 面向区域经营分析、零售预测、内容产品发行、国际化业务评估等场景,属于从数据建模走向商业决策支持的典型项目形态。

数据详解

这场竞赛的结构化信息可以分成两层来阅读:一层是直接服务于建模与提交的核心信息,另一层是 Kaggle 平台用于管理比赛状态、权限和页面展示的元数据。真正值得关注的部分并不多,重点集中在任务定义、目标变量、评估方式、训练与测试文件说明,以及提交约束上。赛题本质是一个带有区域市场差异背景的监督式回归问题,输入既包含游戏的基础属性,也包含北美、欧洲和其他地区的销量,以及评分、发行商、开发商等业务特征,目标是预测日本市场销量。标签结构中虽然只显示了一个 mae,但已经足以说明这不是排序问题,也不是分类问题,模型优化方向应围绕绝对误差控制展开。阅读比赛时间、队伍限制、每日提交次数和公开榜占比时,关注点不在平台流程本身,而在它们对实验节奏、验证策略和防止过拟合公开榜的影响。至于论坛 ID、组织 ID、Notebook 开关、内部校验字段等信息,更多属于平台管理属性,对理解数据和建模价值有限,可以忽略。

字段名称 类型/范围 描述信息
competition_title 字符串 赛题标题,说明任务主题是"预测电子游戏销量"。标题本身揭示了业务领域,适合用来快速判断这是典型的销售预测与回归建模问题。
competition_subtitle 字符串 副标题明确给出预测逻辑:基于其他地区已知销量,预测日本销量。这一点决定了建模时要重点利用区域间销量关系,而不是只把它看成普通的商品销量回归。
category_level_1 / category_level_2 字符串 竞赛被归类为"时序预测 / 销售预测",有助于建立任务认知。尽管数据未必是严格按时间序列展开,但"年份"和"跨区域销量迁移"使其具备明显的销售预测语境。
tags JSON 数组 当前标签核心是 MAE,说明评价关注预测值与真实值之间的绝对偏差平均水平。对存在长尾销量、极端爆款和大量低销量样本的场景,这类指标比平方误差更稳健。
evaluation_algorithm_name 字符串 评价指标为平均绝对误差(MAE)。这直接决定模型选择、损失函数设计和本地验证方式,线下评估最好与线上保持一致。
evaluation_algorithm_description Markdown 长文本/字符串 补充说明 MAE 的含义,即逐样本绝对误差的平均值。理解这一点后,建模时通常会更关注整体稳健性,而不是仅优化少数高销量样本。
evaluation_algorithm_is_max 布尔值 取值为 False,表示分数越低越好。虽然是一个简单标记,但可以避免误读排行榜方向。
overview Markdown 长文本 这是最重要的赛题说明文本,包含业务背景、预测目标、训练集与测试集规模、提交格式,以及日本市场具有特殊性的原因。真正理解任务边界,主要依赖这一字段。
dataset_description Markdown 长文本 数据字典与文件说明的核心来源。字段含义、可用特征、目标变量、文件名称都在这里给出,是开展特征工程前必须认真阅读的内容。
dataset_url URL 数据下载入口。对实际操作的价值高于页面说明字段,因为训练文件、测试文件和示例提交文件都需要从这里获取。
rules Markdown 长文本 比赛规则文本,重点不是平台措辞,而是能提炼出可执行约束,如每日提交次数、最终可计分提交数量、是否允许组队与合并。对实验管理和参赛策略有直接影响。
enabled_date 时间 比赛开放时间。对复盘类文章意义大于实战,但可以帮助判断比赛年代与数据背景,间接影响对平台、发行商和评分体系时效性的理解。
deadline_date 时间 结构化数据中的报名截止时间显示较晚,但与规则页中的历史结束时间存在不一致。阅读这类字段时应以任务是否可提交和页面实际状态为准,不宜机械依赖单一时间字段。
leaderboard_percentage 浮点数(百分比) 公共排行榜开放比例为 30%。这意味着线上公开分数只覆盖部分测试集,模型调参若过度依赖公开榜,容易出现私榜波动。
max_daily_submissions / num_scored_submissions 整数 结构化数据给出每日最多提交次数和最终计分提交数量,这类字段决定实验节奏。提交额度有限时,更需要提前做好本地交叉验证,而不是把 Kaggle 当作调参器。
max_team_size / ban_team_mergers / enable_team_models 整数 + 布尔值 队伍规模与合队限制说明这更适合个人独立完成。对学习者而言,这种设定有利于完整训练从特征工程到验证提交的个人实战能力。
reward_quantity / num_prizes 浮点数 + 整数 奖金为 0,奖项设置也极少,说明这更偏向练习型或社区型竞赛。实际价值不在奖金,而在利用小型结构化数据完成一轮标准化预测任务。
total_teams / total_competitors / total_submissions 整数 参赛队伍 746、提交 5404 次,说明比赛具有一定活跃度。对复盘者而言,这类规模信息可以帮助判断排行榜竞争强度与基线模型的参考价值。
total_compressed_bytes / total_uncompressed_bytes 整数(字节) 数据集体量较小,压缩后约 0.54 MB,解压后约 1.62 MB。意味着本题更适合在普通本地环境快速实验,建模瓶颈主要在特征处理和验证设计,而不是算力。
Video_Games.csv(训练文件) CSV 文件 训练集,包含每款游戏的属性信息、其他地区销量以及目标字段 JP_Sales。这是监督学习建模的核心数据来源。
Video_Games_Test.csv(测试文件) CSV 文件 测试集,包含需要预测的 5016 款游戏记录,不含目标值。线上提交的结果就是针对该文件生成的预测。
Video_Games_Sample.csv(示例提交) CSV 文件 示例提交文件,用于确认结果文件格式是否正确。对避免低级提交错误很有帮助,尤其适合初次接触 Kaggle 提交流程的场景。
Name 字符串 游戏名称。既可能提供品牌识别信息,也可能带来高基数类别问题。是否直接使用、如何编码,需要结合样本量和泛化风险判断。
Platform 类别字符串 游戏平台信息,反映硬件生态差异。对销量预测很关键,因为日本市场对不同平台的接受度往往与欧美不同。
Year_of_Release 整数/年份 发布年份提供时间背景,可反映行业周期、平台生命周期和市场偏好变化。虽然不是严格时序任务,但这是重要的时间特征。
Genre 类别字符串 游戏类型特征,通常与地区文化偏好高度相关。对预测日本销量尤其重要,因为不同地区对 RPG、动作、体育等类型的偏好差异明显。
Publisher 类别字符串 发行商信息反映渠道能力、品牌影响力和本地化资源。对解释"为何同类游戏在日本销量差异很大"有较强业务意义。
Developer 类别字符串 开发商信息补充研发背景与作品风格,有时能捕捉特定厂商在日本市场的长期号召力。
NA_Sales / EU_Sales / Other_Sales 浮点数(百万美元) 其他地区销量是本题最直接、最有信息量的预测信号。副标题已经说明任务核心就是利用这些区域销量去推断日本市场表现。
Critic_Score / Critic_Count 数值型 媒体评价及评价数量,体现专业口碑与曝光度。对销量解释通常有效,但也可能存在缺失和量纲差异,需要在预处理中统一处理。
User_Score / User_Count 数值型 玩家评分与评分人数,反映用户侧反馈。与媒体评分一起使用时,常能补足不同受众对游戏接受度的差异。
Rating 类别字符串 年龄分级信息,可作为市场准入与受众范围的代理变量。某些分级在特定地区的商业表现差异较大,对销量预测有现实意义。
JP_Sales 浮点数(百万美元) 目标标签字段,即日本地区销量。训练阶段以此作为监督信号,提交阶段需要输出该字段的预测值。
提交文件格式 Id, JP_Sales CSV 结构 结果文件只需要样本编号和预测销量两列。格式非常简单,但它明确了比赛只评估最终数值预测,不涉及解释性报告或附加材料。
平台管理类字段(如论坛 ID、组织 ID、Notebook 开关、模型附件校验等) 多种类型 这类字段主要用于平台运行和页面控制,对理解业务问题、数据结构和建模方案帮助有限。阅读时可统一视为弱相关元数据,避免分散注意力。

解题思路

这道题表面上是一个常规回归预测任务,实际很适合并行尝试多条建模路线。原因在于数据同时包含结构化类别特征、数值特征以及明显的区域销售关联关系,目标又是预测日本市场销量,既可以从业务规律出发做统计映射,也可以把问题交给树模型、线性模型甚至神经网络去学习非线性关系。评价指标采用平均绝对误差,意味着模型不仅要追求排序能力,更要尽量控制每个样本的绝对偏差,这会直接影响目标变换、异常值处理和融合策略的选择。虽然题目本质上并不是文本分类任务,但数据中的发行商、开发商、游戏名称等字段依然带有一定文本属性,因此可以借鉴部分文本建模思路,把文本信息转成向量后与结构化特征联合建模。在真实业务里,这类题目对应的正是"区域市场销量预估"问题,通常不会只依赖单一模型,而是同时比较规则基线、统计学习、非线性机器学习和深度学习方案,再依据验证集上的误差分布决定最终提交版本。

方法标题 案例适配度 方法说明 操作流程 优点 缺点
区域销售比例基线与分组统计回归 78% 把日本销量看作全球其他区域销量在特定平台、年份、类型和发行商条件下的映射结果,利用分组均值、中位数、销售占比和历史平滑统计量建立可解释基线。 清洗缺失值与异常值,构造 NA/EU/Other 销量总和与占比特征,按平台、类型、年份、发行商做分组统计,生成日本销量先验估计,对冷启动样本做全局平滑回退。 非常适合作为起点,解释性强,能直接反映"不同市场偏好不同"的业务规律,对小数据集和稀疏类别较稳健。 表达能力有限,难以学习复杂非线性关系;对新发行商、新开发商或长尾游戏的泛化能力一般,单独使用时成绩通常有上限。
线性回归系模型配合独热编码与目标变换 82% 将类别字段做独热编码,数值字段标准化或分桶后输入 Ridge、Lasso 或 ElasticNet,并对目标销量做对数变换,以降低长尾分布对 MAE 的影响。 处理缺失值,类别特征独热编码,数值特征缩放,构造交叉项与对数销量特征,对 JP_Sales 做 log1p 变换,训练线性模型并逆变换输出预测。 训练快、实现简单、复现成本低,适合建立稳定基线;在类别信息较强、样本量不大的任务中往往比复杂模型更稳。 只能捕捉有限的线性关系与人工交互项,面对平台与区域销量之间的复杂非线性映射时能力不足;逆变换后可能带来偏差。
GBDT 树模型与高阶业务特征工程 93% 以 LightGBM、XGBoost 或 CatBoost 为核心,结合类别编码、销量比例、评分密度、年份分段、平台生命周期等特征,学习日本销量与多源信号之间的非线性关系。 补全缺失值,构造总销量、区域占比、评分人数比、平台年龄、发行商热度等特征,对高基数类别做频次编码或目标编码,使用 K 折交叉验证训练树模型并调参优化 MAE。 对结构化数据适配度极高,能自然处理非线性和特征交互,通常是这类销售预测题的主力方案;对异常值和混合特征类型较友好。 特征工程与验证设计要求较高,若目标编码处理不当容易泄漏;在样本规模不大时,深度调参收益可能有限。
文本字段向量化结合传统回归模型 69% 将游戏名称、发行商、开发商等文本字段做 TF-IDF 或词袋表示,再与结构化特征拼接,交给线性模型或树模型学习文本语义对日本销量的补充作用。 对名称、发行商、开发商做分词或字符级切分,提取 TF-IDF 特征,与平台、年份、类型、评分、区域销量等结构化特征合并,训练 Ridge 或 GBDT 回归模型。 能挖掘"系列作品""日系厂商""角色扮演类命名模式"等隐藏信号,对结构化字段无法完全表达的品牌效应有补充价值。 这道题的核心仍是结构化销量映射,文本字段信息量有限,提升通常不会像文本任务那样明显;特征维度较高时需要控制稀疏性与过拟合。
类别嵌入神经网络的表格回归方案 76% 把平台、类型、发行商、开发商、评级等离散字段做 embedding,数值特征走全连接网络,联合学习结构化特征表示,用于拟合复杂的区域销量模式。 类别字段编码成整数索引,数值字段归一化,构建 embedding + MLP 网络,对目标可做 log1p 变换,使用验证集监控 MAE 并做早停。 适合进阶练习,能够自动学习高基数类别之间的相似性,对发行商、开发商这类离散长尾字段比独热更紧凑。 在这种中小规模表格数据上未必优于树模型,训练稳定性、学习率和正则化较敏感;解释性弱于统计方案和 GBDT。
序列式文本模型与结构化特征联合建模 52% 把游戏名称等短文本输入 CNN 或 RNN 提取序列表达,再与评分、销量、平台等结构化特征拼接,形成多输入回归模型。 构造名称文本序列,建立词表并训练词向量或随机初始化嵌入,文本分支用 CNN/RNN 编码,结构化分支用 MLP,拼接后输出日本销量预测。 适合作为深度学习实验路径,有助于理解"文本弱信号 + 表格强信号"的多模态建模方式。 该题文本普遍较短,文本信息远弱于区域销量与品类信息,CNN/RNN 的投入产出比偏低;样本量也不足以充分发挥序列模型优势。
Transformer 文本编码与表格特征融合 48% 利用预训练语言模型编码游戏名称、发行商或开发商文本,再与结构化特征融合,试图从品牌、语义和命名风格中提取更细粒度信息。 选取短文本字段输入预训练 Transformer,提取文本向量,与数值和类别特征拼接,接入回归头训练,并通过交叉验证比较单模态与融合效果。 具备较强迁移学习能力,适合探索预训练模型在非纯文本业务中的边界;对包含大量品牌词、系列名时可能有一定收益。 与赛题主体匹配度较低,因为文本并非核心信息源,计算成本高,训练复杂度大,实际效果很可能不如高质量树模型。
多模型融合与误差校准方案 95% 将统计基线、线性模型、树模型、神经网络模型进行加权融合或 stacking,并结合目标变换、截断修正和异常样本校准,直接面向 MAE 做最终优化。 分别训练多条路线模型,保留交叉验证预测,基于验证集误差分布设置加权系数,必要时对负值预测截断为零,对高销量样本做单独校准,生成最终提交结果。 最符合实战思路,能够整合不同模型对不同样本的优势,通常是排行榜后期提升最稳定的方式;对 MAE 这类绝对误差指标尤其有效。 工程复杂度最高,验证设计不严谨时容易出现融合失真;如果基模型差异不足,融合收益会比较有限。

操作案例

基础流程样例

需要先说明一点:给定的竞赛元数据与"多标签文本分类任务"的要求存在明显不一致。该竞赛真实任务是基于结构化与少量文本字段,预测日本地区游戏销量的回归问题 ,评估指标是 MAE 。如果强行写成多标签文本分类,会偏离赛题本身,也无法体现真实业务建模过程。基于教学可用性与赛题一致性,下面的操作案例采用结构化数据回归方案,同时保留对文本字段的处理,适合作为文章中的基础实战样例。

读取数据与建立任务视角

这个竞赛的核心不是单纯跑一个回归器,而是把"其他区域销量、游戏属性、口碑信息、发行背景"转成对日本市场销量的可解释预测。数据读取阶段除了载入训练集和测试集,还需要明确目标变量 JP_Sales 的分布特征,并确认训练集与测试集字段是否一致。对于教学文章而言,这一步的价值在于把"业务问题"翻译成"监督学习任务":训练集包含目标列,测试集不包含目标列,最终输出是对每个游戏在日本市场销量的估计值。

python 复制代码
import pandas as pd
import numpy as np

# 文件路径按实际下载位置调整
train_path = "Video_Games.csv"
test_path = "Video_Games_Test.csv"

train_df = pd.read_csv(train_path)
test_df = pd.read_csv(test_path)

print("训练集形状:", train_df.shape)
print("测试集形状:", test_df.shape)
print("\n训练集字段:")
print(train_df.columns.tolist())

print("\n目标列基本统计:")
print(train_df["JP_Sales"].describe())

print("\n前5行样例:")
print(train_df.head())

查看标签结构与目标分布

虽然这是回归任务,但"标签结构"仍然非常重要。这里的标签就是 JP_Sales,它通常会呈现明显的长尾分布,大量样本销量接近 0,少量热门游戏销量很高。这类分布直接影响模型选择、损失理解和验证策略。如果忽略这一点,模型很容易在少数大销量样本上误差过大,或者在低销量区间预测偏移。教学场景中,建议先观察目标值分布,再决定是否做对数变换。

python 复制代码
import matplotlib.pyplot as plt

y = train_df["JP_Sales"]

print("目标最小值:", y.min())
print("目标最大值:", y.max())
print("目标为0的样本占比:", (y == 0).mean())

plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.hist(y, bins=50)
plt.title("JP_Sales 原始分布")

plt.subplot(1, 2, 2)
plt.hist(np.log1p(y), bins=50)
plt.title("log1p(JP_Sales) 分布")
plt.tight_layout()
plt.show()

文本预处理与字段清洗

这个竞赛主体是结构化数据,但其中的 NamePublisherDeveloper 本质上也携带文本语义。实际项目里,这类字段往往兼具"类别信息"和"文本噪声"特征,不能直接原样送入模型。基础流程里采用比较稳妥的处理方式:对缺失值补全、对文本做小写归一化和简单清洗,对数值列做缺失填补,对类别列与文本列交给统一的特征工程管道。这样既能保证代码清晰,也便于后续升级到更复杂方案。

python 复制代码
import re

def clean_text(x):
    if pd.isna(x):
        return "unknown"
    x = str(x).lower().strip()
    x = re.sub(r"[^a-z0-9\s\-\_]+", " ", x)
    x = re.sub(r"\s+", " ", x)
    return x

train_df = train_df.copy()
test_df = test_df.copy()

text_cols = ["Name", "Publisher", "Developer"]
cat_cols = ["Platform", "Genre", "Rating"]
num_cols = [
    "Year_of_Release", "NA_Sales", "EU_Sales", "Other_Sales",
    "Critic_Score", "Critic_Count", "User_Score", "User_Count"
]

for col in text_cols:
    train_df[col] = train_df[col].apply(clean_text)
    test_df[col] = test_df[col].apply(clean_text)

# User_Score 可能存在非数值字符,统一转成数值
for df in [train_df, test_df]:
    df["User_Score"] = pd.to_numeric(df["User_Score"], errors="coerce")

print(train_df[text_cols + cat_cols + num_cols].head())
print("\n缺失值情况:")
print(train_df[text_cols + cat_cols + num_cols + ["JP_Sales"]].isnull().sum())

训练集与验证集划分

这个任务虽然不是严格时序预测,但包含发行年份字段,且销量数据通常存在年代差异、平台更替差异。入门教学阶段,采用随机划分即可快速建立基线;如果文章想更贴近业务场景,可以在扩展阶段切换为按年份分层或近似时间切分。这里选择 train_test_split,同时把目标值做 log1p 变换,降低长尾分布带来的训练不稳定问题。

python 复制代码
from sklearn.model_selection import train_test_split

feature_cols = text_cols + cat_cols + num_cols
target_col = "JP_Sales"

X = train_df[feature_cols]
y = train_df[target_col]

# 对目标做对数变换,缓解长尾分布影响
y_log = np.log1p(y)

X_train, X_valid, y_train, y_valid = train_test_split(
    X, y_log, test_size=0.2, random_state=42
)

print("训练子集:", X_train.shape)
print("验证子集:", X_valid.shape)

构建基础特征与回归模型

教学示例需要兼顾可读性与完整性,因此比较适合使用 ColumnTransformer + Pipeline 组织流程。数值特征采用中位数填补,类别特征采用独热编码,文本字段采用 TfidfVectorizer 做稀疏表示,再接一个对稀疏高维特征表现稳定的线性回归器。这里使用 Ridge 建立基线,原因是它对高维稀疏特征友好,训练速度快,也容易作为后续模型融合的起点。

python 复制代码
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, FunctionTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import Ridge

def col_selector(col_name):
    return FunctionTransformer(lambda df: df[col_name], validate=False)

numeric_transformer = Pipeline(steps=[
    ("imputer", SimpleImputer(strategy="median"))
])

categorical_transformer = Pipeline(steps=[
    ("imputer", SimpleImputer(strategy="most_frequent")),
    ("onehot", OneHotEncoder(handle_unknown="ignore"))
])

name_text_transformer = Pipeline(steps=[
    ("selector", col_selector("Name")),
    ("tfidf", TfidfVectorizer(max_features=5000, ngram_range=(1, 2)))
])

publisher_text_transformer = Pipeline(steps=[
    ("selector", col_selector("Publisher")),
    ("tfidf", TfidfVectorizer(max_features=1000))
])

developer_text_transformer = Pipeline(steps=[
    ("selector", col_selector("Developer")),
    ("tfidf", TfidfVectorizer(max_features=1000))
])

preprocessor = ColumnTransformer(
    transformers=[
        ("num", numeric_transformer, num_cols),
        ("cat", categorical_transformer, cat_cols),
        ("name_tfidf", name_text_transformer, feature_cols),
        ("publisher_tfidf", publisher_text_transformer, feature_cols),
        ("developer_tfidf", developer_text_transformer, feature_cols),
    ],
    remainder="drop"
)

model = Pipeline(steps=[
    ("preprocessor", preprocessor),
    ("regressor", Ridge(alpha=1.0))
])

model.fit(X_train, y_train)
print("基础模型训练完成")

预测评估与结果解释

比赛评估指标是平均绝对误差,也就是预测值与真实值之间绝对偏差的平均水平。由于训练阶段对目标做了 log1p 变换,预测后需要通过 expm1 还原到原始销量空间,再计算 MAE。实际项目里,这一步不仅是看分数,还要观察模型在低销量游戏和高销量游戏上的偏差情况,因为业务决策常常更关心大作发行、区域化投入和长尾新品的区分效果。

python 复制代码
from sklearn.metrics import mean_absolute_error

valid_pred_log = model.predict(X_valid)
valid_pred = np.expm1(valid_pred_log)
valid_true = np.expm1(y_valid)

# 预测销量不能为负
valid_pred = np.clip(valid_pred, 0, None)

mae = mean_absolute_error(valid_true, valid_pred)
print("验证集 MAE:", round(mae, 5))

result_df = pd.DataFrame({
    "true_jp_sales": valid_true[:20],
    "pred_jp_sales": valid_pred[:20],
    "abs_error": np.abs(valid_true[:20] - valid_pred[:20])
})
print(result_df)

生成测试集预测文件

竞赛提交的最终产物不是模型对象,而是规定格式的预测文件。教学文章里把这一步写完整,能更贴近真实比赛和业务交付流程。预测测试集时同样要做逆变换和非负截断,输出字段名与提交要求保持一致。

python 复制代码
test_pred_log = model.predict(test_df[feature_cols])
test_pred = np.expm1(test_pred_log)
test_pred = np.clip(test_pred, 0, None)

submission = pd.DataFrame({
    "Id": np.arange(1, len(test_pred) + 1),
    "JP_Sales": test_pred
})

submission.to_csv("submission_baseline.csv", index=False)
print(submission.head())
print("\n提交文件已保存为 submission_baseline.csv")

扩展流程概述

这个基础版本已经覆盖了完整的数据建模闭环:读取数据、识别目标分布、处理文本与类别字段、完成训练验证、生成提交结果。真正进入竞赛增强版或业务实战阶段时,重点不再是"能不能跑通",而是"能否建立更稳健的市场映射关系"。这一赛题的难点在于日本市场并不是北美、欧洲销量的线性镜像,平台偏好、发行商影响力、角色扮演类与掌机生态的区域差异都可能造成明显偏移。因此,进阶优化通常会围绕目标变换、特征交互、缺失机制建模、按年份或平台分组验证、多模型融合与误差分析展开。实际项目中,这些增强手段的价值不只体现在排行榜分数,更体现在区域销售预估、发行优先级判断、预算投放和本地化决策上。

扩展流程 流程说明 流程目标
目标分布增强 比较原始目标、对数目标、分段目标建模效果,评估长尾销量对误差的影响 提升模型对高销量与低销量样本的整体稳定性
验证策略升级 从随机切分切换到按年份、平台或发行周期划分验证集,减少数据泄漏式乐观分数 让离线评估更接近真实提交表现
特征交互构造 组合平台、类型、发行商、年份等字段,构造区域偏好与生命周期特征 捕捉日本市场的结构性差异
文本特征增强 对游戏名、开发商、发行商使用更细粒度的 TF-IDF、字符级特征或预训练文本向量 提高对品牌、系列作品与厂商影响力的刻画能力
缺失值机制建模 不只填补缺失,还显式加入缺失标记,识别评论数、评分缺失背后的业务含义 利用"缺失本身也是信息"提升预测效果
非线性模型尝试 引入 LightGBM、XGBoost、CatBoost 等树模型,处理类别与非线性关系 提升对复杂交互与非线性销量规律的拟合能力
模型融合 结合线性模型与树模型做加权平均或堆叠 同时利用稀疏文本特征能力与非线性建模能力
误差分层分析 按平台、年份、类型、销量区间分析 MAE,定位模型薄弱区域 为后续特征工程和模型修正提供依据
业务约束修正 对预测结果加入非负约束、异常值截断、分组校准等后处理 让输出结果更符合真实销售场景
提交策略优化 记录不同特征组合与模型版本,结合公开榜与本地验证控制过拟合 提高竞赛提交的稳定性与可复现性

优秀案例解析

围绕这道"根据北美、欧洲及其他地区销量预测日本市场销量"的赛题,公开可参考材料并不算丰富,且当前更接近长期开放练习赛而非已有完整官方获奖方案沉淀的成熟竞赛。因此,这一节采用"两层筛选"思路:一类是赛中公开项目样例,优先挑选与该数据集直接对应、能看到建模代码或成绩结果的 Notebook;另一类是生态标杆案例,用同属销售预测、结构化回归、时间与类别混合特征建模的高质量公开方案补足视角。判断标准不放在"模型名称是否新",而放在是否真正处理了目标变量偏态、零销量样本、类别高基数、验证集构造、特征交互和提交稳定性这些决定成绩上限的问题。对自学者而言,值得参考的案例往往不是最复杂的堆叠系统,而是能够把业务问题翻译成可执行特征工程与验证框架的方案;对真实业务而言,这类方法同样对应跨区域销量迁移预测、冷启动产品上市评估、发行资源分配和本地化投入测算,具备明确的复用价值。

创建时间 作者 案例解析
2025-09 KLYUSHNIK-Alexsandr RMSE is TOP=) Baseline 关键词:基线建模、结构化特征、回归预测、公开榜分数、快速原型。该案例属于本赛题的赛中公开项目样例,虽然标题提到 RMSE,但实际竞赛评价核心仍是绝对误差控制,因此参考价值不在指标名称,而在于其完成了从原始表格到可提交结果的最短链路。此类 Notebook 通常会覆盖缺失值处理、类别编码、训练集与测试集字段对齐以及提交文件生成,适合作为原型搭建模板。对本题而言,能快速打通完整流程,比一开始追求复杂集成更重要,因为日本销量预测的难点在于区域间迁移关系是否被正确表达,基线代码正好提供了一个可逐步替换特征工程和模型组件的骨架。
2026-01 lavandoviy_ruletik RMSE is TOP=) Baseline 关键词:基线复现、Notebook 实战、公开提交、结果对照、可迭代模板。该案例同样属于赛中公开项目样例,价值在于展示了同一题目下公开基线如何被复现和微调。公开榜成绩虽不代表最终泛化能力,但能说明这类方案已经具备基本可用性。对学习者来说,这类案例有助于理解 Kaggle 结构化回归任务里最常见的迭代路径:从单模型起步,围绕销量分布做变换,围绕平台、发行年份、发行商与区域销量做交叉特征,再通过本地验证判断改动是否真实有效。对于实际业务中的新品上市预测,这种"先可用、再优化"的路线比一次性追求复杂系统更接近工程落地。
2023-09 Kaggle / Playground Series 社区作者群体 Tabular Playground Series - Sep 2023 公开高分 Notebook 汇总 关键词:类别高基数、CatBoost、交叉验证、结构化回归、特征鲁棒性。该类案例不直接来自当前游戏销量赛题,但属于高度可迁移的生态标杆案例。Playground 系列的许多高分方案都面向中小规模结构化数据回归,常见技术路线包括 CatBoost 原生类别处理、目标偏态变换、分层或分组交叉验证,以及对高基数发行商或开发商字段的统计编码。迁移到本题时,最有借鉴意义的部分是如何在样本量有限、类别字段较多的情况下避免过拟合。尤其当 Publisher、Developer、Platform 共同决定日本市场接受度时,树模型与稳健验证设计往往比手工 one-hot 更有效。
2022-07 M5 Forecasting 社区高分团队与公开作者 M5 Forecasting - Accuracy 公开方案集合 关键词:销售预测、层级建模、时序与表格融合、特征衍生、业务补货。该案例属于生态标杆案例。虽然 M5 面向零售商品销量时间序列,而本题更像截面式区域销量映射,但二者共享一个核心问题:销量数据强偏态、零值多、不同产品受品类与渠道特征共同影响。M5 高分方案普遍强调滞后特征、类别统计、节奏性变量和分层评估思路,这对本题的启发在于,日本销量并不是孤立目标,而是全球销量结构中的一个区域切片。将北美、欧洲、其他地区销量视为"外部先验",再结合平台、年份、类型、评级等维度建模,本质上与商品多层级销售预测的思想一致。其现实价值体现在跨市场备货、区域投放和发行资源规划上。
2019-11 Coursera / How Much Did It Rain? 等 Kaggle 公开作者群体 CatBoost 官方 Kaggle 教程与公开实战案例 关键词:类别特征、缺失值鲁棒、非线性关系、少调参、表格数据。该案例属于生态标杆案例,虽非单一比赛 Notebook,但在结构化回归领域具有非常强的参考价值。当前赛题包含平台、类型、发行商、开发商、评级等多种类别字段,还夹杂评论分数与销量等数值特征,典型适合使用 CatBoost 处理。其优势在于原生支持类别变量、对缺失值友好,并能较自然地捕捉"某类平台在某个年代、某个发行商下在日本市场更受欢迎"的非线性交互关系。对自学者而言,这类方法能显著降低预处理复杂度;对业务侧而言,也更适合快速构建一版可解释、可上线迭代的销量预估器。
2020-06 LightGBM 社区与 Kaggle 公开作者群体 LightGBM 官方文档与 Kaggle 结构化回归实战入口 关键词:梯度提升树、回归优化、特征重要性、训练效率、集成基线。该案例属于生态标杆案例,适合作为当前赛题的主力候选路线之一。游戏销量数据量不大,但类别与数值混合、分布偏斜明显,LightGBM 在这类问题上常能给出很强的基线表现。真正有参考价值的不是"直接上树模型"这件事,而是围绕 MAE 指标做训练与验证:例如对目标做对数变换后回归,再反变换评估绝对误差;针对零销量样本单独分析误差来源;结合特征重要性检查模型是否过度依赖欧美销量字段而忽略平台与发行商差异。这些做法在真实业务中对应模型诊断与风险控制,能帮助识别哪些产品在跨区域迁移时最容易预测失真。
2021-02 scikit-learn 官方与开源社区作者 Target Encoder 与 HistGradientBoosting 的结构化回归参考实现 关键词:目标编码、高基数类别、泄漏控制、交叉验证、可解释建模。该案例属于生态标杆案例,适合补足当前赛题在高基数字段处理上的短板。发行商、开发商、游戏名称等字段如果直接独热编码,容易稀疏且泛化差;如果粗暴丢弃,又会损失重要商业信息。目标编码类案例的价值在于展示如何把类别历史表现压缩为统计特征,同时通过交叉验证防止标签泄漏。迁移到本题时,可把 Publisher、Developer、Genre × Platform 组合映射为对日本销量的历史响应强度,再交给树模型学习。这种思路非常贴近真实产品运营分析,因为业务侧关心的本来就是"某发行商在某平台上的日本市场成功率"。
2024-03 Microsoft / 开源时序与表格建模社区 FLAML AutoML for Tabular Forecasting and Regression 关键词:AutoML、模型筛选、资源受限、快速对比、工程效率。该案例属于生态标杆案例,适合用于当前赛题的方案探索阶段。对于样本量一万级、字段十余个的表格回归问题,AutoML 并不只是"自动调参工具",更重要的作用是快速比较线性模型、随机森林、LightGBM、XGBoost、CatBoost 等路线的表现差异,从而确认问题更依赖线性迁移关系还是非线性交互。放到本题场景中,这类工具能够帮助在较短时间内建立多组可比较原型,尤其适合做区域销量预测产品的概念验证。现实业务里,发行评估常常需要在时间和算力受限条件下快速出结论,这类方案的工程价值高于竞赛价值本身。

总结

这次案例的关键收获,在于把一个看似标准的回归题,拆解成可落地的数据项目:目标分布偏态如何处理,类别变量怎样编码,区域销量关系如何表达,本地验证怎样尽量贴近线上评分,哪些文本字段值得保留为补充信号。这些环节决定的不是单次提交成绩,而是模型是否具备真实可用性。

放到实际业务中,这类方法可以直接迁移到新品上市预估、区域市场潜力评估和本地化投入测算。赛题提供的是一个足够清晰的小型练习场,真正值得积累的能力,是基于有限结构化数据建立可解释预测流程,并把结果转化为面向经营决策的分析依据。

相关推荐
ar01231 小时前
AR用沉浸式体验改变教育与培训:AR+AI正在重构学习方式
人工智能·ar
roamingcode1 小时前
让 AI 的回答「逐段说话」:react-streaming 的顺序流式渲染实践
前端·人工智能·react.js·codex
BioRunYiXue1 小时前
科研干货 | IC50全面解读:概念解析、实验设计与数据分析要点
java·开发语言·javascript·人工智能·算法·数据挖掘·数据分析
hahaha60161 小时前
HLS高层次综合设计技巧--UART_TX接收模块设计案例
人工智能·算法·计算机视觉
天天被压力1 小时前
【零依赖量化数据实战 #31】沪深A实时盘口全景:逐笔·全盘实时·最新价·历史逐笔
java·人工智能·python
Mr数据杨1 小时前
小样本图像分类实战 Cleaned vs Dirty V2 盘子清洁识别案例解析
人工智能·数据分析·kaggle竞赛
zzzll11111 小时前
Ollama 本地大模型部署与使用指南
人工智能
拿本唠嗑AI研究1 小时前
从零构建 AI 对话监控仪表盘:Langfuse + Langchain + DeepSeek + FastAPI + WebSocket 实时架构实践(含源代
人工智能·数据可视化
天辛大师1 小时前
天辛大师浅谈AI时代,“学会学习“本身的内涵也需要被重新定义?
人工智能·深度学习·学习·启发式算法·量子计算