房价预测一直是结构化数据建模中最有代表性的回归任务之一。这场 Kaggle 竞赛围绕公寓价格估计展开,目标清晰,评价指标采用平均绝对误差,既适合训练表格建模基本功,也非常接近真实业务里的自动估价场景。
文章内容围绕赛题理解、数据判断、特征工程、回归建模和案例参考展开,重点不放在比赛流程本身,而放在如何把公开竞赛题拆解成一套可复用的价格预测方案。对于正在补齐数据分析与机器学习实战能力的人群,这类题目比抽象算法讨论更能建立工程感。
文章目录
赛题概述
本案例地址 Предсказание цен квартир。
这是一道典型的结构化回归建模题,核心任务是依据房屋相关属性预测公寓价格,贴近房地产估值、交易定价和资产评估等真实业务。赛题虽然采用 Kaggle 竞赛形式,但本质上对应的是表格数据项目中最常见的一类问题:在存在缺失、异常、尺度差异和特征关联的条件下,建立稳定的价格预测模型。训练过程能够系统覆盖数据理解、特征工程、回归模型选择、误差分析与结果校准,也适合作为从数据分析走向机器学习建模的实战入口。
| 模块名称 | 内容简介 | 所需技能 | 数据类型 | 应用场景 |
|---|---|---|---|---|
| 赛题背景 | 题目聚焦住宅价格预测,属于以结构化数据为核心的回归问题,强调从房屋属性、区位信息及交易相关特征中提取定价信号。这类任务在真实场景中常伴随样本分布不均、异常高价或低价房源、字段缺失和非线性关系,考验的不只是建模能力,还包括对业务定价逻辑的理解。 | 问题抽象、业务映射、探索性分析、异常识别、特征关系判断、回归建模思维 | 表格型房产数据、数值特征、类别特征、可能存在的缺失值与派生统计特征 | 房地产估值、二手房挂牌定价、金融抵押评估、区域房价分析、资产管理 |
| 竞赛目标 | 参赛结果并非完成一个展示型原型,而是交付可用于未知样本价格预测的回归模型与提交结果文件。本质上是通过训练集学习房价形成规律,并在测试集上给出尽可能贴近真实成交或评估价格的预测值,体现标准化机器学习项目从数据处理到模型输出的完整流程。 | 特征工程、回归算法选择、交叉验证设计、模型调参与集成、预测结果校准、实验管理 | 训练集、测试集、标签价格数据、模型输出结果、自建验证切分数据 | 自动估价系统、定价辅助引擎、房产交易平台预测模块、评估报告自动化 |
| 评价指标 | 赛题采用平均绝对误差作为评分依据,关注预测价格与真实价格之间的绝对偏差平均水平。这种评估方式比平方误差更直观,适合衡量定价任务中的实际偏离程度,也意味着模型不仅要追求整体拟合能力,还要尽量减少极端偏差对业务判断造成的影响。 | 误差分析、验证方案设计、模型稳健性优化、偏差控制、结果解释 | 真实价格标签、预测值、验证集误差分布、残差数据 | 定价准确性评估、模型上线前验收、业务风险控制、预测效果对比 |
| 业务意义 | 这类赛题与企业中的智能定价问题高度一致,价值不在排行榜本身,而在于把零散房源属性转化为可计算的估值能力。相关方法可迁移到租金预测、汽车估价、商品定价和资产评估等多个方向,是结构化数据建模中非常典型且具备直接业务转化空间的一类项目。 | 项目落地思维、建模方案迁移、效果验证、业务解释、工程化输出 | 历史交易数据、业务规则、估值特征库、预测服务输入输出数据 | 智能估价产品、交易决策支持、风控定价、行业数据产品建设 |
数据详解
这场竞赛的数据结构非常典型,核心信息集中在"任务定义---评估方式---提交约束---数据入口"这条主线上,真正影响建模决策的字段并不多。题目名称与简介已经明确任务是公寓价格预测 ,属于标准的表格回归问题;标签中只出现了 MAE,说明竞赛关注的是预测值与真实房价之间的绝对误差,模型优化方向会偏向稳健拟合,而不是单纯追求对极端高价样本的贴合。结构化数据里还混入了不少平台管理属性,例如论坛 ID、组织 ID、是否启用某些平台功能、排行榜控制字段等,这类内容对理解业务问题和建模方案帮助有限,阅读时应重点关注题目定义、评估指标、时间安排、每日提交限制、组队上限、数据集入口以及是否存在额外的数据说明。由于当前元数据中缺少公开的数据字段清单、文件大小、目标列名称和完整规则文本,实际分析时仍需进入数据页或附件脚本核对训练集与测试集的具体列结构,这也是表格建模项目里经常遇到的情况:平台页给出任务框架,真正决定特征工程深度的仍然是原始表本身。
| 字段名称 | 类型/范围 | 描述信息 |
|---|---|---|
比赛标题 competition_title |
字符串 | 标题为俄文"Предсказание цен квартир",可理解为"公寓价格预测"。这直接定义了业务目标,说明任务不是分类或排序,而是面向房产估值的数值预测问题。 |
比赛副标题 competition_subtitle |
字符串/空值 | 当前为空,说明平台没有补充更细的场景限定。遇到这类情况,题目边界主要依赖标题、简介和数据字段本身来判断。 |
比赛简介 overview |
字符串 | 简介内容为"开发一个用于预测公寓价格的模型"。这类描述虽然简短,但已经足以确认任务形态是监督学习中的回归建模,目标变量是房价或总价。 |
标签信息 tags |
JSON 数组 | 当前只有一个标签 mae,表明竞赛强调平均绝对误差。标签数量少,意味着平台没有进一步标明细分行业或方法方向,建模路线需要更多依赖数据分布与特征类型判断。 |
一级/二级分类 category_level_1 / category_level_2 |
字符串 | 被归类为"表格建模 / 通用结构化",说明数据主体大概率是房屋属性、位置、面积、楼层、房龄等结构化字段,不是图像、文本或时序信号。对学习者而言,这意味着重点应放在缺失值处理、类别编码、异常值识别和树模型调参。 |
评估指标缩写 evaluation_algorithm_abbreviation |
字符串 | 指标为 MAE。这是排行榜分数的直接来源,所有验证方案、交叉验证和模型比较都应围绕这一指标展开。 |
评估指标名称 evaluation_algorithm_name |
字符串 | 完整名称为 Mean Absolute Error,即平均绝对误差。该指标对异常值的敏感度低于均方误差,更贴近许多定价场景中"平均偏差金额"的业务理解。 |
比赛开放时间 enabled_date |
时间 | 竞赛开放于 2021-04-20。开放时间本身不会影响建模,但能反映题目所处的数据竞赛周期以及参考社区方案的活跃阶段。 |
报名截止时间 deadline_date |
时间 | 当前截止时间为 2031-06-04。时间跨度很长,说明这更像长期开放的练习型竞赛,适合作为回归建模、房价预测和特征工程练手项目。 |
组队合并截止时间 team_merger_deadline_date |
时间 | 与报名截止时间一致,表示队伍调整在较长周期内保持开放。对个人学习者影响不大,但对协作型参赛安排有参考价值。 |
每日提交上限 max_daily_submissions |
整数 | 每天最多提交 20 次。这个限制会影响实验节奏,要求本地验证更扎实,避免把排行榜当作主要调参手段。 |
最大组队人数 max_team_size |
整数 | 上限为 20 人,说明平台允许较大规模协作。对于技术博客读者,真正重要的是它提示该题并非只面向个人试玩,也适合团队分工完成数据清洗、特征工程和模型融合。 |
奖励信息 reward_type / reward_quantity / num_prizes |
字符串/空值 | 奖金与奖项字段均为空,基本可以判断这不是奖金驱动型竞赛,更偏向练习、课程项目或社区性质任务。对学习路径的意义大于竞赛收益。 |
参赛队伍数 total_teams |
整数 | 共有 224 支队伍参与。这个规模不算特别大,但足以说明题目具有一定讨论价值,通常能找到可借鉴的公开代码与基础方案。 |
数据集地址 dataset_url |
字符串(URL) | 数据下载入口是最关键的实操字段之一,原始训练集、测试集和提交样例通常都在该页面获得。真正的字段清单、文件名和列说明需要进入此链接确认。 |
数据集说明 dataset_description |
Markdown 长文本/空值 | 当前为空,说明平台元数据没有同步更详细的数据解释。实际建模前需要直接查看数据文件、附件脚本或 Notebook 中的字段分析。 |
| 数据文件说明 | 结构化表文件(未在元数据中展开) | 当前结构化信息中没有给出训练集、测试集、提交样例等文件名,也没有列级说明。这意味着数据理解阶段必须依赖下载后的文件结构,而不能只靠比赛页摘要。 |
数据规模 total_compressed_bytes / total_uncompressed_bytes |
整数/空值 | 压缩后和解压后的数据大小都缺失,无法仅从元数据判断是否适合在本地轻量运行。通常房价表格竞赛规模不会太大,但仍应以实际下载结果为准。 |
| 目标标签字段 | 字段名未公开 | 题目已经明确目标是房价预测,但元数据中没有给出目标列的正式字段名。建模时需要在训练集里确认哪一列是价格标签,并检查其单位、分布和异常值情况。 |
| 提交规则概况 | 文本摘要 | 完整规则文本为空,仅能确认存在每日提交限制和常规排行榜机制,缺少对外部数据、手工标注、模型附件等更细约束的描述。正式参赛前仍应到比赛页面核对实时规则。 |
| 平台元数据(合并概括) | 多种类型 | 论坛 ID、组织 ID、是否启用 Notebook、排行榜开放比例、模型附件开关等字段主要服务于平台运行和权限控制,对任务理解和建模价值较低,阅读时可以降级处理,避免被无关信息分散注意力。 |
解题思路
这类赛题本质上是典型的结构化回归问题,目标是根据房屋属性预测公寓价格,天然适合并行尝试多条建模路线。原因在于,房价预测通常同时包含明显的统计规律、非线性交互关系、类别变量影响、异常值扰动,以及少量难以直接人工表达的复杂模式。在线性假设较强、数据规模有限、特征质量参差不齐的情况下,简单统计与线性回归能够快速建立业务基线,帮助判断字段有效性与价格分布特征;当特征之间存在更复杂的组合关系时,树模型和集成方法往往更容易取得稳定成绩;若原始字段较多、存在高基数类别变量,或希望从更弱的人工特征中自动学习表示,深度学习路线才具备进一步探索的意义。由于评价指标采用平均绝对误差,模型不只要拟合整体趋势,还要尽量控制大样本区间内的绝对偏差,因此不同方法的关键差异,往往体现在对异常价格样本、长尾分布、类别编码方式以及特征交叉的处理能力上。对于学习路径而言,这道题很适合从"可解释的基线"逐步推进到"非线性集成"和"融合优化",既能训练结构化数据分析能力,也能建立更接近真实业务场景的建模习惯。
| 方法标题 | 案例适配度 | 方法说明 | 操作流程 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 统计分析 + 规则修正 + 线性回归基线 | 72% | 以房屋面积、房间数、楼层、区域等核心字段构建价格基线,通过分组统计、异常值截断、单位面积价格规则和对数变换建立可解释的回归方案,适合作为开局验证方向。 | 分析价格分布与缺失情况;构造单价、楼层相对位置、房龄等规则特征;处理异常值与偏态分布;对类别变量做基础编码;训练线性回归或岭回归并交叉验证。 | 建模门槛低,解释性强,便于快速发现无效字段、异常样本和业务规律;对初学者理解结构化回归任务非常友好。 | 对复杂非线性交互刻画不足,遇到区域与户型组合效应时容易欠拟合;若类别变量较多,效果通常明显弱于梯度提升树。 |
| 类别编码 + 梯度提升树回归 | 92% | 围绕结构化表格数据的主流路线,利用目标编码、频次编码或序数编码处理类别字段,再用 LightGBM、XGBoost、CatBoost 等提升树模型学习非线性关系,是这类房价赛题中最具实战价值的方案。 | 完成缺失值填补与异常值识别;对类别字段进行合适编码,保留数值字段原始尺度;构造面积单价、区域聚合统计、楼层组合特征;使用交叉验证训练梯度提升树;依据验证集 MAE 调整深度、叶子数和学习率。 | 对表格数据适配性极高,能够自然处理非线性与特征交互;在 MAE 指标下通常具备稳定表现;训练效率与效果平衡较好。 | 对特征泄漏较敏感,类别编码若处理不当容易造成验证偏高;参数较多,需要较严格的交叉验证设计。 |
| CatBoost 原生类别特征建模 | 95% | 如果数据中包含较多区域、街道、建筑类型等离散字段,CatBoost 能直接处理类别变量并减少手工编码工作,常常是房价预测中最稳妥的强基线之一。 | 区分类别字段与数值字段;完成基础清洗和异常修正;保留类别原始取值输入 CatBoost;结合交叉验证训练回归模型;针对迭代轮数、树深、正则项与学习率进行调参。 | 对高基数类别变量非常友好,编码流程更简洁;通常比手工编码更稳,尤其适合中小规模结构化数据;业务落地时复现成本较低。 | 对纯数值型任务未必始终优于 LightGBM;训练速度可能略慢;若原始字段质量差,模型优势会被数据噪声抵消。 |
| 聚合统计特征 + 二阶段回归 | 88% | 将房价预测拆解为"区域价格水平 + 个体偏离量"两部分,先通过区域、户型、楼层段等分组统计学习宏观价格水平,再用第二阶段模型拟合剩余误差,适合存在明显地段效应的房产数据。 | 按区域、房型、面积段构建均价和中位数等聚合特征;用这些特征建立一级预测;计算残差;再以树模型或线性模型拟合残差;合并两阶段结果并验证 MAE。 | 非常贴近真实房产估值逻辑,能够显式利用"地段决定大盘、个体决定偏差"的业务结构;对解释和汇报都较友好。 | 特征工程要求更高,分组过细容易造成稀疏和过拟合;若区域字段信息不足,二阶段设计带来的收益有限。 |
| 自动编码器/MLP 表格深度学习 | 58% | 将清洗后的数值与嵌入后的类别变量输入多层感知机,或先用自动编码器学习压缩表示,再做价格回归,适合用作深度学习入门实验,但通常不是此类赛题的首选主力方案。 | 完成标准化、缺失填补和类别索引化;为高基数类别构建嵌入层;拼接数值与嵌入向量输入 MLP;以 MAE 或平滑 L1 损失训练;通过早停与正则控制过拟合。 | 有助于理解结构化数据深度学习流程;当字段很多、类别组合复杂时,可能学到部分手工特征难以覆盖的模式。 | 在常规表格任务上通常不如提升树稳定;对数据量、训练技巧和超参数更敏感;若样本规模有限,容易过拟合。 |
| 宽表与深度特征结合的 Wide & Deep 路线 | 63% | 将人工构造的规则特征放入"宽"侧,将类别嵌入与连续变量表示放入"深"侧,同时学习线性记忆能力与非线性泛化能力,适合作为从传统特征工程过渡到深度建模的进阶方案。 | 构建单价、面积段、区域交叉等规则特征作为宽侧输入;将类别字段嵌入化、数值字段标准化后送入深侧网络;联合训练回归目标;以验证集 MAE 评估并调整结构。 | 兼顾业务规则与深度表示学习,适合练习"人工特征 + 自动学习特征"的混合建模思想;在特征交叉较多时有一定潜力。 | 工程复杂度高于树模型,收益未必稳定;如果特征规模不大,模型优势难以充分体现;调参成本偏高。 |
| 多模型融合回归 | 96% | 将线性模型、CatBoost、LightGBM、XGBoost 等不同偏好的模型进行加权融合或堆叠,利用模型间误差互补来降低 MAE,是排行榜提升最常见也最有效的策略之一。 | 分别训练多种异构模型;通过交叉验证收集各模型的折外预测;分析误差相关性;采用简单加权平均或二层回归器进行融合;在本地验证集上反复检验 MAE 变化。 | 往往能比单模型更稳,尤其适合这类受区域、户型、异常值共同影响的任务;能够兼顾线性规律与非线性关系。 | 训练和验证流程更复杂,若交叉验证设计不规范,融合容易产生虚假提升;解释性弱于单一模型。 |
| 对数目标变换 + 分层建模 + 融合优化 | 90% | 针对房价分布常见的右偏和长尾问题,对目标值做对数变换,并按区域层级、价格区间或房型做分层建模,再进行结果融合,重点改善高价房与低价房同时存在时的绝对误差控制。 | 检查价格分布并进行对数变换;按区域或价格段划分子样本;为各层训练更有针对性的回归模型;将预测结果还原到原价格空间;比较不同分层策略下的 MAE 并融合输出。 | 很贴合真实房价数据的长尾特征,常能显著缓解少数高价样本对整体训练的扰动;在 MAE 指标下有较强实战意义。 | 分层策略设计不当会带来样本切碎问题;目标变换后的优化目标与原始价格空间存在一定偏移,需要认真验证还原后的效果。 |
操作案例
基础流程样例
任务理解与数据读入
该竞赛在设定上应按照多标签文本分类问题处理,核心目标不是判断文本只属于哪一个类别,而是判断同一条文本是否同时命中多个标签。真实项目中,这类任务常见于工单自动归类、商品属性打标、内容风控标签识别和知识库主题标注。教学示例中的代码采用常见的训练集与测试集文件命名方式,重点展示一条可以直接迁移到实际业务中的基础流水线:从数据读取、标签识别、文本清洗,到构造多标签监督学习模型,并使用适合多标签场景的指标进行验证评估。
python
import re
import numpy as np
import pandas as pd
from pathlib import Path
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.pipeline import Pipeline
from sklearn.multiclass import OneVsRestClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
DATA_DIR = Path("./data")
train_path = DATA_DIR / "train.csv"
test_path = DATA_DIR / "test.csv"
sample_sub_path = DATA_DIR / "sample_submission.csv"
train_df = pd.read_csv(train_path)
test_df = pd.read_csv(test_path)
print("train shape:", train_df.shape)
print("test shape:", test_df.shape)
print(train_df.head())
查看标签结构
多标签任务最关键的准备工作不是直接训练模型,而是确认标签到底以什么形式存在。有些数据集会直接提供多个二值标签列,有些数据集会把标签写成一个字段中的分隔字符串。教学场景中需要先识别标签结构,再决定是否要做编码转换。下面的代码同时兼容两种常见模式:一种是训练集已经包含多个 0/1 标签列,另一种是存在单独的标签字段,需要转成多热编码矩阵。
python
# 假设常见文本列名候选
text_col_candidates = ["comment_text", "text", "content", "sentence", "review", "description"]
text_col = None
for c in text_col_candidates:
if c in train_df.columns:
text_col = c
break
if text_col is None:
# 若无法自动识别,则默认取第一个 object 类型字段作为文本列
object_cols = train_df.select_dtypes(include=["object"]).columns.tolist()
if not object_cols:
raise ValueError("未找到可用文本列,请检查数据文件。")
text_col = object_cols[0]
print("text column:", text_col)
# 识别标签结构
non_feature_cols = {text_col, "id"}
binary_label_cols = []
for col in train_df.columns:
if col in non_feature_cols:
continue
unique_vals = set(train_df[col].dropna().unique().tolist())
if unique_vals.issubset({0, 1}):
binary_label_cols.append(col)
if len(binary_label_cols) >= 2:
# 模式1:已有多标签二值列
label_cols = binary_label_cols
y = train_df[label_cols].copy()
print("检测到二值多标签列:", label_cols)
else:
# 模式2:标签存放在一个字段里,尝试自动识别
possible_target_cols = ["labels", "tags", "target", "label"]
target_col = None
for c in possible_target_cols:
if c in train_df.columns and c != text_col:
target_col = c
break
if target_col is None:
raise ValueError("未检测到多标签列或标签字段,请按实际数据修改标签解析逻辑。")
print("检测到标签字段:", target_col)
def parse_labels(x):
if pd.isna(x):
return []
x = str(x)
parts = re.split(r"[,\|; ]+", x.strip())
return [p for p in parts if p]
label_lists = train_df[target_col].apply(parse_labels)
mlb = MultiLabelBinarizer()
y_array = mlb.fit_transform(label_lists)
label_cols = mlb.classes_.tolist()
y = pd.DataFrame(y_array, columns=label_cols, index=train_df.index)
print("标签数量:", len(label_cols))
print("各标签正样本数:")
print(y.sum().sort_values(ascending=False))
文本预处理
多标签文本任务的基础版本不必引入复杂的深度学习预训练模型,先把文本列清洗干净,保证输入质量稳定,往往就能得到一个可解释、可复现的起点方案。这里采用轻量清洗策略,包括统一小写、去除链接、去除多余符号和空白字符。实际业务中,这一步的价值很高,因为脏数据、模板文本和噪声符号常常比模型结构更影响基线效果。
python
def clean_text(text):
text = "" if pd.isna(text) else str(text)
text = text.lower()
text = re.sub(r"http\S+|www\.\S+", " ", text) # 去链接
text = re.sub(r"<.*?>", " ", text) # 去HTML
text = re.sub(r"[^a-zA-Zа-яА-Я0-9\s]", " ", text) # 保留中英俄字母、数字和空格
text = re.sub(r"\s+", " ", text).strip()
return text
train_df["text_clean"] = train_df[text_col].apply(clean_text)
test_df["text_clean"] = test_df[text_col].apply(clean_text)
print(train_df[[text_col, "text_clean"]].head())
训练集与验证集划分
多标签问题的验证集划分要尽量保证评估结果稳定。严格意义上,多标签分层抽样需要额外工具库支持;在教学示例中,先采用常规随机划分建立可运行基线,再通过逐标签分布检查判断划分是否严重失衡。这种方式足够支撑入门版流程,也便于后续升级到更严格的多标签分层方案。
python
X = train_df["text_clean"]
Y = y.copy()
X_train, X_valid, y_train, y_valid = train_test_split(
X, Y,
test_size=0.2,
random_state=42
)
print("X_train:", X_train.shape)
print("X_valid:", X_valid.shape)
print("y_train:", y_train.shape)
print("y_valid:", y_valid.shape)
train_pos_rate = y_train.mean().sort_values(ascending=False)
valid_pos_rate = y_valid.mean().sort_values(ascending=False)
dist_df = pd.DataFrame({
"train_positive_rate": train_pos_rate,
"valid_positive_rate": valid_pos_rate
})
print(dist_df.head(10))
基础建模
对于结构清晰、特征可解释的教学场景,TF-IDF 加 One-vs-Rest 逻辑回归是多标签文本分类最常见的基线组合。TF-IDF 负责把文本转成稀疏向量,逻辑回归负责输出每个标签的独立概率,OneVsRestClassifier 则把多标签问题拆成多个二分类器并行训练。这种方案训练速度快、调试成本低,对中小规模文本数据尤其友好,也是很多业务系统冷启动阶段的标准起点。
python
model = Pipeline([
("tfidf", TfidfVectorizer(
max_features=30000,
ngram_range=(1, 2),
min_df=2,
max_df=0.95,
sublinear_tf=True
)),
("clf", OneVsRestClassifier(
LogisticRegression(
solver="liblinear",
max_iter=1000,
class_weight="balanced"
)
))
])
model.fit(X_train, y_train)
预测与评估
多标签任务的评估不能只看单一准确率,因为标签之间往往极度不均衡,很多标签可能非常稀有。更合理的做法是基于概率输出,按标签分别计算 ROC AUC,再观察宏平均结果。这样既能看到整体区分能力,也能定位哪些标签难学、哪些标签接近可用水平。代码中同时给出验证集概率预测、逐列 AUC 和平均 AUC,便于在文章中展示完整闭环。
python
# 多标签概率预测
# OneVsRestClassifier + LogisticRegression 支持 predict_proba
y_valid_proba = model.predict_proba(X_valid)
# 某些版本下返回 list,需要转成二维数组
if isinstance(y_valid_proba, list):
y_valid_proba = np.vstack([p[:, 1] for p in y_valid_proba]).T
print("预测概率矩阵形状:", y_valid_proba.shape)
auc_scores = {}
for i, col in enumerate(label_cols):
# 若验证集某标签全为同一类,ROC AUC 无法计算,跳过
if y_valid[col].nunique() < 2:
auc_scores[col] = np.nan
else:
auc_scores[col] = roc_auc_score(y_valid[col], y_valid_proba[:, i])
auc_series = pd.Series(auc_scores).sort_values(ascending=False)
macro_auc = auc_series.dropna().mean()
print("各标签 ROC AUC:")
print(auc_series)
print("宏平均 ROC AUC:", macro_auc)
生成测试集预测结果
比赛场景最终仍然需要把训练好的模型应用到测试集。对于多标签文本分类,通常提交的是每个标签的预测概率,而不是离散类别值。实际业务里,这些概率还可以进一步转成不同阈值下的自动打标决策,用于高精度自动化、人工复核分流或召回增强。
python
test_proba = model.predict_proba(test_df["text_clean"])
if isinstance(test_proba, list):
test_proba = np.vstack([p[:, 1] for p in test_proba]).T
submission = pd.DataFrame(test_proba, columns=label_cols)
if "id" in test_df.columns:
submission.insert(0, "id", test_df["id"])
print(submission.head())
# 如果存在官方示例提交文件,可按其列顺序对齐
if sample_sub_path.exists():
sample_sub = pd.read_csv(sample_sub_path)
sub_cols = sample_sub.columns.tolist()
missing_cols = [c for c in sub_cols if c not in submission.columns]
if missing_cols:
print("注意:提交文件缺少列:", missing_cols)
submission = submission.reindex(columns=sub_cols)
submission.to_csv("submission_baseline.csv", index=False)
print("已保存 submission_baseline.csv")
扩展流程概述
该基础样例的作用在于搭建一条可运行、可解释、可评估的多标签文本分类基线,适合作为教学文章中的起点,也适合作为真实项目的冷启动方案。进入竞赛增强版或业务实战版之后,重点不再只是把模型跑通,而是围绕标签不均衡、文本噪声、阈值策略、特征表达能力和验证稳定性逐步升级。传统方法层面可以从 TF-IDF 的词粒度、字符粒度和词组范围入手,提升对短文本、错别字和形态变化的适应能力;验证层面需要引入更稳健的多标签分层抽样与交叉验证,降低偶然划分带来的分数波动;建模层面可以从线性模型扩展到 LightGBM 的文本统计特征方案,或直接升级到 Transformer 类预训练语言模型;预测层面则需要将固定阈值改造成按标签单独寻优的阈值体系,使线上决策更贴合业务目标,而不是只追求排行榜指标。
| 扩展流程 | 流程说明 | 流程目标 |
|---|---|---|
| 多标签分层验证 | 引入更适合多标签任务的数据划分方法,减少训练集与验证集标签分布偏移带来的评估误差 | 提升离线评估稳定性 |
| 特征工程增强 | 在词级 TF-IDF 之外加入字符级 TF-IDF、文本长度、标点密度、数字占比等统计特征 | 提升对噪声文本和短文本的表达能力 |
| 模型集成 | 组合逻辑回归、线性 SVM、朴素贝叶斯或树模型,对不同标签建立更有针对性的学习器 | 提升整体泛化效果 |
| 标签阈值优化 | 不再统一使用固定阈值,而是按标签搜索最佳阈值,兼顾召回率与精确率 | 让预测结果更贴近真实业务使用场景 |
| 不均衡处理 | 针对稀有标签采用重采样、类别权重、难例挖掘等方法 | 改善长尾标签识别能力 |
| 交叉验证训练 | 使用 K 折方式生成更稳健的多标签概率预测,并对测试集结果做折间平均 | 降低单次划分偶然性 |
| 预训练语言模型 | 使用 BERT、RoBERTa 等模型进行多标签微调,学习更强的上下文语义表示 | 提升复杂语义场景下的分类效果 |
| 错误分析闭环 | 对低分标签、混淆样本、误判文本进行逐类复盘,反推清洗规则与特征方向 | 形成可持续迭代的建模流程 |
| 伪标签与半监督 | 利用高置信度测试集预测结果回流训练,扩大有效样本规模 | 在标注不足场景中进一步挖掘数据价值 |
| 模型部署与监控 | 将多标签概率输出接入线上服务,监控标签分布漂移、阈值失效和误报漏报变化 | 让竞赛方案具备真实生产落地能力 |
优秀案例解析
该赛题当前仍处于开放状态,公开信息中未见官方获奖方案或完整的赛后总结,因此"优秀案例解析"更适合分成两类来参考:一类是赛中已经公开的 Notebook 与代码样例,用来观察参赛者在房价回归任务中如何完成数据清洗、特征处理、建模与提交闭环;另一类是同方向的生态标杆案例,用来补足更成熟的方法论,包括结构化特征工程、集成学习、稳健验证和真实业务中的价格预测思路。筛选标准集中在三个维度:是否真正围绕"住宅价格预测"这一回归问题展开,是否具备可复现的技术路线,是否能迁移到房地产估价、资产定价、金融风控授信、区域市场分析等实际场景。由于该竞赛标签与评估方式都指向典型表格回归任务,真正值得借鉴的并不是单一模型名称,而是从异常值处理、类别变量编码、对数变换、交叉验证到误差分析这一整套可复用原型。
| 创建时间 | 作者 | 案例解析 |
|---|---|---|
| 2025-05 | Иван Соломенников | Solomennikov Flat Prices 关键词:房价回归、特征工程、Notebook 原型、提交闭环、公开赛中样例。该案例属于当前竞赛中较具代表性的公开项目,价值不在于展示复杂模型,而在于完整跑通了从训练数据读取、基础清洗、建模到生成提交文件的最小可用流程。对于类似公寓估价任务,这类 Notebook 往往会围绕面积、楼层、建成年份、地段等核心字段展开处理,适合作为入门级基线原型。现实业务中,估价系统上线前通常也需要这样一套可快速迭代的基线方案,用于验证数据质量、字段可用性和误差上限。 |
| 2023-04 | Alex Kalmy | PredPriceKV 关键词:回归建模、表格数据、特征筛选、验证思路、赛中公开样例。该案例从标题和竞赛关联信息看,直接面向住宅价格预测,适合作为本赛题的主题相关参考。此类项目通常会关注价格分布偏态、缺失值填补、类别字段编码以及基础回归器选择,对 MAE 指标也更敏感。参考价值在于,它体现了结构化比赛中常见的"轻量特征工程 + 树模型或集成模型"的路线,这种方式在真实估价、区域房源比价、二手房挂牌定价等场景中同样是高性价比解法。 |
| 2023-04 | Danila Akulov | Akulov_eda 关键词:探索性分析、异常值识别、价格分布、特征理解、赛中公开样例。该案例更偏向 EDA,但对房价预测任务非常关键。住宅价格问题通常存在明显长尾、录入异常、区域差异和极端样本,若在建模前缺少分布检查与异常值诊断,MAE 往往难以稳定下降。该案例的参考意义在于提醒读者,表格竞赛中高质量提交并不只是换模型,很多提升来自对字段含义和数据生成机制的理解。放到真实项目中,这一步对应业务口径校验与数据验真,是避免估值模型失真的核心环节。 |
| 2017-07 | Serigne / Kaggle 社区 | Stacked Regressions: Top 4% on LeaderBoard 关键词:堆叠集成、特征工程、对数变换、交叉验证、生态标杆案例。该案例并非本竞赛提交,但属于 Kaggle 房价预测方向最经典的结构化回归标杆之一。方案核心是通过系统化特征工程处理稀疏类别、高偏态数值和缺失值,再结合多种回归器做 stacking,以提升整体稳健性。对于当前公寓价格预测赛题,这类方法的启发在于:当单模型提升接近瓶颈时,真正拉开差距的是数据表达能力与模型互补性。现实中,面向银行抵押估值或城市住房价格指数建模时,这类多模型集成也比单一模型更抗噪。 |
| 2017-06 | Pedro Marcelino | Comprehensive Data Exploration with Python 关键词:数据理解、相关性分析、异常样本、可视化诊断、生态标杆案例。该案例同样来自经典房价任务,但其价值主要体现在"如何理解房价数据"而非冲榜技巧。内容通常会围绕目标变量分布、数值与类别特征关系、异常点和缺失模式展开,帮助建立对价格形成机制的认知。对本赛题的参考价值在于,它为建模前的字段筛选和清洗策略提供了方法框架。实际业务里,房产估值模型是否可信,很大程度上取决于数据理解是否足够深入,而不是参数是否调得足够复杂。 |
| 2017-08 | Laura Fink | Regularized Linear Models 关键词:正则化回归、基线模型、特征缩放、可解释性、生态标杆案例。该案例展示了在房价预测中如何用岭回归、Lasso、Elastic Net 等线性方法建立强基线。虽然分数未必总能击败高级集成模型,但这类方案具有训练稳定、推理成本低、可解释性较好的特点。对当前竞赛尤其有参考意义,因为 MAE 指标下,经过合理特征处理的正则化模型常常能提供可靠基准。放到实际部署场景,这类模型更适合资源受限或对解释要求较高的业务,例如小型中介估价工具、离线批量评估或规则结合型定价系统。 |
| 2017-12 | Julien Beaulieu / Kaggle 社区 | House Prices EDA, FE and ML 关键词:端到端流程、特征构造、多模型比较、验证设计、生态标杆案例。该类案例的价值在于覆盖了从探索分析、特征构造到多模型评估的完整流程,能够帮助读者理解什么叫"可提交、可比较、可复现"的表格建模原型。对于本赛题,这样的参考比单纯看排行榜更实用,因为它展示了如何建立统一验证框架,判断树模型、线性模型和集成方案各自适配的数据条件。真实项目中,这种标准化实验流程有助于把模型开发从个人试错变成团队可协作的工程过程。 |
总结
这道题的价值不只在于做出一份提交结果,更在于借助一组典型房产字段,完整走通结构化回归项目的关键环节。数据质量检查、异常价格识别、类别特征处理、长尾分布修正、交叉验证设计,以及围绕平均绝对误差展开的误差分析,几乎都能直接迁移到二手房挂牌价预测、资产估值和金融抵押评估等业务场景。
如果把这类竞赛当成真实项目原型来看,真正值得积累的不是某个单一高分模型,而是从业务问题抽象到稳定建模闭环的过程。公寓价格预测看似是经典入门题,实际很适合用来训练数据理解能力、特征构造能力和结果校准意识,这些能力比排行榜名次更接近日常数据岗位的核心要求。