电信客户流失预测实战 从 Kaggle 二分类赛题到留存预警建模

电信客户流失预测并不是单纯的表格分类练习,这类任务直接对应企业留存运营中的高频需求。该 Kaggle 赛题以结构化数据为基础,要求输出用户流失概率,核心不在于给出一个生硬的是否流失结论,而在于建立可用于风险排序的评分结果。

从技术实践看,这道题很适合用来串起完整的建模链路:理解流失场景,识别训练集与测试集结构,围绕 ROC-AUC 设计验证方案,再在逻辑回归、LightGBM、CatBoost 等方法之间做取舍。对于自学机器学习的人群,这类案例的价值在于贴近真实业务,也足够适合复现和迭代。

文章目录

赛题概述

本案例地址 Предсказание оттока пользователей (весна 2021)

这是一道典型的结构化数据二分类赛题,核心任务是基于电信客户历史特征预测用户流失概率。题目形式接近真实业务中的留存预警建模,既要求完成从表格数据清洗、特征理解到分类模型训练与概率输出的完整流程,也适合练习面向业务目标选择指标的能力。由于评估采用 ROC-AUC,建模重点不只在预测对错,还在于模型对高风险用户的区分能力,这类任务在运营决策、客户分层和营销干预中都具有直接价值。

模块名称 内容简介 所需技能 数据类型 应用场景
赛题背景 赛题属于用户流失预测问题,本质是通过历史行为与客户属性识别潜在离网人群,场景贴近电信、订阅服务和互联网产品中的客户留存管理。相比单纯刷分题,这类任务更强调把预测结果转化为可执行的运营信号,约束在于类别区分、风险排序和业务可解释性。 业务问题抽象、二分类建模、特征理解、缺失值与类别特征处理、风险识别思维 结构化表格数据、用户属性数据、行为统计特征、目标标签、待预测测试集 电信用户留存、会员续费预警、订阅产品流失管理、精细化运营分析
竞赛目标 参赛结果并不是提交客户是否流失的硬分类结论,而是提交每个样本的流失概率,用于形成风险排序列表。项目落地逻辑接近真实企业中的流失预警系统,需要产出可用于筛选高风险客户的评分结果,而不是停留在离线分类实验。 概率预测、模型训练与验证、特征工程、交叉验证、提交结果构造、从模型输出到业务评分的转换 训练集、测试集、概率型预测结果、提交文件、自建验证切分 客户风险评分、挽留名单生成、优惠触达策略支持、流失干预优先级排序
评价指标 评价采用 ROC 曲线下面积,关注的是模型能否把更可能流失的客户排在更前面,而不是某个固定阈值下的命中率。这种评审逻辑适合真实业务早期建模阶段,因为运营动作通常会根据预算和资源动态设定干预阈值,模型排序能力比单点分类结果更关键。 指标理解、排序建模思维、验证集设计、过拟合控制、概率校准意识、结果稳定性分析 真实标签、预测概率、验证分数、交叉验证结果、排行榜反馈 风险排序系统、营销资源分配、客户干预策略评估、二分类模型效果对比
业务意义 用户流失预测是企业数据团队中极具代表性的实战题型,能够把机器学习从分析报告推进到决策支持系统。其价值在于提前发现潜在流失客户,支撑优惠投放、客服回访和分层运营,降低获客后流失带来的成本浪费,也为后续的客户生命周期管理、推荐策略和增长分析打下基础。 建模落地思维、预测结果解释、策略联动设计、运营分析协同、从模型到业务闭环的方案意识 客户全量画像、运营策略数据、干预反馈数据、留存结果数据、业务规则信息 电信行业智能运营、SaaS 续费管理、互联网增长分析、CRM 风险预警系统

数据详解

这场竞赛的数据组织方式相当典型,核心内容集中在"任务定义 + 评价方式 + 数据文件 + 提交约束"四个层面,真正影响建模判断的信息并不分散。赛题本身是电信客户流失预测,属于标准的结构化二分类任务,训练集提供特征与目标变量,测试集只提供特征,要求输出每个样本的流失概率。标签体系也比较明确,平台只给出一个与任务直接相关的标签,即 AUC,这意味着主线不是追求类别硬判定,而是提升样本排序能力,让正类客户在预测分数上尽量排在负类之前。阅读这类竞赛元数据时,重点应放在比赛简介、评价指标、数据文件说明、提交形式与队伍限制上,这些字段决定了建模目标、验证策略和结果输出格式;像论坛 ID、组织 ID、是否支持某些平台功能、平台内部控制开关等内容,更偏向 Kaggle 运行机制,对理解任务本身和落地建模帮助有限,可以视为平台元数据而不是业务数据。

字段名称 类型/范围 描述信息
比赛标题 字符串 赛题标题为"用户流失预测(2021 春季)",直接点明任务属于客户流失建模。对于做项目分析的人,这个字段的价值不在于名称本身,而在于迅速识别问题类型:这是典型的留存运营场景,不是回归预测,也不是多分类问题。
比赛副标题 字符串 副标题说明该竞赛是 DeepLearningSchool 课程的一部分,意味着题目带有教学性质,通常会配套 baseline Notebook 和相对清晰的数据入口。对初学者来说,这类赛题更适合作为结构化机器学习实战案例。
标签信息 JSON 数组 当前标签只有 AUC,对任务理解非常关键。它表明比赛关注的是模型区分正负样本的能力,而不是固定阈值下的准确率,因此建模时更应重视概率输出质量、排序稳定性和交叉验证设计。
比赛简介 Markdown 长文本 简介明确了业务背景是电信公司客户流失预测,并指出真实业务价值在于提前识别可能流失的客户,以便采取挽留策略。这一信息决定了建模不只是"做一个分类器",而是服务于客户运营、营销触达和成本优化。
评价指标 字符串 评价指标为 ROC-AUC,即 ROC 曲线下面积。该指标适合二分类概率排序任务,尤其适合类别分布可能不均衡的流失问题。实际建模时,验证集评估、模型选择和调参方向都应围绕 AUC 展开。
指标说明 Markdown 长文本 指标说明强调该分数越高越好,取值范围通常在 0.5 到 1.0 之间。这个字段的实际作用,是提醒读者不要把问题误解成"预测标签对错",而要把重点放在模型对高风险客户的优先识别能力上。
开放时间 时间 比赛开放时间反映题目发布时间。对技术复盘而言,这个字段主要用于识别题目所处的工具与方法环境;如果是较早期竞赛,常见高分方案通常以传统表格模型为主。
截止时间 时间 截止时间被设置到 2030 年末,说明页面仍保持可参与或可访问状态。对于后来者而言,这意味着可以继续基于公开数据做训练与复现,适合作为长期练习项目。
提交次数限制 整数 每天最多提交 20 次,计分提交 2 次。这个限制说明比赛虽然允许试验,但不鼓励完全依赖排行榜调参,实际更需要本地验证集和稳定的交叉验证方案。
排行榜设置 浮点数 + 布尔值 排行榜 100% 开放,且最终排行榜已验证。对于复现者来说,这意味着公开分数信息较完整,便于对照公开 Notebook 理解不同方案的大致性能上限。
队伍与协作限制 整数 + 布尔值 最大队伍人数为 1,禁止队伍合并,也不支持团队模型。这说明竞赛更偏个人练习和课程作业场景,成绩主要反映个人的数据理解、特征工程和模型调参能力。
奖励信息 字符串/空值 + 整数 奖金字段为空,仅显示奖项数量。这类信息说明竞赛不以商业奖金为驱动,而更偏教学和练习性质。对学习者而言,关注点应放在方法论积累,而不是奖金机制。
数据集说明 Markdown 长文本 数据页说明提供了 train.csv、test.csv 和 submission.csv 三个核心文件。这个字段的价值在于快速确认任务交付形式:训练集建模、测试集推断、按示例文件格式提交结果。
数据文件说明 字符串集合 train.csv 包含特征列和目标变量,test.csv 只包含特征,submission.csv 是提交模板。这是判断监督学习结构的最直接信息,也决定了代码流程应包括训练、验证、推断和生成提交文件四个环节。
数据规模 整数(字节) 压缩后约 11.8 万字节,解压后约 89.6 万字节,说明这是一个相对轻量的结构化数据集。这样的体量通常适合快速迭代特征工程、尝试多种树模型,训练成本较低,适合教学和个人实验。
样本参与规模 整数 参赛队伍与参赛者均为 5876,总提交数超过 3.8 万次。这个规模说明题目热度较高,公开解法和经验通常较丰富,便于横向比较不同建模思路。
目标标签字段 字符串说明 平台说明训练集包含目标变量,但字段名没有直接写在元数据中,而是提示可在 baseline Notebook 中查看。这意味着真正开始建模前,必须先打开基线代码确认目标列名称、字段类型和预处理方式,不能仅凭页面文本完成数据理解。
提交目标 字符串说明 提交内容不是类别标签,而是测试集中每个客户"流失概率"的预测值。这个要求会直接影响模型选择和输出处理,像逻辑回归、梯度提升树、CatBoost、LightGBM 这类能够稳定输出概率分数的模型通常更契合任务。
Baseline 与补充规则 Markdown 长文本 比赛简介特别指出特征名、目标变量以及完整评分标准可在 baseline Notebook 和课程页面中查看。这个信息非常重要,因为它意味着 Kaggle 页面并未给出全部建模细节,正式动手前需要把 baseline 视为题目说明的一部分。
平台元数据(合并概括) 布尔值/字符串/整数 包括论坛 ID、组织 ID、是否支持 Notebook、是否允许特定提交方式、许可类型等字段。这些内容对平台使用有帮助,但对理解业务问题、设计特征工程和训练模型的直接价值有限,阅读时不必平均分配注意力。

解题思路

这类预测任务本质上是典型的二分类表格建模问题,目标是根据用户属性与行为特征判断流失概率,评价指标采用 ROC-AUC,关注的是排序能力而不是单一阈值下的分类准确率。正因为如此,解题路线并不需要局限在某一种模型范式:一部分方案强调可解释性与稳定性,适合快速建立业务基线;一部分方案依赖树模型对非线性关系、缺失值和类别特征的处理能力,通常是结构化数据竞赛中的主力;还有一部分方案则更适合做特征组合、概率校准与融合优化,用于冲击更高分数。从真实业务视角看,客户流失预测也很少只靠单模型落地,常见做法往往是"规则筛查 + 统计特征 + 主模型打分 + 阈值分层运营"联合使用。因此,这道题非常适合并行尝试从统计学到机器学习、再到深度学习和融合策略的多层路线,在保证可复现与可解释的前提下逐步逼近更优结果。

方法标题 案例适配度 方法说明 操作流程 优点 缺点
统计基线:逻辑回归结合分箱与业务规则特征 78% 以逻辑回归为核心,围绕用户在网时长、费用结构、服务使用情况、合同状态等字段做分箱、比率、交叉统计和缺失指示变量,形成一套偏统计建模的稳健基线方案。对于流失预测这类需要解释"为什么高风险"的任务,这条路线很接近真实业务中的首版上线模型。 清洗缺失与异常值,识别数值和类别字段,构造分箱特征、占比特征、是否异常波动特征,对类别变量做编码,使用交叉验证训练逻辑回归并输出流失概率,基于验证集检查 AUC 与系数方向。 可解释性强,便于映射到运营策略;训练和调参成本低;对初学者理解特征作用、概率输出和 AUC 评估非常友好。 对复杂非线性关系刻画不足;高阶特征交互需要手工构造;在竞赛场景下通常难以达到排行榜前列。
树模型主线:LightGBM 或 XGBoost 处理异构表格特征 95% 以梯度提升树为核心,利用树模型对类别、数值、缺失值和非线性关系的适应能力,建立结构化数据场景中的主力方案。对于客户流失问题,费用、套餐、服务组合、使用行为之间常存在复杂交互,树模型往往比线性模型更容易捕捉有效模式。 完成基础清洗后,保留原始数值特征并补充类别编码、频次编码、组合统计特征,采用分层交叉验证训练 LightGBM 或 XGBoost,围绕学习率、叶子数、深度、采样比例做调参,使用验证集与折外预测监控 AUC。 对表格数据适配性很高;对特征尺度不敏感;能自动学习非线性和交互关系;通常能在较少特征工程下取得很强结果。 调参空间较大;如果类别编码处理粗糙,容易损失信息;在样本量不大时,过度调参可能导致本地验证与线上分数不一致。
类别特征优先:CatBoost 结合原生类别处理 93% 针对客户流失数据中常见的大量离散字段,采用 CatBoost 直接建模类别特征,减少繁琐编码步骤。对于套餐类型、支付方式、地区、合同类别等字段较多的场景,这条路线往往兼顾效果与工程效率。 区分数值列与类别列,尽量保留类别字段原貌,补充少量统计特征和缺失标记,使用分层交叉验证训练 CatBoost,控制迭代轮数、深度、正则化强度与早停策略,输出概率并评估 AUC。 对类别特征友好,预处理压力小;通常比手工独热编码更稳健;在中小规模表格任务上容易获得很强基线。 训练速度可能慢于部分 LightGBM 配置;对高噪声字段仍需筛选;如果数据本身数值特征主导,优势未必显著。
特征工程增强:目标编码与交叉统计特征配合线性或树模型 88% 核心不在单一模型,而在于通过目标编码、类别组合、组内统计、比率与差值特征增强原始信息密度,再将这些特征交给逻辑回归、LightGBM 或 CatBoost。适合用作从"普通 baseline"走向"可竞争方案"的中间路线。 对高基数类别做交叉验证式目标编码,构造用户费用占比、服务组合数量、合同与支付方式交叉特征、分组均值和偏离度特征,将增强后的特征分别送入线性模型和树模型,对比验证集 AUC 并筛选有效特征集。 能显著提升原始表格数据的信息表达能力;有助于理解哪些业务组合更容易流失;兼顾建模效果与业务洞察。 特征构造与验证流程更复杂;目标编码如果处理不规范容易泄漏;人工设计成本高于直接上树模型。
表格深度学习:MLP/TabNet/Entity Embedding 建模用户流失 70% 将类别字段映射为嵌入向量,与数值特征共同输入多层感知机、TabNet 或类似表格深度学习结构,尝试学习更高阶的隐式组合关系。这类方案更适合作为进阶练习,而不是该题的首选主线。 对类别字段建立 embedding,对数值字段标准化,拼接后输入 MLP 或 TabNet 训练二分类模型,采用交叉验证与早停控制过拟合,输出概率并与树模型结果比较 AUC。 有助于学习表格深度学习的完整流程;对复杂类别组合关系有一定建模能力;在后续做模型融合时可能提供差异化信号。 对这类中小型结构化数据,单独使用时常常不如树模型稳定;调参敏感,对随机种子和训练细节依赖较强;可解释性较弱。
自动机器学习路线:多模型搜索与特征预处理联动 85% 借助 AutoML 框架自动完成特征预处理、模型筛选、超参数搜索与集成,适合快速建立高质量候选方案。从已有优秀案例看,这条路线在该竞赛中具有现实可行性,尤其适合时间有限但希望覆盖多种算法组合的场景。 导入原始训练集,定义目标列与评估指标为 AUC,设置交叉验证和搜索时间预算,运行 AutoML 生成候选模型与集成结果,再回看特征处理和模型排名,必要时手工复现实验。 能较快遍历多种表格算法;容易获得强基线甚至高分结果;适合学习自动化建模在实战中的价值。 容易停留在"会跑不会拆"的层面;资源消耗较高;若缺少验证设计意识,可能难以定位性能波动原因。
模型融合与概率校准:树模型、线性模型、深度模型集成 92% 将不同范式模型的预测概率进行加权平均、排序融合或二层堆叠,再结合概率校准提升 AUC 稳定性。由于 AUC关注整体排序,一组相关性较低的模型往往比单模型更有机会取得更高分数,这也是竞赛后期常见的冲分路线。 分别训练逻辑回归、LightGBM、CatBoost 与可选的表格神经网络,保留折外预测,分析模型间相关性,采用加权融合或 stacking 训练二层模型,对融合结果做概率校准与稳定性检查,再生成提交文件。 容易在强单模型基础上继续获得提升;能综合不同模型的偏好;更接近真实业务中的风险评分集成思路。 流程更复杂,对交叉验证设计要求高;如果基模型差异不足,融合收益有限;实现不规范时容易引入信息泄漏。
业务落地方案:AUC 优化结合阈值分层与留存策略映射 90% 这条路线不只追求榜单分数,而是将流失概率模型直接映射为运营动作。虽然竞赛以 AUC 排名,但真实场景中还需要把概率区间转成高、中、低风险分层,并结合召回成本、补贴成本和用户生命周期价值确定干预阈值。 训练表现稳定的主模型,输出用户流失概率,在验证集分析不同概率分段的命中率与覆盖率,结合业务成本设定高风险阈值和运营优先级,形成"预测---筛选---干预---复盘"的闭环方案。 强调模型到业务决策的最后一公里;有助于理解 AUC 高不等于策略最优;适合把竞赛经验迁移到真实留存场景。 对榜单提升不一定最直接;需要额外业务假设与成本数据;如果只关注比赛分数,容易低估这条路线的价值。

操作案例

基础流程样例

任务理解与建模目标

该竞赛在教学场景中适合被整理为一个标准的多标签文本分类流程:输入是一段文本内容,输出是多个标签对应的命中概率,评估阶段通常不能只看单一准确率,而要关注每个标签的区分能力,再汇总得到整体效果。基础示例不追求复杂模型,而是采用 TF-IDF + OneVsRestClassifier + LogisticRegression 这一类可解释、依赖轻量、适合教学和快速验证的数据流。这样的结构在真实项目中也很常见,尤其适合搭建首个可运行基线,用于判断数据质量、标签可学性和后续优化空间。

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

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import roc_auc_score

RANDOM_STATE = 42

train_path = "train.csv"
test_path = "test.csv"

读取数据与识别字段结构

多标签文本任务的第一步不是急于建模,而是确认字段结构是否符合预期。教学文章里最容易忽略的一点,是比赛数据未必直接给出已经整理好的标签矩阵,很多时候标签可能以字符串、分隔符拼接文本或多列二值字段存在。这个环节的目标,是快速识别文本列、标签列以及测试集是否缺失目标字段,并建立一套尽量稳健的字段判断方式,避免后续流程建立在错误假设上。

python 复制代码
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("\ntrain columns:")
print(train_df.columns.tolist())
print("\ntest columns:")
print(test_df.columns.tolist())

print("\ntrain head:")
print(train_df.head())

查看标签结构与构造多标签矩阵

多标签任务和普通二分类、单标签多分类最大的差别,在于一条样本可能同时对应多个标签。实际数据常见的两种形式,一种是单独的标签字段,内容类似 "tag1 tag2""tag1,tag2";另一种是多列 0/1 标签矩阵。为了兼容教学演示,下面的代码同时提供两类处理方式:如果存在标签文本列,就将其拆解后做多热编码;如果存在多个二值标签列,就直接提取标签矩阵。这一步完成后,模型训练和评估都将围绕 Y 这个二维标签矩阵展开。

python 复制代码
def detect_text_column(df):
    # 优先尝试常见文本列名
    candidates = ["comment_text", "text", "content", "sentence", "review", "document"]
    for col in candidates:
        if col in df.columns:
            return col
    
    # 回退:选择字符串列中平均长度最大的列作为文本列
    obj_cols = df.select_dtypes(include=["object"]).columns.tolist()
    if not obj_cols:
        raise ValueError("未找到可用文本列")
    
    avg_lengths = {}
    for col in obj_cols:
        avg_lengths[col] = df[col].fillna("").astype(str).str.len().mean()
    return max(avg_lengths, key=avg_lengths.get)


def detect_label_columns(train_df, test_df, text_col):
    # 候选:训练集有、测试集没有的列,常见于标签列
    train_only_cols = [c for c in train_df.columns if c not in test_df.columns]
    
    # 去掉明显不是标签的列
    excluded = {text_col, "id"}
    train_only_cols = [c for c in train_only_cols if c not in excluded]
    
    # 若这些列都是数值且近似二值,则视为多标签列
    binary_like_cols = []
    for col in train_only_cols:
        series = train_df[col].dropna()
        unique_vals = set(series.unique().tolist())
        if unique_vals.issubset({0, 1}):
            binary_like_cols.append(col)
    return binary_like_cols


text_col = detect_text_column(train_df)
label_cols = detect_label_columns(train_df, test_df, text_col)

print("推断文本列:", text_col)
print("推断标签列:", label_cols)

if len(label_cols) > 0:
    # 形式一:多列二值标签
    X_text = train_df[text_col].fillna("").astype(str)
    Y = train_df[label_cols].astype(int).values
    test_text = test_df[text_col].fillna("").astype(str)
    final_label_names = label_cols
else:
    # 形式二:单列标签文本,需要拆分
    possible_label_text_cols = [c for c in train_df.columns if c not in test_df.columns and c != text_col]
    if len(possible_label_text_cols) != 1:
        raise ValueError("无法唯一确定标签字段,请手动指定标签列")
    
    label_text_col = possible_label_text_cols[0]
    print("推断标签文本列:", label_text_col)

    def split_labels(x):
        x = str(x).strip()
        if x == "" or x.lower() == "nan":
            return []
        # 同时兼容逗号、空格、分号
        parts = re.split(r"[,;| ]+", x)
        return [p for p in parts if p]

    label_lists = train_df[label_text_col].fillna("").map(split_labels)
    mlb = MultiLabelBinarizer()
    Y = mlb.fit_transform(label_lists)
    final_label_names = mlb.classes_.tolist()

    X_text = train_df[text_col].fillna("").astype(str)
    test_text = test_df[text_col].fillna("").astype(str)

print("标签矩阵形状:", Y.shape)
print("标签名称:", final_label_names[:20])
print("每个标签正样本数:")
print(pd.Series(Y.sum(axis=0), index=final_label_names).sort_values(ascending=False))

文本预处理与基础清洗

文本预处理的目标不是把所有噪声都处理掉,而是先建立一套足够稳定、不会破坏关键信息的清洗规则。对于教学场景,过度复杂的清洗往往会掩盖核心流程,因此更适合保留大小写统一、链接替换、非字母数字字符规整、空白压缩这类基础步骤。这样的轻量预处理已经足以支撑 TF-IDF 基线,同时也便于后续替换为更强的分词器或预训练语言模型编码器。

python 复制代码
def clean_text(text):
    text = str(text).lower()
    text = re.sub(r"http\S+|www\.\S+", " url ", text)
    text = re.sub(r"\d+", " number ", text)
    text = re.sub(r"[^a-zA-Zа-яА-Я0-9\s]", " ", text)  # 兼容英文与俄文字符
    text = re.sub(r"\s+", " ", text).strip()
    return text

X_text_clean = X_text.map(clean_text)
test_text_clean = test_text.map(clean_text)

print(X_text_clean.head())

训练集验证集划分

在多标签任务中,验证集的作用不仅是观察分数,更重要的是提前发现标签稀疏、标签分布偏移和模型对少数标签失效的问题。基础示例使用常规随机划分,以保证流程简单易懂。如果数据中某些标签非常稀少,真实竞赛环境通常会进一步采用更稳妥的多标签分层划分方法,但作为教学版起点,随机划分已经足够完成从训练到评估的闭环。

python 复制代码
X_train, X_valid, y_train, y_valid = train_test_split(
    X_text_clean,
    Y,
    test_size=0.2,
    random_state=RANDOM_STATE
)

print("训练集文本数:", len(X_train))
print("验证集文本数:", len(X_valid))
print("训练集标签矩阵:", y_train.shape)
print("验证集标签矩阵:", y_valid.shape)

基础建模

多标签文本分类中,一个实用而稳定的基线方法,是将文本转为 TF-IDF 稀疏向量,再通过 OneVsRestClassifier 为每个标签训练一个独立分类器。LogisticRegression 在这类问题上表现通常可靠,训练速度快,也能直接输出概率,便于计算 ROC AUC。这个方案在真实业务中也很常见,因为上线门槛低、可解释性较好,而且可以作为后续升级到线性 SVM、树模型融合或 Transformer 模型的性能参照系。

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,最后给出宏平均结果。这样既符合竞赛中的概率预测逻辑,也更接近真实项目中的模型审查方式,因为业务通常关心的不只是整体均值,还关心某些高风险标签是否被有效识别。

python 复制代码
y_valid_proba = model.predict_proba(X_valid)

per_label_auc = {}
valid_auc_values = []

for i, label_name in enumerate(final_label_names):
    y_true_col = y_valid[:, i]
    y_pred_col = y_valid_proba[:, i]
    
    # 某一列若验证集中只有单一类别,ROC AUC 无法计算
    if len(np.unique(y_true_col)) < 2:
        per_label_auc[label_name] = np.nan
        continue
    
    auc_i = roc_auc_score(y_true_col, y_pred_col)
    per_label_auc[label_name] = auc_i
    valid_auc_values.append(auc_i)

macro_auc = np.mean(valid_auc_values) if valid_auc_values else np.nan

print("各标签 ROC AUC:")
print(pd.Series(per_label_auc).sort_values(ascending=False))

print("\n宏平均 ROC AUC:", round(macro_auc, 6))

生成测试集多标签概率预测

比赛提交阶段通常需要的是每个标签的概率,而不是硬标签。基础流程中,测试集只需复用训练好的文本清洗和建模管道,即可得到多标签概率输出。即使暂时不提交到排行榜,这一步也很有价值,因为它验证了训练、验证、推理、导出结果这一整条链路已经打通,后续所有优化都可以在这条稳定基线上迭代。

python 复制代码
test_proba = model.predict_proba(test_text_clean)

submission = pd.DataFrame(test_proba, columns=final_label_names)

# 如果测试集带有 id 列,可保留
if "id" in test_df.columns:
    submission.insert(0, "id", test_df["id"])

print(submission.head())
submission.to_csv("submission.csv", index=False)
print("submission.csv 已生成")

扩展流程概述

从教学版流程升级到竞赛增强版,重点不在于简单替换更复杂的模型名称,而在于逐步缩小从"可运行"到"可取得稳定高分"之间的差距。实际提升通常来自几个方向的协同:数据侧需要更细地检查标签不平衡、异常文本、重复样本和潜在泄漏;验证侧需要从普通随机划分过渡到更稳健的多标签分层验证,以减少线上线下分数偏差;特征侧可以从词袋与字词混合 n-gram 扩展到更强的文本表示,甚至接入预训练语言模型;模型侧则可以从线性分类器延伸到 LightGBM 的文本统计特征融合、Transformer 微调以及多模型集成。到了真实业务环境,还需要进一步考虑概率校准、阈值优化、推理延迟、线上漂移监控和标签体系迭代,因为比赛只关心排行榜分数,而业务最终关心的是模型是否真的改善了审核效率、召回质量或用户触达效果。

扩展流程 流程说明 流程目标
多标签分层验证 将普通随机划分升级为更接近标签联合分布的验证方式,降低验证集偶然性,减少线下评估与线上表现不一致的问题。 提升评估稳定性
文本清洗增强 在基础清洗之外,补充停用词处理、词形还原、拼写归一、特殊符号模式保留等策略,针对具体语料优化输入质量。 提升特征有效性
TF-IDF 特征扩展 同时引入词级与字符级 n-gram,并调节词表规模、最小文档频次和权重方式,让模型更好捕捉短语与拼写模式。 提升基线模型上限
标签不平衡处理 围绕长尾标签引入类别权重、重采样、阈值调整等方法,缓解模型只关注高频标签的问题。 提升少数标签识别能力
更强的线性模型与集成 尝试 LinearSVC、SGDClassifier、朴素贝叶斯与逻辑回归融合,将不同偏好的线性模型组合起来。 获得更稳健的整体分数
深度学习文本编码 使用 BERT、RoBERTa 等预训练语言模型进行多标签微调,让模型学习上下文语义,而不只依赖词频统计。 显著提升语义表达能力
概率校准与阈值优化 在输出概率后增加校准步骤,并针对不同标签设置独立阈值,使预测结果更贴近实际业务决策。 提升概率可用性与业务落地效果
错误分析闭环 对高置信误判、标签冲突样本和边界样本做人工复盘,定位是清洗问题、标注问题还是模型表达不足。 找到真实优化方向
模型融合 融合线性模型、树模型统计特征方案和预训练模型输出,利用不同模型的互补性提高排行榜表现。 冲击更高分数
生产化部署设计 将训练、评估、推理、监控拆成标准流程,并补充版本管理、漂移监测和定期再训练机制。 从比赛原型走向真实业务系统

优秀案例解析

这一节的案例筛选标准并不以"排行榜分数"作为唯一依据,而是更关注方案是否完整覆盖了表格二分类任务中的关键环节,包括目标定义是否贴近客户流失预警场景、特征处理是否适合电信类用户行为数据、验证策略是否能够控制线上线下偏差、输出结果是否以概率形式服务后续运营决策,以及方案是否具备迁移到真实业务环境的可复用性。由于该竞赛属于课程型社区竞赛,公开信息中更容易获得的是赛中 Notebook 与公开项目样例,而不是完整的正式获奖技术报告,因此这一节会明确区分"赛中公开项目样例"和"生态标杆案例"两类来源。前者可以帮助理解参赛者在 Kaggle 环境下如何完成从数据读取、建模到提交流程的原型闭环,后者则补充了客户流失预测在真实行业中的更成熟做法,例如不平衡样本处理、业务分层建模、可解释性分析与干预优先级排序。这种组合更适合技术博客读者,因为参考价值不止停留在"如何拿到一个分数",而是延伸到"如何把一个表格分类题做成可上线、可解释、可运营的流失预警系统"。

创建时间 作者 案例解析
2025-10 Antonoof 🥇top1 AutoML DLS MIPT 关键词:AutoML、特征预处理、概率输出、快速原型、AUC 优化。该案例来自本赛题公开 Notebook,代表了一类高完成度的赛中公开项目样例。核心价值不在于单独强调某个模型,而在于用自动化建模流程把缺失值处理、类别特征编码、模型选择与参数搜索串成一条可复用流水线,适合课程竞赛和小团队快速验证。对本题的参考意义在于,客户流失预测往往是业务紧迫度很高的任务,原型阶段需要尽快得到可比较的基线结果,AutoML 路线能够迅速定位有效模型区间,再将精力投入到特征解释和干预策略设计。
2025-09 KLYUSHNIK-Alexsandr |Предсказание оттока|ROC-AUC0.85153 关键词:ROC-AUC、本地验证、表格特征、分类概率、稳定提交。该案例直接围绕本竞赛展开,公开成绩已达到较高水平,适合作为赛中公开项目样例观察"中高分方案"的基本结构。此类方案通常不会过度复杂,而是围绕训练集做稳健的数据清洗、编码与验证集划分,重点保证本地验证与排行榜表现方向一致。对流失预测任务来说,这类做法很重要,因为运营团队真正依赖的是概率排序的稳定性,而不是某一次偶然提分。具备稳定验证框架的方案,更容易迁移到月度流失预警、营销名单筛选和用户挽留优先级分配等业务流程中。
2025-10 Aleksei Antipov notebook877f71673e 关键词:基线增强、特征工程、Kaggle Notebook、结构化数据、提交闭环。该案例虽然标题信息有限,但从公开成绩与关联数据源看,属于围绕本赛题完成的有效提交原型。此类 Notebook 的典型价值在于把训练集、测试集、提交文件组织成标准闭环,帮助读者理解结构化竞赛中最低可行方案需要具备哪些工程要素,包括字段对齐、训练推理一致性和输出概率格式控制。对于自学者而言,这类案例比空泛讨论模型更有实践意义,因为真实业务中的流失预测系统同样要求从离线训练到批量打分的流程稳定可复现。
2026-01 Himanshu Dhiman Customer Churn Prediction | Score: 0.85126 关键词:客户流失、监督分类、AUC 评估、特征编码、业务迁移。该案例标题直接采用"客户流失预测"表述,说明作者将竞赛任务放回了更通用的业务语境中,而不是仅把它当作一次排行榜练习。这样的项目通常更容易延伸出特征贡献分析、客户分群、风险阈值设定等业务讨论。对本赛题的参考价值在于,电信流失问题本质上属于高频、可干预、成本敏感的二分类任务,模型输出不仅用于判断会不会流失,更用于确定应该把有限的优惠券、客服回访和套餐调整资源投向哪些高风险用户。
2025-09 Ramil Khabibrakhmanov Predicting customer churn 关键词:客户留存、监督学习、特征理解、风险排序、业务可解释性。该案例属于与题面高度一致的公开项目样例,重点价值往往在于将"客户流失"从单纯标签预测转向留存管理问题。技术上,这类案例通常会围绕用户合同类型、服务订阅状态、账单支付行为等字段构建解释性较强的模型输入,使结果更容易被运营和产品团队接受。对现实项目而言,可解释性并不是锦上添花,而是落地前提,因为留存策略需要说明流失风险来自价格敏感、服务满意度下降还是长期活跃度衰退。
2018-03 IBM Developer / 开源社区 Telco Customer Churn Analysis 关键词:电信流失、经典表格数据、特征分析、业务解释、留存策略。该案例不属于本竞赛本身,而是客户流失方向的生态标杆案例。其长期被引用的原因在于数据字段与电信业务场景高度贴合,能够系统展示流失建模中的典型分析路径:从客户画像、合同周期、增值服务与付款方式出发识别高风险群体,再将模型预测映射到运营干预。对本赛题而言,这类案例能补足课程竞赛中常见的业务语义缺失问题,帮助读者理解为什么某些表格特征即使只带来有限分数提升,也可能在真实留存项目中具有很高决策价值。
2020-02 H2O.ai Customer Churn Prediction with H2O AutoML 关键词:AutoML、模型集成、企业落地、可复现流程、部署友好。该案例属于生态标杆案例,展示了在企业环境中如何把客户流失预测做成可复用的数据产品,而不是单次实验。与 Kaggle Notebook 相比,这类方案更强调训练流程标准化、模型比较、概率校准与部署衔接,对本赛题读者的启发在于:高质量提交并不只体现为单模型得分高,还体现为能否形成一套可迁移到 CRM、营销自动化或外呼系统中的稳定流程。对于教育场景中的自学者,这类材料也有助于建立从比赛原型到企业实践的完整认知。
2023-10 Google Cloud / Vertex AI 示例团队 Predict customer lifetime value and churn with BigQuery ML / Vertex AI 关键词:云端建模、客户流失、MLOps、可扩展部署、业务闭环。该案例同样属于生态标杆案例,虽然不局限于本竞赛的数据结构,但它展示了客户流失预测在真实生产环境中的更完整形态:数据接入、特征生成、模型训练、批量评分、监控与业务反馈闭环。对本赛题的参考价值在于提醒读者,AUC 只是建模阶段的一个信号,真正有价值的系统还需要考虑数据更新频率、打分延迟、召回策略成本和模型漂移。对于电信、订阅制平台、在线教育等行业,这类架构思路具有很强的复用性。

总结

这道赛题的实战意义,在于把常见的二分类知识点放进了明确的业务目标里。AUC 不只是比赛指标,它对应的是高风险客户能否被更早识别;概率输出也不只是提交格式,它决定了后续能否做客户分层、名单筛选和干预优先级排序。掌握这一层,建模工作才真正接近业务落地。

从学习路径看,这类项目尤其适合作为结构化数据建模的进阶案例。基线模型能够帮助建立稳定认知,树模型与特征工程负责提升效果,验证设计与错误分析决定方案是否可靠,而真正成熟的结果还需要映射到留存策略与运营闭环中。比赛页面会关闭,流失预警这类问题却会长期存在于电信、订阅服务和互联网产品的数据团队中。

相关推荐
j7~1 小时前
【AI应用---白话大模型(篇九)】《一文看懂Agent:CLI 智能体、上下文窗口与大模型幻觉》---详解
人工智能·大模型幻觉·上下文窗口·cli智能体
爱学堂IT课程大全1 小时前
零基础,Hermes Agent 多场景自动化实战
运维·人工智能·自动化
维基框架1 小时前
PyTorch正在重构开源AI基础设施
人工智能·pytorch·重构
hfywmsj1 小时前
广州餐饮铺位招租决策模型:从流量评估到合同风控的技术拆解
大数据·人工智能·广州餐饮铺位招租
cc5725026531 小时前
2026 秋招直播运营岗位招聘 JD 拆解,数据指标与数据分析能力备考思路
大数据·数据挖掘·数据分析
尘埃落定wf1 小时前
AGENTS.md 与 CLAUDE.md:如何为 AI 编程助手建立项目协作规范
人工智能·ai编程
阡陌数智1 小时前
LiteLLM 开源网关实践:能力边界与生产环境改造要点
大数据·人工智能·开源·prompt·软件工程
牧羊人.3331 小时前
动手学深度学习 04 | Dataset 和 DataLoader、数据增强
人工智能·pytorch·深度学习·算法
东方佑1 小时前
可微概率后缀超图:检索硬、聚合软 —— 与 ROSA 的对比及真实链路验证
人工智能