新闻文本分类常见于主题识别与情感判断,这道 Kaggle 赛题的难点却在于来源识别。模型需要从标题和正文中捕捉媒体写作风格、用词偏好与叙事差异,判断一篇新闻来自哪个媒体源,而不是判断新闻讲了什么。
这类任务很适合用来训练完整的文本分类实战能力。数据结构清晰,训练集需要合并,评估指标采用宏平均 F1,意味着长尾类别不能被忽略。放到真实业务中,这与内容平台的来源归因、媒体监测和信息溯源场景高度一致。
文章目录
赛题概述
本案例地址 Ukrainian News Classification。
这是一道典型的新闻文本分类任务,核心目标不是判断文章主题,而是依据标题与正文内容识别新闻来源,属于自然语言处理中的多分类问题。题目使用真实的乌克兰及国际媒体文章,具备明显的媒体风格识别与文本表征挑战,适合用于训练从数据清洗、文本特征建模到分类评估的完整流程能力。由于评测采用宏平均 F1,建模时不能只追求热门类别效果,还要关注各类别之间的识别均衡性,因此很适合作为文本分类、类别不平衡处理和业务可解释分析的实战入门项目。
| 模块名称 | 内容简介 | 所需技能 | 数据类型 | 应用场景 |
|---|---|---|---|---|
| 赛题背景 | 赛题属于基于真实新闻语料的来源识别任务,本质上是在文本内容中捕捉媒体机构的表达风格、选题偏好与叙事特征,而不是做通用情感分析或主题抽取。项目形态更接近标准监督学习建模,重点在于把非结构化新闻文本转成可用于分类决策的稳定特征。 | 问题抽象、文本理解、分类任务建模、特征表示设计、训练验证拆分、结果诊断与误差分析 | 新闻标题、新闻正文、来源标签,以及建模过程中衍生出的分词结果、向量表示和验证样本 | 媒体内容治理、新闻聚合平台的来源识别、内容分发策略、舆情监测、信息溯源与媒体风格分析 |
| 竞赛目标 | 参赛结果需要交付一套能够对未标注新闻文本自动判断来源的分类方案,输入是标题和正文,输出是来源类别。落地逻辑上,这类任务要求模型在不同媒体之间建立可泛化的区分能力,而不是记忆少量高频词。 | 文本预处理、特征工程、传统机器学习与深度学习方案选择、训练集整合、泛化能力验证、提交结果生成 | 结构化标签数据与非结构化长文本混合形态,包含训练子集、测试集和标准提交文件 | 内容审核辅助、媒体监控系统、新闻采编工具、自动标签体系建设、信息平台的数据治理 |
| 评价指标 | 评审采用宏平均 F1,关注每个来源类别的识别表现是否均衡,再对各类结果做平均。这意味着项目不能只优化样本量大的媒体来源,少数类别的召回率与精确率同样会直接影响总成绩,评价逻辑更贴近真实分类系统对整体稳定性的要求。 | 多分类评估理解、精确率与召回率平衡、类别不平衡处理、交叉验证设计、指标驱动调参与模型比较 | 预测标签、真实标签、分类混淆结果,以及验证阶段生成的各类别评估分数 | 多类别客服分流、文档归档、风险文本识别、舆情来源判断等需要兼顾各类表现的业务系统 |
| 业务意义 | 这类赛题在真实项目中对应的是把原始文本流转化为可运营、可检索、可监控的数据资产。对企业侧而言,可用于内容平台治理和信息来源管理;对研究与公共信息场景而言,可支持媒体生态分析、传播路径研究和异常来源识别,具备明确的数据产品化价值。 | 业务理解、模型与场景对齐、可解释分析、系统集成思维、效果验证、从竞赛方案过渡到生产规则的能力 | 持续流入的新闻文本、历史标注语料、业务规则、线上预测结果与人工复核反馈 | 新闻推荐与聚合、信息安全与舆情分析、公共传播研究、媒体数据库建设、行业智能内容工具 |
数据详解
本赛题的数据组织方式相对直接,核心信息围绕"新闻文本分类"展开,任务目标不是判断新闻主题,也不是做情感分析,而是根据新闻标题与正文内容识别文章来源。这一点决定了数据理解的重点应放在文本内容与标签定义之间的关系上,也就是不同媒体在措辞、叙事方式、篇章结构和选题表达上的差异。数据集文件划分清晰,训练集被拆成两个子文件,需要合并后才能形成完整训练数据,测试集则去除了目标列,符合标准监督学习竞赛的输入输出形式。评价方式采用宏平均 F1,这意味着不能只关注整体准确率,更要关注各个来源类别上的均衡表现,尤其是在类别分布可能不均衡的情况下,少数类的识别质量会直接影响最终成绩。阅读这类竞赛字段时,真正值得关注的是任务定义、标签含义、评估指标、数据文件结构、提交格式、数据体量和参赛约束;至于论坛、组织标识、内部开关、平台控制项等信息,对建模方案设计和实验落地帮助有限,属于典型的平台元数据。
| 字段名称 | 类型/范围 | 描述信息 |
|---|---|---|
| competition_title | 字符串 | 赛题名称为 Ukrainian News Classification,直接表明任务属于乌克兰语新闻分类场景,适合从自然语言处理中的文本分类角度切入。 |
| competition_subtitle | 字符串 | 副标题说明这是一个"乌克兰语文本分类基准任务",意味着数据更偏向标准化 benchmark,重点在于比较模型在同一任务定义下的分类能力。 |
| overview | Markdown 长文本 | 比赛简介明确给出任务目标:根据真实新闻文章内容判断新闻来源。这个定义决定了标签并非主题类别,而是媒体来源类别,建模时更需要捕捉媒体风格特征而非单纯主题词。 |
| tags | JSON 数组 | 当前标签突出 Macro F-Score,说明平台对该赛题的识别重点在于评价方式,而不是特定行业场景标签。阅读时可据此判断该任务更强调分类结果的类别均衡性。 |
| evaluation_algorithm_name | 字符串 | 评价指标为 F-Score (Macro),属于多分类任务中常见的宏平均 F1。这个信息直接影响验证集构造、模型选择和阈值策略。 |
| evaluation_algorithm_description | 字符串 | 指标说明强调宏平均计算方式,即每个类别单独计算 F1 后再平均。对来源识别这类多类别任务而言,这比单纯准确率更能反映模型是否偏向头部类别。 |
| evaluation_algorithm_is_max | 布尔值 | 指标为"越大越好",虽然是常规设定,但在自动化实验、超参数搜索和模型对比时,这个方向信息是必要前提。 |
| enabled_date | 时间 | 比赛开放时间可用于判断赛题所处年代背景。对文本任务而言,时间背景可能影响可参考的主流方法,例如传统 TF-IDF 与深度预训练模型的适用对比。 |
| deadline_date | 时间 | 截止时间设置较长,说明这类社区赛更像长期开放的练习基准。对学习者而言,价值不在竞赛冲榜,而在于将其作为完整文本分类项目进行复现与方法验证。 |
| max_daily_submissions | 整数 | 每日最多提交 20 次,说明允许较高频率试验,但仍不适合依赖排行榜盲调,合理的本地验证策略依旧是核心。 |
| num_scored_submissions | 整数 | 计分提交次数也是 20 次,表明日常实验提交空间充足,适合比较多种特征工程、线性模型和预训练模型方案。 |
| max_team_size | 整数 | 最大组队人数为 20,反映协作限制较宽松。对个人学习者影响不大,但说明赛题并未通过严苛团队规则限制实验形式。 |
| reward_quantity | 字符串/空值 | 奖金字段为空,表明这不是以奖金驱动的商业型竞赛,更适合作为练手项目、作品集案例或文本分类方法对比实验。 |
| num_prizes | 整数 | 奖项数量为 1,但结合无明确奖金信息可知,奖项并非本赛题核心关注点,实际价值主要体现在任务本身的训练意义。 |
| dataset_description | Markdown 长文本 | 数据集说明给出了文件结构和字段定义,是理解输入输出最关键的信息来源。相比平台管理属性,这部分直接决定数据读取、合并、预处理和标签建模方式。 |
| train_small.csv | 数据文件 | 小规模训练子集,适合快速跑通特征工程、分词、基线模型与提交流程,也适合在资源有限环境下进行原型验证。 |
| train_large.csv | 数据文件 | 较大规模训练子集,需要与 train_small.csv 合并形成完整训练集。这个设计提醒建模阶段必须先检查样本拼接与去重逻辑。 |
| test_without_target.csv | 数据文件 | 测试集不含目标标签,符合竞赛预测场景。所有线上提交结果都基于该文件生成,因此训练阶段必须自行划分验证集评估泛化能力。 |
| sample_submission.csv | 数据文件 | 示例提交文件给出了最终输出格式,能避免提交字段命名错误或编码格式错误,属于上线前必须核对的工程细节。 |
| title | 字段名,字符串 | 新闻标题字段,通常包含高密度语义信息。对于新闻来源识别,标题中的用词风格、标点习惯和媒体惯用表达可能具有较强区分度。 |
| text | 字段名,字符串 | 新闻正文主文本,是建模最核心的输入特征来源。正文长度、措辞分布、句式结构和叙述方式都可能携带媒体来源特征。 |
| source | 字段名,类别标签 | 目标标签字段,表示新闻文章来源。这个字段定义了整个监督学习任务的预测对象,也决定了问题本质是多分类而非排序或回归。 |
| submission_format | 结构化说明 | 提交文件只需要 Id 和 Predicted 两列,说明预测输出是单标签分类结果,不需要概率分布或多标签结果。 |
| total_compressed_bytes | 整数 | 压缩后数据约 100 MB,说明数据体量不算极小,已经足够支撑常规文本特征工程与中等规模模型实验。 |
| total_uncompressed_bytes | 整数 | 解压后约 334 MB,提示正文文本长度和总体样本量具备一定规模,读取方式、内存占用和预处理效率需要纳入工程考虑。 |
| total_teams / total_competitors / total_submissions | 整数 | 参赛规模分别为 10 个队伍、10 名参赛者、94 次提交,说明这是一个相对小众的社区赛。排行榜参考价值有限,更应重视任务本身的数据理解和本地验证质量。 |
| license_name | 字符串 | 数据使用受比赛规则约束,意味着即便是练习项目,也需要注意数据合规边界,尤其是在二次分发和公开展示数据样本时。 |
| 平台元数据(合并项) | 多种类型 | 包括论坛 ID、组织 ID、内部控制开关、是否支持 Notebook、排行榜显示比例、模型附件校验等。这类信息对 Kaggle 平台运行有用,但对理解任务、设计特征、选择模型帮助很小,可在阅读赛题时降级处理。 |
解题思路
这道题表面上是新闻来源识别,本质上属于典型的单标签文本分类任务,但数据形态又具备明显的"多路线可建模"特征:文本同时包含标题与正文,新闻来源之间既可能存在稳定的写作风格差异,也可能存在词汇偏好、句式结构、栏目主题和媒体口径上的系统性差别。这意味着问题既可以被当作基于词频统计的高维稀疏分类任务来处理,也可以被当作语义表征任务交给词向量、卷积网络、循环网络或 Transformer 预训练模型来建模。Macro F1 作为评估指标,又进一步放大了少数类识别质量的重要性,因此仅追求整体准确率并不够,建模时需要兼顾类别均衡、特征覆盖和决策边界稳定性。对于实践层面,这类题很适合采用分层推进策略:用可解释、训练快的统计模型建立稳健基线,再逐步引入语义表示和深度模型,最终用融合方式吸收不同路线的互补信息。
| 方法标题 | 案例适配度 | 方法说明 | 操作流程 | 优点 | 缺点 |
|---|---|---|---|---|---|
| 基于标题与正文的规则统计特征分类方案 | 60% | 将任务视为"媒体写作风格识别",不直接依赖复杂语义,而是提取标题长度、正文长度、标点分布、数字占比、大写词比例、特殊符号频率、标题与正文词汇重合度等统计特征,再配合朴素贝叶斯、逻辑回归或树模型完成分类。适合用来验证新闻来源是否存在明显格式化差异。 | 合并训练集;清洗缺失与异常文本;从 title 和 text 中构造长度、符号、字符级和词级统计特征;做标准化或离散化;训练轻量分类器;用交叉验证观察各类别 F1。 | 可解释性强,能快速识别媒体风格差异是否显著;对算力要求低,适合作为初学者理解文本分类"非语义信号"的入口;若不同新闻源存在固定排版或标题风格,往往能拿到可用基线。 | 对正文语义利用不足,难以捕捉来源之间更隐蔽的内容差异;面对写作风格相近的媒体时区分能力有限;Macro F1 下少数类若缺少明显格式特征,表现容易偏弱。 |
| TF-IDF + 线性分类器基线方案 | 92% | 将标题和正文转化为词级或字词混合的 TF-IDF 稀疏向量,再使用 Logistic Regression、Linear SVM 或 SGDClassifier 建模。这是新闻文本分类中最经典也最稳健的路线,特别适合中等规模文本数据。 | 合并 train_small 与 train_large;对标题和正文拼接或分别建向量;构造 word n-gram 与 char n-gram TF-IDF;按类别分层交叉验证;训练线性模型并调节正则化强度与类别权重;输出最优模型预测。 | 对新闻来源识别高度适配,能够有效捕捉媒体常用词、栏目表达和固定搭配;训练速度快,调参成本低,通常能形成强基线;线性模型对高维稀疏特征表现稳定,适合 Macro F1 优化。 | 语义泛化能力有限,遇到同义改写或未见表达时不如预训练模型;若文本很长且噪声较多,TF-IDF 维度会迅速膨胀;需要较细致地设计 n-gram 范围和最小词频阈值。 |
| 词向量聚合 + 传统分类器方案 | 72% | 先用预训练词向量或 FastText 将词映射到稠密向量,再通过平均池化、加权池化或标题正文分开编码后拼接的方式形成文本表示,交给 XGBoost、逻辑回归或 SVM 分类。该路线介于传统机器学习与深度学习之间,重点在于获得比 TF-IDF 更紧凑的语义表示。 | 文本清洗与分词;加载乌克兰语或多语言词向量;分别对标题和正文做向量聚合;拼接统计特征;训练传统分类器;对类别不平衡加入权重或重采样;验证 Macro F1。 | 比纯词频模型更能处理近义词和语义相似表达;向量维度较低,训练分类器效率高;适合作为从传统方法过渡到深度学习的练习方案。 | 表示能力依赖分词质量和词向量覆盖率;平均池化会损失词序信息,对新闻来源这种风格与局部表述差异并存的任务不一定优于 TF-IDF;若缺少高质量乌克兰语词向量,效果可能不稳定。 |
| TextCNN 文本卷积分类方案 | 78% | 将文本看作词序列,通过卷积核提取局部关键词模式、短语搭配和标题风格特征,再进行池化分类。该方法适合捕捉新闻来源中稳定出现的局部表达模式,也比循环网络更易训练。 | 构建词表或子词表;将 title 与 text 拼接或双塔输入;初始化随机或预训练词向量;训练多卷积核 TextCNN;加入 dropout 与早停;基于验证集选择最优 epoch 与阈值策略。 | 对局部短语模式非常敏感,能学习"媒体口头禅"、固定引述结构和栏目化表达;训练速度通常快于 RNN;适合作为深度学习入门文本分类模型。 | 对长距离依赖和全文语义建模较弱;需要较稳定的分词和词表管理;在现代文本分类任务中,整体上常被更强的预训练模型压制。 |
| BiLSTM / GRU 序列建模方案 | 70% | 使用双向循环网络从前后文顺序中学习文本表示,重点利用句子级和段落级上下文关系,适合希望显式建模词序与上下文依赖的场景。对标题和正文可采用共享编码器或分开编码后融合。 | 清洗文本并分词;构建序列输入;加载词向量或随机初始化嵌入层;训练 BiLSTM 或 GRU 网络;加入 attention 或池化层生成文本向量;用验证集监控 Macro F1 并调节类别权重。 | 比纯统计模型更关注上下文顺序,对来源间的叙述习惯和句式风格有一定识别能力;有助于理解经典深度文本分类的完整流程;在样本量适中时比大型 Transformer 更节省资源。 | 训练耗时较长,长文本截断策略会显著影响效果;并行效率不高;在新闻分类这类任务中,若数据规模有限且预训练资源可用,往往难以超过 Transformer。 |
| 多语言 Transformer 预训练微调方案 | 95% | 使用 mBERT、XLM-R 或其他支持乌克兰语的预训练模型,对标题和正文进行端到端微调。该路线直接利用大规模语言知识,对词义、上下文、风格和跨媒体表达差异都有较强建模能力,是此类新闻分类任务的高适配方案。 | 选择支持乌克兰语的预训练模型;设计 title + text 拼接输入;控制最大序列长度并采用截断或分段策略;按分层交叉验证进行微调;结合类别权重、学习率调度和早停优化 Macro F1;生成测试预测。 | 通常能提供最强单模型表现,尤其适合正文较长、媒体风格差异不只体现在关键词上的情形;对少数类和语义近邻类别的区分能力更强;也更接近真实业务中的现代 NLP 落地方案。 | 算力和显存需求更高;长文本截断会带来信息损失,需要额外设计输入策略;数据规模不大时存在过拟合风险,调参复杂度明显高于传统方法。 |
| 多模型融合与类别校准方案 | 90% | 将 TF-IDF 线性模型、深度学习模型和预训练模型的输出进行加权融合,再结合验证集做类别概率校准或针对少数类的决策优化,目标不是依赖单一模型,而是利用不同建模视角的互补性提升 Macro F1。 | 分别训练稀疏特征模型与语义模型;保留各折验证集概率输出;做简单平均、加权平均或 stacking;检查各类别召回与精确率偏差;对易混类别进行概率校准;生成最终提交结果。 | 对 Macro F1 非常友好,因为不同模型对多数类、少数类和边界样本的判断往往互补;在比赛环境下常能稳定超过单模型;有助于形成完整的工业化建模思路。 | 前提是已有多种质量尚可的基础模型,实施成本较高;若基础模型同质化严重,融合收益有限;需要严格避免交叉验证泄漏,否则离线分数会虚高。 |
操作案例
基础流程样例
数据读取与任务适配
这类教学案例的关键不只是把文件读进来,更重要的是先判断任务定义与字段结构是否一致。当前竞赛页面给出的公开字段是 title、text 和 source,按页面描述更接近"新闻来源识别"的单标签分类;但文章中的操作案例需要体现多标签文本分类处理方式,因此更适合采用"将来源字段做多标签化编码"的通用建模框架来演示。这样的写法在真实项目中也有价值,因为很多内容识别场景都会从单一标签扩展到多主题、多来源、多属性并存的标签体系,基础代码如果一开始就按多标签接口组织,后续扩展成本会更低。
python
import os
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.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import f1_score, classification_report, roc_auc_score
DATA_DIR = "./data"
train_small_path = os.path.join(DATA_DIR, "train_small.csv")
train_large_path = os.path.join(DATA_DIR, "train_large.csv")
test_path = os.path.join(DATA_DIR, "test_without_target.csv")
train_small = pd.read_csv(train_small_path)
train_large = pd.read_csv(train_large_path)
test_df = pd.read_csv(test_path)
train_df = pd.concat([train_small, train_large], ignore_index=True).drop_duplicates()
print("train shape:", train_df.shape)
print("test shape:", test_df.shape)
print(train_df.head())
print(train_df.columns.tolist())
标签结构检查与多标签编码
文本分类建模前,标签结构必须先看清楚。即使当前数据表面上只有一个 source 字段,也需要确认类别数量、样本分布、是否存在极端稀有类,以及后续评估是否容易受到类别不平衡影响。教学场景里采用 MultiLabelBinarizer 将标签转为多热编码矩阵,这样既能满足多标签处理示例的要求,也能自然衔接 OneVsRestClassifier、概率输出和按列计算指标的流程。对于单标签数据,每条样本只对应一个标签集合,依然可以复用同一套多标签代码。
python
# 基础字段检查
print(train_df[["title", "text", "source"]].isnull().sum())
# 将单标签 source 包装成"标签集合",以适配多标签流程
train_df["labels"] = train_df["source"].astype(str).apply(lambda x: [x])
# 查看标签分布
label_counts = train_df["source"].value_counts()
print("类别数量:", label_counts.shape[0])
print(label_counts.head(20))
# 多标签二值化编码
mlb = MultiLabelBinarizer()
Y = mlb.fit_transform(train_df["labels"])
print("标签矩阵形状:", Y.shape)
print("标签名称示例:", mlb.classes_[:10])
# 每个标签对应的正样本数
label_support = pd.Series(Y.sum(axis=0), index=mlb.classes_).sort_values(ascending=False)
print(label_support.head(20))
文本预处理与特征拼接
新闻文本任务通常不适合过度清洗,特别是在媒体来源识别这类场景中,标点、专有名词、缩写形式、数字表达乃至标题风格都可能包含来源特征。基础版本只做轻量预处理,将标题和正文合并,并统一大小写、清理多余空白和链接。这样可以避免把有效信息过早删掉,也便于后续替换成更强的分词器、子词模型或预训练语言模型。
python
def clean_text(text: str) -> str:
text = str(text).lower()
text = re.sub(r"http\S+|www\S+", " ", text)
text = re.sub(r"\s+", " ", text)
return text.strip()
def build_text(df: pd.DataFrame) -> pd.Series:
title = df["title"].fillna("").astype(str)
text = df["text"].fillna("").astype(str)
merged = title + " [SEP] " + text
return merged.apply(clean_text)
X_text = build_text(train_df)
X_test_text = build_text(test_df)
print(X_text.head(3).tolist())
训练集验证集划分
验证集的设计直接决定离线评估是否可信。新闻来源识别往往会受到类别分布不均衡影响,若按普通随机方式切分,某些小类可能在验证集中几乎消失,导致指标波动很大。当前示例仍采用常见的随机切分方式,但保留统一随机种子,并在切分后再次检查标签覆盖情况。对于更严格的实战版本,可以进一步使用迭代分层切分,使多标签分布在训练集和验证集之间更加稳定。
python
X_train, X_valid, y_train, y_valid = train_test_split(
X_text,
Y,
test_size=0.2,
random_state=42
)
print("X_train size:", len(X_train))
print("X_valid size:", len(X_valid))
print("训练集标签覆盖数:", (y_train.sum(axis=0) > 0).sum())
print("验证集标签覆盖数:", (y_valid.sum(axis=0) > 0).sum())
基础建模
对于结构清晰、可解释性较强的文本分类入门案例,TF-IDF + OneVsRest + LogisticRegression 是非常典型且有效的起点。TF-IDF 用于把标题和正文转换为稀疏向量,OneVsRestClassifier 将多标签问题拆分为多个二分类器,逻辑回归则提供稳定的概率输出。这个组合在数据量不算极端大的文本项目中经常作为基线方案存在,因为训练速度快、调参成本低、结果具有可解释性,适合作为后续增强方案的参照标准。
python
model = Pipeline([
("tfidf", TfidfVectorizer(
max_features=50000,
ngram_range=(1, 2),
min_df=3,
max_df=0.95,
sublinear_tf=True
)),
("clf", OneVsRestClassifier(
LogisticRegression(
solver="liblinear",
max_iter=1000,
class_weight="balanced"
)
))
])
model.fit(X_train, y_train)
验证集预测与效果评估
多标签任务不能只看单一准确率,尤其在标签分布不均衡时,更需要结合阈值后的分类结果和概率输出后的排序质量来判断模型表现。当前示例给出两类评估方式:一类是基于预测标签的宏平均 F1 值,适合和竞赛指标逻辑对应;另一类是基于每个标签概率输出的宏平均 ROC AUC,适合观察模型在各标签上的区分能力。虽然该竞赛页面给出的核心指标是宏平均 F1,但在真实项目中,仅看 F1 往往不够,概率质量会直接影响阈值调优、召回控制和线上策略设计。
python
# 概率预测
y_valid_proba = model.predict_proba(X_valid)
# 基础阈值,教学示例先用 0.5
y_valid_pred = (y_valid_proba >= 0.5).astype(int)
# 如果某些样本没有任何标签被预测为 1,则回退到最高概率标签
row_sums = y_valid_pred.sum(axis=1)
for i in np.where(row_sums == 0)[0]:
best_col = np.argmax(y_valid_proba[i])
y_valid_pred[i, best_col] = 1
macro_f1 = f1_score(y_valid, y_valid_pred, average="macro", zero_division=0)
micro_f1 = f1_score(y_valid, y_valid_pred, average="micro", zero_division=0)
print("Macro F1:", round(macro_f1, 5))
print("Micro F1:", round(micro_f1, 5))
# 按列计算 ROC AUC,仅对验证集中同时存在正负样本的标签计算
auc_scores = []
auc_labels = []
for i, label_name in enumerate(mlb.classes_):
y_true_col = y_valid[:, i]
y_proba_col = y_valid_proba[:, i]
if len(np.unique(y_true_col)) < 2:
continue
auc = roc_auc_score(y_true_col, y_proba_col)
auc_scores.append(auc)
auc_labels.append(label_name)
auc_df = pd.DataFrame({
"label": auc_labels,
"roc_auc": auc_scores
}).sort_values("roc_auc", ascending=False)
print("Macro ROC AUC:", round(np.mean(auc_scores), 5))
print(auc_df.head(10))
print(auc_df.tail(10))
测试集预测与提交结果生成
完成基础验证后,就可以将同一套流程应用到测试集并生成提交文件。对于教学文章来说,提交文件部分不只是导出 CSV,更重要的是把模型输出重新映射回业务可读的标签形式。当前示例仍采用多标签格式做推理,但考虑到该竞赛原始提交格式更接近单标签结果,因此提交阶段将每条样本的最高概率标签作为最终预测值输出。这种处理方式与竞赛要求保持一致,也能体现"训练框架可以多标签化,交付结果按业务规则收口"的实践思路。
python
# 对测试集做概率预测
y_test_proba = model.predict_proba(X_test_text)
# 竞赛提交通常需要单个来源标签,取最高概率类别
best_idx = np.argmax(y_test_proba, axis=1)
test_pred_labels = mlb.classes_[best_idx]
submission = pd.DataFrame({
"Id": np.arange(1, len(test_df) + 1),
"Predicted": test_pred_labels
})
print(submission.head())
submission.to_csv("submission.csv", index=False)
print("submission.csv saved.")
扩展流程概述
基础版本的价值在于把任务闭环完整跑通,并建立一个可复现、可评估、可提交的文本分类起点。真正进入竞赛增强版或业务实战版后,重点不再是单一模型能否直接提升一点分数,而是围绕数据质量、标签定义、验证方案、文本表示能力和推理策略做系统优化。新闻来源识别这类任务对文本风格非常敏感,标题、正文、专有名词、语法习惯、媒体固定表达都会形成来源特征,因此增强版通常会同时改造特征工程和验证机制。一方面需要处理类别不平衡、标签覆盖不完整、重复样本和潜在泄漏问题,另一方面也要从传统稀疏向量逐步升级到词向量、预训练语言模型和模型融合方案。离线评估阶段除了观察宏平均 F1,还需要检查不同类别的召回差异、阈值敏感性和概率校准效果,这些内容在真实内容审核、媒体识别、舆情归因和多标签内容分发场景里都直接影响上线可用性。
| 扩展流程 | 流程说明 | 流程目标 |
|---|---|---|
| 迭代分层验证 | 将普通随机切分升级为更适合多标签任务的迭代分层划分,减少训练集与验证集标签分布偏移 | 提升离线评估稳定性 |
| 文本清洗增强 | 增加语言特征保留策略,按乌克兰语文本特点处理标点、缩写、数字、专名和重复噪声 | 提高特征质量 |
| 标题与正文分路建模 | 对 title 与 text 分别建模,再进行特征拼接或加权融合 |
强化短文本与长文本信息利用 |
| TF-IDF 参数搜索 | 系统调整 ngram_range、min_df、max_df、max_features 等参数 |
优化稀疏文本基线表现 |
| 阈值优化 | 不再统一使用 0.5,而是为每个标签单独寻找更优阈值 | 提升宏平均 F1 |
| 类别不平衡处理 | 结合类别权重、重采样或损失重加权方式缓解长尾标签问题 | 改善小类召回率 |
| 更强线性模型 | 试验 LinearSVC、SGDClassifier、RidgeClassifier 等文本场景常用模型 | 获得更强基线或更快训练速度 |
| 概率校准 | 对多标签输出概率进行校准,改善概率分布的可解释性和阈值可控性 | 提升决策稳定性 |
| 预训练语言模型 | 引入 BERT、XLM-R、mBERT 等适合多语言场景的模型进行微调 | 提升语义理解能力 |
| 模型融合 | 组合线性模型与 Transformer 模型,融合不同特征视角的预测结果 | 提升整体泛化能力 |
| 误差分析闭环 | 针对混淆严重的来源类别做样本回看、错分归因和规则修正 | 找到最有效的优化方向 |
| 提交策略优化 | 对不同模型输出做加权平均、排序融合或按类别自适应决策 | 进一步提升竞赛成绩与实战稳健性 |
优秀案例解析
围绕这类"按新闻内容识别来源"的乌克兰语文本分类赛题,真正值得参考的公开案例并不在于是否堆叠了更复杂的模型,而在于是否完整覆盖了文本分类项目在实战中的关键闭环:语料清洗是否考虑媒体文本的噪声与重复,训练验证是否避免同源样本泄漏,指标设计是否兼顾类别不均衡,推理链路是否具备可复用与可部署性。结合公开检索结果可以看到,该竞赛本身公开沉淀的高质量 Notebook 与系统性复盘并不多,且比赛页面显示仍长期开放,更接近社区基准任务而非已有完整获奖方案沉淀的封闭竞赛。因此,这一节将案例分为两类:一类是赛中可见的公开项目样例与竞赛资源入口,用于把握题目原型和可实施路线;另一类是新闻分类、低资源语言建模、假新闻识别与乌克兰语 NLP 生态中的标杆案例,用于补足"高质量提交"在真实业务中通常需要的技术深度。这些案例的共同价值在于,它们不仅回答"用什么模型",更回答"为什么这样切分数据、怎样处理语言特性、如何让结果在媒体监测、信息可信度治理、数字包容和安全场景中真正可落地"。
| 创建时间 | 作者 | 案例解析 |
|---|---|---|
| 2021-04 | Kaggle 竞赛页面 / 社区公开资源 | Ukrainian News Classification Code 入口 关键词:竞赛样例、Notebook 入口、文本分类基线、Macro F1、可复现实验。该入口汇总了本赛题公开可见的代码资产,是识别赛中公开项目样例的起点。虽然未形成大规模成熟方案库,但对于建立原型仍有直接价值:可观察参赛者通常采用的文本向量化、传统分类器或 Transformer 微调路线,理解提交格式、验证口径与特征工程习惯。对本赛题最有参考意义的不是单个分数,而是从这些样例中抽取一套最小可运行闭环,包括标题与正文拼接、标签编码、本地 Macro F1 验证和提交管线。 |
| 2021-04 | Kaggle 竞赛主办页 | Ukrainian News Classification Competition 关键词:任务定义、媒体来源识别、类别不均衡、评估口径、原始数据结构。虽然属于官方任务页而非单独案例,但对"优秀方案"的判断标准有直接约束意义。题面明确要求依据文章标题与正文识别新闻来源,评价指标采用宏平均 F1,这意味着方案不能只追求头部来源类别的准确率,而要兼顾小类召回。对于现实业务,这与媒体监测、内容来源归因、舆情渠道识别高度一致,尤其适用于来源众多且分布不均的数据环境。参考价值在于帮助建立正确的验证目标,避免在业务中只优化总体准确率而忽视长尾来源识别能力。 |
| 2022-05 | Lang-UK 团队 | Ukrainian Language Processing Toolkit (lang-uk) 关键词:乌克兰语处理、分词归一化、语言资源、规则处理、低资源语言。该项目并非 Kaggle 参赛方案,但在乌克兰语文本建模中具有明显生态标杆意义。新闻来源识别看似是普通分类任务,实际很容易受到语言形态变化、专有名词变体、标点与编码问题影响。lang-uk 提供的语言工具和处理资源适合作为文本清洗与规范化前置层,帮助降低噪声并提升传统机器学习与深度模型的输入质量。对本赛题的借鉴点在于,低资源语言往往不能完全照搬英文任务流程,语言特性处理本身就是性能与稳定性的组成部分。 |
| 2023-01 | Ukrainian NLP 社区 / UkraNLP | [Ukrainian News Dataset and Baselines(无公开链接) 关键词:新闻分类、乌克兰语语料、基线体系、领域适配、数据治理。公开生态中可见若干乌克兰语新闻数据与分类基线项目分散存在,部分链接与页面已失效或未集中归档,但其思路具有代表性:通过构建领域语料、统一标签体系、比较 TF-IDF+线性模型与预训练语言模型的差异,验证乌克兰语新闻任务中"干净数据+稳健基线"常常比盲目追求复杂结构更有效。对本赛题的参考价值在于,来源识别本质上高度依赖写作风格、栏目偏好和实体分布,这类领域数据集基线能帮助判断当前误差究竟来自模型能力不足,还是来自数据标注与切分策略问题。 |
| 2020-09 | Hugging Face / community contributors | XLM-RoBERTa for Multilingual Text Classification 关键词:多语言预训练、迁移学习、低资源文本分类、微调、跨语言泛化。严格说这不是单一竞赛案例,而是该类任务最具可复用性的技术标杆之一。XLM-R 这类多语言预训练模型在乌克兰语新闻分类中往往比从零训练更现实,尤其适合训练样本有限、类别分布不均且正文较长的场景。其参考价值不只在分数,更在工程路径上:可以通过截断策略、标题正文双段拼接、类别加权损失与分层验证构建稳定原型。对于媒体内容分析、跨语种资讯治理和数字包容场景,这种方案具备直接迁移价值。 |
| 2022-10 | Fake.news / misinformation research community | Fake News Detection with Transformers: A Survey 关键词:可信内容识别、新闻文本、Transformer、特征融合、风险治理。该方向综述与公开实现并不直接等同于"来源分类",但两者在业务链路上高度相邻:都依赖新闻文本的风格、语义线索和上下文表征。高质量来源识别方案往往可以扩展为媒体可信度评估、异常来源发现和内容风控前置模块。参考价值在于提示建模边界:若真实项目后续要进入安全与可信场景,仅做单纯分类通常不够,还需结合置信度校准、误判分析和可解释特征。这样的思路能帮助本赛题方案从比赛原型升级为风险治理组件。 |
| 2021-06 | scikit-learn 官方示例 / 社区实践 | Text Classification with Linear Models and Sparse Features 关键词:TF-IDF、线性分类器、稀疏特征、强基线、快速迭代。对于公开案例较少的小型社区竞赛,传统机器学习基线反而更值得保留。基于 TF-IDF 配合 Logistic Regression、Linear SVM 或朴素贝叶斯的路线,具备训练快、调参成本低、结果稳定和可解释性较强的优势。对本赛题的现实借鉴在于,新闻来源识别常带有鲜明词汇风格和机构特征,稀疏特征模型能够快速检验数据是否"可分"。在资源受限、需要离线部署或边缘环境推理时,这类方案也比大型 Transformer 更容易落地。 |
| 2023-07 | SetFit / Hugging Face 社区 | SetFit: Efficient Few-Shot Text Classification 关键词:小样本学习、轻量部署、句向量、低成本微调、实用原型。该案例适合作为生态标杆补充,尤其对应参赛数据规模有限、长尾来源样本不足的情况。SetFit 通过句向量与轻量分类头,在小样本条件下提供比全量 Transformer 微调更省资源的路径。对本赛题而言,其意义不只在竞赛分数,而在于现实项目经常面临新增媒体来源、样本标注不足、部署预算有限等问题。将其作为补充路线,可以在不显著增加训练成本的前提下提升新来源扩展能力,适合媒体监测、教育信息聚合和区域资讯平台等需要持续增量更新的业务。 |
总结
这道题的价值不只在于跑出一个可提交结果,更在于建立一套可迁移的方法框架。围绕标题与正文联合建模、类别分布检查、本地验证设计、误差分析与融合优化,可以把竞赛流程沉淀成面向生产环境的文本分类原型。
对于自学机器学习与自然语言处理的人群,这类赛题的训练意义很直接。既能从 TF IDF 与线性模型理解强基线为什么有效,也能进一步过渡到预训练语言模型、概率校准与多模型融合。真正重要的不是排行榜位置,而是能否把媒体来源识别问题拆解清楚,并做出稳定、可解释、可扩展的分类系统。