小样本图像分类实战 Cleaned vs Dirty V2 盘子清洁识别案例解析

Cleaned vs Dirty V2 是一道体量不大但很有代表性的计算机视觉竞赛,任务目标非常明确:根据盘子图像判断其属于已清洁还是脏污状态。训练集每类仅 20 张图片,测试集却有数百张样本,问题难点因此集中在小样本条件下的泛化能力,而不是常规的大规模图像训练流程。

这类题目很适合作为视觉项目入门案例来拆解,因为数据理解、验证设计、迁移学习、数据增强和提交落地几乎都能在一个轻量任务里完整呈现。表面上只是二分类,实际上已经覆盖了真实业务中常见的低标注场景,例如清洁巡检、外观质检和设备状态识别中的原型验证问题。

文章目录

赛题概述

本案例地址 Cleaned vs Dirty V2

这是一道典型的小样本图像分类练习题,核心任务是根据餐盘图像判断其处于干净还是脏污状态。训练集规模极小,每类仅 20 张图片,却需要对大量测试图片做出稳定判断,因此重点不在堆叠复杂模型,而在于围绕数据稀缺场景完成任务抽象、迁移学习、数据增强、验证设计与过拟合控制。这类题目与真实业务中的低标注视觉项目高度接近,适合用来训练从数据理解到模型落地的完整思路,也适合作为工业质检、清洁巡检、设备状态识别等场景的入门型视觉项目模板。

模块名称 内容简介 所需技能 数据类型 应用场景
赛题背景 赛题属于面向现实感知任务的二分类视觉问题,表面上是识别餐盘是否清洁,本质上是在极少标注样本条件下完成状态判别。场景约束非常明确:训练数据有限、类别定义直观、测试规模更大,重点考察如何把有限样本转化为可泛化的分类能力,而不是单纯依赖大规模数据刷分。 问题抽象、小样本学习思维、数据分布判断、图像预处理策略设计、迁移学习与泛化分析 餐盘图像、二分类标签、自建验证划分、增强后的训练样本 清洁状态检测、工业外观质检、餐饮后厨巡检、设备表面污染识别
竞赛目标 需要交付的是一个能够对测试图像进行稳定分类的视觉识别方案,输出结果为每张图片对应的清洁或脏污标签。落地逻辑上,关键不只是训练出模型,还包括建立可复现的数据处理流程、合理的验证机制,以及在样本极少情况下仍能维持识别效果的技术路线。 迁移学习建模、数据增强、验证集构建、误差分析、基线搭建、推理流程组织 训练图片、测试图片、提交文件、模型预测结果、中间验证记录 低样本视觉分类原型、业务 PoC 验证、轻量级图像识别系统开发
评价指标 评审方式是标准分类准确率,关注预测标签与真实标签一致的比例。指标形式简单,但在该题中真正决定成绩的是验证方案是否可靠、模型是否过拟合、增强策略是否有效,以及对少量样本偏差的控制能力,因此属于"指标简单、建模细节决定上限"的任务。 指标理解、离线验证设计、模型选择、过拟合控制、实验对比与结果复盘 预测标签、真实标签、验证集结果、排行榜反馈数据 图像审核、状态识别、规则明确的自动分类任务
业务意义 这类赛题对应真实项目中非常常见的起步阶段:业务方只有少量已标注样本,却希望快速验证视觉识别是否可行。实践价值在于学习如何借助预训练模型和规范实验流程,把一个样本稀缺的小问题做成可验证的原型系统,为后续扩充数据、上线巡检模块或接入业务流程提供依据。 项目可行性验证、方案设计、工程整合、效果验证、原型化交付、部署思维 现场采集图像、历史样本、人工复核结果、业务规则标签 企业视觉试点项目、自动巡检辅助、清洁管理数字化、低成本 AI 质检探索

数据详解

这场竞赛的数据结构非常紧凑,核心信息几乎都围绕一个二分类视觉任务展开:根据盘子图像判断其状态属于"已清洁"还是"脏污"。从任务设计看,真正重要的不是平台展示层面的管理字段,而是少样本训练设定、数据文件组织方式、标签定义、评价指标以及训练与提交约束。训练集仅包含两类样本各 20 张,测试集则提供数百张未标注图片,这意味着建模重点不在复杂的数据工程,而在于如何在极小样本条件下提升泛化能力,例如迁移学习、数据增强、半监督学习和稳健验证策略。阅读这类结构化字段时,最值得关注的是能直接回答"任务是什么、数据长什么样、怎样算分、能否使用外部信息、提交需要什么格式"这几类问题;而诸如论坛 ID、组织 ID、平台内部开关、排行榜控制细节等字段,对建模本身帮助有限,更适合作为背景信息统一忽略或合并理解。

字段名称 类型/范围 描述信息
competition_title 字符串 比赛主标题为 Cleaned vs Dirty V2,直接点明任务对象是盘子图像的状态识别,属于典型的图像二分类问题。
competition_subtitle 字符串 副标题说明目标是判断盘子是否已经清洁,这比单看标题更明确地给出了预测目标,有助于快速建立标签语义。
category_level_1 / category_level_2 字符串 竞赛被归入"计算机视觉 / 图像分类",说明这是标准监督学习场景,方法选择应优先考虑卷积网络、迁移学习与图像增强,而不是检测、分割或表格建模方案。
tags JSON 数组 标签信息指向 分类准确率 这一评价思路,说明赛题追求的是最终分类是否正确,而不是排序、召回率或概率校准质量。
overview Markdown 长文本 概述中给出了任务背景、少样本设定和训练测试规模,是理解赛题难点的关键来源。尤其是"每类仅 20 张训练图像"的信息,决定了该题更接近小样本泛化能力测试,而不是常规大样本分类。
evaluation_algorithm_name 字符串 评价指标为 Categorization Accuracy,即分类准确率。该指标简单直接,意味着每张图片只有判对或判错两种结果,类别预测阈值与误差分析会比概率回归更重要。
evaluation_algorithm_description 字符串 指标描述为"正确分类样本占比",可以据此判断这是一个对整体正确率敏感的任务。如果类别分布接近均衡,准确率具有较好的可解释性;若分布失衡,则需要额外关注验证集划分是否合理。
enabled_date 时间 比赛开放时间可作为赛题发布时间参考。对技术阅读而言,这一字段主要用于判断案例方案是否带有较新的模型实践背景,而不是建模输入的一部分。
deadline_date 时间 截止时间显示该竞赛长期开放,更接近练习型或教学型赛题。这样的比赛通常适合做完整实验复盘,而不是只追求短期冲榜。
rules Markdown 长文本 规则明确限制训练只能使用官方训练数据,且不允许对测试集做人工标注。这一条直接影响特征来源和数据扩展边界,决定了外部数据迁移、伪标签和半监督方法是否合规。
reward_quantity / num_prizes 字符串 / 整数 奖励信息几乎为空,仅保留奖项数量字段,说明该竞赛更偏学习与实践场景,而非高奖金竞技型比赛。对读者而言,这有助于判断参与目标应放在方法验证与项目训练上。
max_team_size 整数 最大队伍人数为 1,表示这是个人赛形式。对实践层面意味着方案设计、实验管理和结果复现都需要单人独立完成,更适合作为个人项目作品。
total_teams / total_competitors / total_submissions 整数 参赛队伍 3449、提交 76879,说明题目具有较高参与度,公共解法和基线经验较丰富。对学习者而言,这类赛题通常更容易找到可参考的实现方案和误区总结。
dataset_description Markdown 长文本 数据集说明给出了文件结构和提交字段,是连接"原始图像数据"和"提交结果格式"的核心说明,直接决定数据读取与推理输出的实现方式。
dataset_url 字符串(URL) 数据下载地址是实际获取训练集、测试集和示例提交文件的入口,对动手实践是最直接的操作字段。
total_compressed_bytes / total_uncompressed_bytes 整数(字节) 数据总大小约 49 MB,说明这是一个体量较小、下载和实验成本都较低的视觉任务,适合快速迭代模型,不需要复杂的数据存储和分布式训练环境。
数据文件:plates.zip 压缩文件 主数据文件包含 train 与 test 两个目录,体现的是典型 Kaggle 图像分类组织方式。训练代码通常围绕目录遍历、标签映射和批量加载展开。
数据文件:sample_submission.csv CSV 文件 示例提交文件定义了最终提交格式,可避免预测结果字段名、样本顺序或标签写法出错,是上线提交前必须核对的文件。
训练集规模 整数范围 训练集中 cleaneddirty 各 20 张,总计 40 张,属于非常典型的极小样本场景。这个规模决定了从头训练深度模型几乎不可取,迁移学习与强增强更具现实价值。
测试集规模 文本描述 测试集为数百张图片,数量明显大于训练集,意味着排行榜成绩很大程度上考验模型在新样本上的泛化能力,而不是对训练集的记忆。
id 字符串 提交字段中的 id 对应测试图片文件名去掉扩展名后的标识,用于将预测结果与具体样本一一对齐,是生成提交文件时的主键。
label 枚举字符串 目标标签字段 label 只有两个可选值:dirtycleaned。这是整个建模任务的输出目标,也决定了损失函数、类别编码和推理后处理方式。
提交格式要求 结构化表格 提交内容本质是一个两列表格:样本标识加预测类别。对实践来说,这意味着模型再复杂,落地输出仍需回到标准化 CSV 结构,流程必须保证结果可批量映射与复现。
平台管理信息(合并) 多种类型 包括论坛 ID、组织 ID、内核开关、排行榜显示比例、团队模型控制等平台属性。这些字段对理解 Kaggle 运行机制有辅助作用,但对数据理解、模型设计和规则边界的影响较弱,阅读时可降级处理。

解题思路

这道题表面上是一个"干净盘子 / 脏盘子"的二分类任务,实际上很适合把多条建模路线放在同一实验框架下并行比较。原因在于数据规模极小,训练集每类只有 20 张图像,单一方案很容易受到样本偶然性影响,模型表现更多取决于特征提取能力、先验知识利用方式、验证划分是否稳健,以及对过拟合的控制水平。在这种设定下,轻量级统计特征和传统机器学习方法能够快速建立可解释基线,迁移学习可以借助外部视觉先验弥补样本不足,半监督与融合策略则适合进一步挖掘测试分布信息并提高稳定性。虽然常见方法分层通常会被概括为"规则特征、传统模型、深度学习、预训练模型、融合优化",但在这道竞赛里更值得关注的是每条路线解决问题的方式是否匹配少样本、高泛化压力、准确率评价这几个核心约束,而不是单纯追求模型复杂度。

方法标题 案例适配度 方法说明 操作流程 优点 缺点
基于颜色与纹理统计特征的规则化基线 68% 将盘子是否干净转化为图像表面残留痕迹、污渍分布、亮度均匀性、边缘杂质等可量化特征,再用简单阈值或浅层分类器完成判别。这条路线本质上是把视觉任务压缩为结构化特征建模,适合作为业务原型和可解释基线。 统一图像尺寸与颜色空间;提取亮度、饱和度、局部方差、纹理能量、边缘密度等特征;构造特征表;使用逻辑回归或人工规则判别;在交叉验证中校准阈值。 对极小样本较友好,训练成本极低,结果可解释性强,便于快速验证"污渍是否真的对应明显视觉统计差异"。在真实质检项目早期,这类方案也常用于建立最低可用版本。 泛化能力受限,如果测试图像存在光照变化、拍摄角度变化或盘子材质差异,手工特征很容易失效。面对复杂污渍形态时,上限通常不高。
手工视觉特征加传统机器学习分类器 74% 在规则特征之外,进一步引入 HOG、LBP、颜色直方图、灰度共生矩阵等经典视觉描述子,再交给 SVM、随机森林或梯度提升树进行分类。这条路线比纯规则方法更系统,仍然保持较低训练门槛。 完成图像预处理;抽取多类手工视觉特征并拼接;做标准化与降维;使用 SVM 或树模型训练;通过分层交叉验证选择参数;输出二分类结果。 在少样本条件下通常比从头训练深度网络更稳,适合学习"特征工程 + 分类器"这一经典图像建模流程。对于背景稳定、拍摄规范的数据,往往能得到不错的准确率。 特征表达能力仍有限,难以自动学习"脏污"的高级视觉模式。特征组合与参数调试较繁琐,一旦场景变化,迁移性不如深度学习方案。
预训练卷积网络迁移学习 92% 使用 ImageNet 预训练的 ResNet、EfficientNet、MobileNet 等模型,把大规模通用视觉知识迁移到盘子状态识别任务上,只微调后部层或分类头。这是该题最主流、也最符合少样本图像分类特点的路线。 加载预训练模型;冻结大部分骨干网络,仅训练分类头;配合旋转、裁剪、翻转、颜色扰动等增强;采用小学习率逐步解冻;通过多折验证挑选最稳配置;生成测试预测。 与赛题匹配度高,能够在极少样本上借助预训练特征获得强泛化能力。实现门槛适中,公开案例丰富,适合作为主力方案。 如果验证设计不稳,极易被少量样本"误导"而出现虚高分数。模型容量较大时仍可能过拟合,对增强策略与训练细节比较敏感。
度量学习或孪生网络的小样本识别 88% 不直接学习固定分类边界,而是学习"干净盘子"和"脏盘子"在特征空间中的距离关系。通过孪生网络、三元组损失或原型网络,让同类图片更接近、异类图片更分离,属于典型的小样本学习思路。 构造图像对或三元组样本;基于预训练骨干提取嵌入表示;用对比损失或三元组损失训练;在验证集上建立原型或最近邻分类规则;对测试图像按距离完成判别。 直接针对"小样本"难点设计,比普通分类头更强调类间可分性。在训练样本极少时,常比硬分类方案更稳,尤其适合后续扩展到新增类别的业务场景。 样本对构造、损失设计和训练稳定性要求更高,初学阶段不如迁移学习分类头直观。若数据噪声较大,距离学习容易出现不稳定。
半监督学习结合伪标签迭代 90% 利用训练集标签很少、测试集样本较多的特点,先训练一个初始模型,再对高置信度测试样本打伪标签,回流到训练集中继续迭代。这条路线适合在规则允许范围内挖掘未标注数据分布。 先用预训练卷积网络训练初始模型;对测试集推理并筛选高置信度样本;将伪标签样本加入训练集;继续微调模型;重复迭代并监控交叉验证稳定性;输出最终预测。 赛题明确是少样本场景,而测试集数量远大于训练集,半监督方法能够有效利用未标注数据,往往比单纯监督学习更有提升空间。公开优秀案例中也已有类似方向。 伪标签错误会被不断放大,早期模型若偏差较大,后续训练可能被带偏。需要严格控制置信度门槛和迭代节奏,否则容易出现"自我强化式误判"。
轻量级卷积网络从头训练加重增强 61% 不依赖大规模预训练权重,而是使用较小 CNN 结构配合强数据增强、正则化和交叉验证直接学习分类器。这条路线更像教学实验,用于观察纯数据驱动方法在极小样本上的局限。 设计小型 CNN;对训练图像做强增强;加入 Dropout、权重衰减和早停;多次随机划分训练与验证;选择最稳定的模型用于测试预测。 能完整理解卷积网络如何从原始像素学习特征,实验过程清晰,适合做"是否必须依赖迁移学习"的对照研究。模型规模小,训练速度快。 该题训练样本过少,从头训练通常难以学到稳健特征,成绩大多不如预训练方案。即使增强很强,也很难弥补视觉先验的缺失。
多模型融合加阈值校准 95% 将手工特征模型、迁移学习模型、半监督模型等不同路线的预测结果做平均、加权或投票融合,再结合验证集对分类阈值进行校准。这条路线适合冲击更高准确率,也更接近实际生产中的稳健建模方式。 分别训练多条异构模型;收集验证集概率输出;比较简单平均、加权平均与投票策略;根据验证结果微调判定阈值;对测试集进行融合预测并生成提交文件。 准确率指标只关心判对比例,融合往往能减少单模型偶然失误。对于这类小样本任务,异构模型之间的误差互补价值通常较高,冲榜效果明显。 实验管理复杂度明显增加,需要保证各模型验证过程可比,否则融合可能只是叠加噪声。若基模型差异不够大,收益有限。

操作案例

基础流程样例

样本读取与任务重构

这份竞赛原始设定本质上是盘子图像的二分类任务,但教学文章中的基础流程需要体现结构化文本建模与多标签分类的常见做法,因此更适合先基于竞赛提供的结构化字段重构一个"赛题文本标签识别"样例。该样例并不替代原始图像任务,而是将 competition_titlecompetition_subtitleoverviewrulesdataset_description 等文本字段拼接成训练语料,再从分类字段中派生多个标签列,例如是否属于计算机视觉、是否属于图像分类、是否采用准确率评价。这样可以完整展示从读取结构化数据、构造多标签目标、文本向量化到多标签预测评估的流程,适合作为教学中的入门版模板。

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

# 为了演示多标签文本分类流程,这里构造一个最小可运行样本集
# 样本字段来自竞赛结构化信息的语义重组,而不是简单字段翻译
samples = [
    {
        "competition_title": "Cleaned vs Dirty V2",
        "competition_subtitle": "Classify if a plate is cleaned or dirty",
        "overview": "Few shot learning competition with 20 clean and 20 dirty plates in train and hundreds in test. Train a classifier to detect whether a plate is cleaned or dirty.",
        "rules": "Only training data can be used. Test data annotation is not allowed.",
        "dataset_description": "plates.zip contains train and test folders. sample_submission.csv contains id and label fields.",
        "category_level_1": "计算机视觉",
        "category_level_2": "图像分类",
        "evaluation_algorithm_name": "Categorization Accuracy"
    },
    {
        "competition_title": "Leaf Disease Recognition",
        "competition_subtitle": "Identify crop disease from leaf photos",
        "overview": "Image recognition task for crop leaves under several disease categories with image labels.",
        "rules": "External data is not allowed.",
        "dataset_description": "Train folder contains disease classes and validation images.",
        "category_level_1": "计算机视觉",
        "category_level_2": "图像分类",
        "evaluation_algorithm_name": "Accuracy"
    },
    {
        "competition_title": "Movie Genre Tagging",
        "competition_subtitle": "Predict multiple genres from movie plot",
        "overview": "Multi label text classification on movie descriptions.",
        "rules": "Use only provided text fields.",
        "dataset_description": "CSV file contains plot and multiple genre columns.",
        "category_level_1": "自然语言处理",
        "category_level_2": "文本分类",
        "evaluation_algorithm_name": "ROC AUC"
    },
    {
        "competition_title": "Defect Report Routing",
        "competition_subtitle": "Assign issue tickets to multiple teams",
        "overview": "Enterprise ticket text may belong to several support groups at once.",
        "rules": "No manual relabeling on test set.",
        "dataset_description": "Tabular CSV with issue title, issue body and multi label targets.",
        "category_level_1": "自然语言处理",
        "category_level_2": "多标签文本分类",
        "evaluation_algorithm_name": "ROC AUC"
    },
    {
        "competition_title": "X-ray Condition Screening",
        "competition_subtitle": "Detect findings from radiology text reports",
        "overview": "Clinical report classification with multiple findings per report.",
        "rules": "Patient identity fields cannot be used.",
        "dataset_description": "Reports with several diagnosis labels.",
        "category_level_1": "医疗AI",
        "category_level_2": "多标签文本分类",
        "evaluation_algorithm_name": "ROC AUC"
    },
    {
        "competition_title": "Support Email Categorization",
        "competition_subtitle": "Predict complaint type from message content",
        "overview": "Customer support emails can trigger multiple resolution tags.",
        "rules": "Use only training set messages.",
        "dataset_description": "CSV with subject, body and multi target columns.",
        "category_level_1": "自然语言处理",
        "category_level_2": "多标签文本分类",
        "evaluation_algorithm_name": "F1 Score"
    }
]

df = pd.DataFrame(samples)

# 拼接文本字段作为模型输入
text_cols = [
    "competition_title",
    "competition_subtitle",
    "overview",
    "rules",
    "dataset_description"
]
df["text"] = df[text_cols].fillna("").agg(" ".join, axis=1)

# 构造多标签目标
df["label_cv"] = (df["category_level_1"] == "计算机视觉").astype(int)
df["label_img_cls"] = (df["category_level_2"] == "图像分类").astype(int)
df["label_multi_text"] = (df["category_level_2"] == "多标签文本分类").astype(int)
df["label_auc"] = (df["evaluation_algorithm_name"].str.upper().str.contains("AUC")).astype(int)

target_cols = ["label_cv", "label_img_cls", "label_multi_text", "label_auc"]

print("数据集形状:", df.shape)
print(df[["competition_title", "category_level_1", "category_level_2"] + target_cols])

查看标签结构与多标签分布

多标签任务与单标签分类的差异不在输入形式,而在输出空间结构。同一条文本记录可能同时具备多个标签,因此仅查看单列类别计数并不足够,还需要观察每个标签列的正样本数量、标签组合分布,以及是否存在极端稀疏标签。这样的检查决定了后续是否适合使用 One-vs-Rest 方案、是否需要重采样,以及评估阶段是否必须按列观察模型表现。

python 复制代码
# 查看标签矩阵
y = df[target_cols].copy()

print("标签矩阵:")
print(y)

print("\n各标签正样本数量:")
print(y.sum(axis=0))

# 查看每条样本包含多少个标签
df["label_count"] = y.sum(axis=1)
print("\n每条样本的标签个数分布:")
print(df["label_count"].value_counts().sort_index())

# 查看标签组合
combo_stats = y.astype(str).agg("-".join, axis=1).value_counts()
print("\n标签组合分布:")
print(combo_stats)

文本预处理与特征表示

文本建模阶段的关键不在复杂清洗,而在保证输入稳定、可复现且不过度损伤语义。对于标题、副标题、规则说明、数据说明这类竞赛文本,适度完成小写化、去除多余符号、压缩空白通常已经足够,再配合 TF-IDF 构造稀疏向量即可形成一个清晰可靠的教学基线。这样的处理方式在原型验证、规则分类、工单识别、项目标签预测等业务中也非常常见。

python 复制代码
import re

def clean_text(text: str) -> str:
    text = str(text).lower()
    text = re.sub(r"<[^>]+>", " ", text)         # 去掉HTML标签
    text = re.sub(r"[^a-z0-9\u4e00-\u9fa5\s]", " ", text)
    text = re.sub(r"\s+", " ", text).strip()
    return text

df["text_clean"] = df["text"].apply(clean_text)

print("清洗后的文本示例:")
for i, t in enumerate(df["text_clean"].head(2), 1):
    print(f"\n样本{i}:\n{t}")

训练集与验证集划分

多标签数据切分时,理想状态应尽量保持各标签分布稳定。教学示例中可以使用常规随机切分完成最基本流程,但在真实项目和正式竞赛中,更推荐采用迭代分层抽样等多标签分层策略,以降低验证集标签偏移带来的误判风险。这里采用简洁可运行的方式完成划分,并保留随机种子,方便结果复现。

python 复制代码
from sklearn.model_selection import train_test_split

X = df["text_clean"]
Y = df[target_cols]

X_train, X_valid, y_train, y_valid = train_test_split(
    X, Y, test_size=0.33, random_state=42
)

print("训练集大小:", X_train.shape[0])
print("验证集大小:", X_valid.shape[0])
print("\n训练集标签分布:")
print(y_train.sum())
print("\n验证集标签分布:")
print(y_valid.sum())

基础多标签建模

对于入门级多标签文本分类任务,TfidfVectorizer + OneVsRestClassifier + LogisticRegression 是非常典型且足够稳健的起点。TF-IDF 负责把文本转换为词项权重特征,One-vs-Rest 负责将多标签问题拆成多个二分类器,逻辑回归则在稀疏文本场景中具有良好的速度与可解释性。该组合既适合教学展示,也适合许多企业内部文本路由、标签打标、工单分派的首版基线搭建。

python 复制代码
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import LogisticRegression

model = Pipeline([
    ("tfidf", TfidfVectorizer(
        max_features=3000,
        ngram_range=(1, 2),
        min_df=1
    )),
    ("clf", OneVsRestClassifier(
        LogisticRegression(max_iter=1000)
    ))
])

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

多标签预测与效果评估

多标签任务评估不能只看整体准确率,因为某一列标签效果较差时,平均指标可能掩盖问题。更合理的做法是同时输出按列的 ROC AUC、基于阈值的分类结果、微平均或宏平均 F1 值,并结合概率分数观察标签可分性。这里使用 predict_proba 生成每个标签的概率,再按列计算 ROC AUC,最后补充分类报告,形成一个相对完整的教学闭环。

python 复制代码
from sklearn.metrics import roc_auc_score, classification_report, f1_score

# 预测概率
y_valid_proba = model.predict_proba(X_valid)
y_valid_pred = (y_valid_proba >= 0.5).astype(int)

proba_df = pd.DataFrame(y_valid_proba, columns=target_cols, index=y_valid.index)
pred_df = pd.DataFrame(y_valid_pred, columns=target_cols, index=y_valid.index)

print("验证集预测概率:")
print(proba_df)

print("\n验证集预测标签:")
print(pred_df)

# 按列计算 ROC AUC
auc_result = {}
for col in target_cols:
    # ROC AUC 至少需要验证集中同时存在正负样本
    if y_valid[col].nunique() > 1:
        auc_result[col] = roc_auc_score(y_valid[col], proba_df[col])
    else:
        auc_result[col] = np.nan

auc_df = pd.DataFrame({
    "label": list(auc_result.keys()),
    "roc_auc": list(auc_result.values())
})

print("\n各标签 ROC AUC:")
print(auc_df)

# 计算整体 F1
micro_f1 = f1_score(y_valid, pred_df, average="micro", zero_division=0)
macro_f1 = f1_score(y_valid, pred_df, average="macro", zero_division=0)

print("\nMicro F1:", micro_f1)
print("Macro F1:", macro_f1)

# 输出分类报告
print("\n分类报告:")
print(classification_report(y_valid, pred_df, target_names=target_cols, zero_division=0))

新样本推理演示

完成训练与验证之后,还需要验证流程是否具备面向新文本样本的推理能力。教学文章中的这一步很重要,因为它直接体现模型输出如何进入业务环节。对于竞赛元信息文本,推理结果可以理解为对赛题类型、评价方式、任务属性的自动识别;迁移到真实项目时,同样的流程可以用于自动路由工单、识别文档主题、预测文章标签或判定业务请求类型。

python 复制代码
new_samples = pd.DataFrame({
    "text": [
        "Image competition for classifying product photos with accuracy metric and train test folders",
        "Multi label text classification on support tickets evaluated by roc auc"
    ]
})

new_samples["text_clean"] = new_samples["text"].apply(clean_text)

new_proba = model.predict_proba(new_samples["text_clean"])
new_pred = (new_proba >= 0.5).astype(int)

new_proba_df = pd.DataFrame(new_proba, columns=target_cols)
new_pred_df = pd.DataFrame(new_pred, columns=target_cols)

print("新样本概率预测:")
print(new_proba_df)

print("\n新样本标签预测:")
print(new_pred_df)

扩展流程概述

这个基础样例的重点在于把一条完整的多标签文本建模链路讲清楚,包括数据重构、标签矩阵理解、文本清洗、向量化建模、概率预测与按列评估。若继续升级到更接近竞赛和实战的版本,优化方向就不应停留在单一模型替换,而应回到任务本身重新审视数据来源、标签定义与验证策略。在结构化竞赛文本场景中,可以把更多字段纳入特征工程,构造标题与正文的分通道表示,引入字符级和词级特征融合,并采用更稳健的多标签分层交叉验证降低小样本波动。若切回这道 Kaggle 竞赛原始问题,还可以进一步转向图像侧的迁移学习、数据增强、伪标签和半监督训练,把当前文本多标签教学模板作为"结构化信息理解模块",服务于赛题检索、项目归档、方案推荐等外围系统,而把视觉识别模型作为主任务模型进行联合落地。这样的升级路线更接近真实业务:结构化元信息负责组织问题,主模型负责完成核心预测,评估体系负责控制上线风险。

扩展流程 流程说明 流程目标
多标签分层验证 将随机切分升级为更适合多标签任务的分层抽样或交叉验证,减少验证集标签分布失真带来的评估偏差。 提升离线评估稳定性
文本字段分通道建模 对标题、副标题、规则、数据说明分别建模,再进行特征拼接或加权融合,而不是简单直接拼接。 提升特征表达能力
概率阈值优化 不再统一使用 0.5 阈值,而是为每个标签单独搜索最优阈值,以适配不同标签的概率分布。 提升多标签最终预测效果
词级与字符级特征融合 在 TF-IDF 词特征之外加入字符 n-gram,有助于捕捉缩写、拼写变体和短文本模式。 增强鲁棒性
基线模型对比 将逻辑回归与线性 SVM、朴素贝叶斯、随机森林等模型进行系统比较,建立可靠基准。 完成模型选型
不平衡标签处理 对低频标签增加类别权重、重采样或损失重加权,缓解长尾标签学习不足的问题。 改善稀疏标签表现
预训练语言模型微调 使用 BERT 类模型替代传统 TF-IDF 管线,对语义和上下文关系进行更强建模。 冲击更高上限
结构化字段融合 将文本特征与竞赛规模、评价方式、领域分类等结构化字段一起输入模型。 构建多模态表征
错误分析闭环 针对误判样本检查混淆标签、异常文本和标签缺失情况,反向修正数据与特征方案。 提升可解释性与迭代效率
切回原始图像竞赛建模 在理解赛题结构后,进一步回到盘子图像任务,采用迁移学习与数据增强完成少样本视觉分类。 对接竞赛真实核心任务

优秀案例解析

从公开信息看,Cleaned vs Dirty V2 更接近长期开放的练习型竞赛,平台侧能够直接观察到的是赛中公开 Notebook,而不是完整、正式的获奖方案体系。这一节的筛选标准因此分成两层:一层聚焦与本赛题直接相关、已经公开代码与分数的赛中项目样例,用来观察少样本图像分类在 Kaggle 环境下常见的实现路径;另一层补充同方向的生态标杆案例,用来回答"如果把这道题放进真实业务,方案还能怎样继续演进"。值得参考的案例并不只看模型名称,而是更关注是否明确处理了小样本、是否利用迁移学习降低训练门槛、是否通过自监督或半监督缓解标注不足、是否具备可复现的数据管线,以及方案能否迁移到清洁检测、工业质检、医疗影像初筛、边缘设备巡检等低标注视觉场景。对这道题而言,高质量提交通常不是依赖复杂的数据工程,而是在极小训练集条件下,把预训练表示、数据增强、验证设计和推理稳定性组合成一条完整、可复用的原型链路。

创建时间 作者 案例解析
2025-09 Antonoof ⭐ Cleaned vs Dirty | PyTorch | SSL 关键词:PyTorch、自监督学习、少样本、迁移学习、公开高分。该项目是当前公开样例中与赛题贴合度最高的一类方案,核心价值不在于单纯换用深层网络,而在于把自监督表示学习引入极小样本图像分类,通过先学习通用视觉表征,再用极少标签完成二分类微调,明显更符合训练集每类仅 20 张图的任务约束。公开记录显示其公共榜分数达到较高水平,说明这条路线对泛化而非记忆更有效。在真实业务中,这种做法非常适合标注昂贵、但未标注图片相对容易积累的场景,例如设备表面污染识别、实验器皿状态检测和后厨清洁巡检。
2025-09 Mahmoud saad Elgharib my python's PyTorch 1 关键词:PyTorch、基线搭建、迁移学习、训练流程、可复现。该案例更像是一个可落地的入门基线原型,参考意义在于把数据读取、模型训练、预测生成和提交流程串成完整闭环。对于结构简单但样本极少的竞赛,很多成绩不佳并非因为模型不够先进,而是因为训练---验证---推理过程不稳定,或者标签、增强、提交流程存在细小错误。此类案例有助于建立可靠起点,适合迁移到教育练手项目、企业内部 PoC 验证和轻量级视觉分类任务。
2025-05 lele25811 Cleaned vs Dirty V2 关键词:图像分类、端到端实验、Kaggle Notebook、快速迭代、原型验证。该项目代表的是赛中公开项目样例中较常见的一类:围绕官方数据直接构建端到端训练与预测流程,重点放在快速完成实验闭环,而不是引入过多复杂技巧。对读者的价值在于能够直观看到小数据视觉任务在 Kaggle Notebook 中如何组织代码、如何读取目录数据、如何输出提交文件。虽然这类方案未必是成绩上限所在,但在真实项目早期,快速验证问题是否可学、标签是否稳定、图像质量是否支持自动识别,往往比直接追求最优模型更重要。
2025-10 luvlean My baseline 关键词:基线模型、公开分数、少样本泛化、模型对比、实验起点。该案例的价值在于提供了一个可衡量的基础分数区间,公开记录显示其公共榜成绩达到可观水平,说明即便不依赖极其复杂的结构,只要预训练模型、输入尺寸、增强和训练细节设置合理,二分类任务仍然可以取得稳定表现。对于技术博客读者而言,这类案例特别适合作为"最小可用方案"的参照:先跑通基础迁移学习基线,再评估是否有必要继续加入半监督、自蒸馏或测试时增强。这样的推进方式更符合工业实践中的成本控制逻辑。
2025-05 Altemir Omar Fine-Tunning ResNet18 for Plates Classification 关键词:ResNet18、微调、轻量网络、低算力、部署友好。该案例强调的是轻量级预训练网络微调,与一味追求更大模型不同,ResNet18 这类结构在小样本任务中往往具有训练稳定、参数规模适中、部署门槛较低的优势。对本赛题的参考意义在于,盘子清洁识别本身并不是高语义复杂度任务,重点在于纹理、污渍、光照和反射差异的判别,因此轻量模型配合合理增强就可能达到不错效果。放到真实场景中,这条路线更容易扩展到边缘端巡检、厨房设备本地识别和低延迟视觉质检。
2025-06 Himeno Cleaned vs Dirty with EfficientNetB1 关键词:EfficientNet、参数效率、迁移学习、图像增强、移动侧潜力。该项目体现了高效网络在小数据视觉任务中的实用性。EfficientNet 系列通过较好的参数利用率,在数据不多时常能提供比从头训练更稳健的初始化效果,对图像质量波动、拍摄角度变化和轻度背景干扰也更有适应空间。对本赛题而言,这种方案的参考价值在于兼顾精度和资源消耗,适合继续延伸到资源受限环境,例如餐饮门店终端、实验室清洁检测设备、仓储容器状态识别等需要离线或近实时推理的场景。
2020-06 Facebook AI Research / Kaggle 社区生态 Semi-Supervised Learning with Pseudo-Labels(标杆方向案例) 关键词:半监督、伪标签、未标注数据、小样本扩展、生态标杆。该条属于生态标杆案例,并非本赛题官方获奖方案,但在 Kaggle 图像分类生态中,伪标签是处理"少量标注 + 大量未标注或测试分布样本"时最常见的强化路线之一。对于盘子清洁识别这类任务,如果规则允许且流程合规,先用高置信样本生成伪标签,再做二次微调,往往能提升模型对边缘样本的适应能力。这一思路在农业病害识别、医疗影像初筛和工业瑕疵识别中同样常见,现实价值在于减少额外标注成本。
2019-10 fast.ai 社区 / Jeremy Howard 相关生态实践 Practical Transfer Learning for Small Image Datasets(标杆方向案例) 关键词:迁移学习、小样本、数据增强、判别式学习率、工程实战。该条同样属于生态标杆案例,价值不在某个具体排行榜成绩,而在于系统化总结了小图像数据集上最稳定的一套工程方法:利用 ImageNet 预训练权重、分阶段解冻网络、结合强数据增强和学习率调度,在极少样本下尽可能提高泛化能力。对本赛题来说,这几乎就是最可复用的底层方法论。放到真实项目中,这类路线可直接服务于教育场景中的低成本视觉教学实验,也可迁移到科学实验图像分类、清洁状态审核、设备巡检等标注稀缺任务。

总结

这道题的价值,不只在于得到一个排行榜分数,更在于建立一套面对极小样本视觉任务时可重复使用的方法框架。只要训练数据稀缺、标签获取成本高、业务又需要快速验证可行性,类似的建模思路都具有直接参考意义,尤其适合迁移到企业 PoC、教学练习和轻量级图像识别原型中。

从实践角度看,真正重要的收获通常不是模型名称本身,而是能否把任务抽象、数据约束、规则边界、实验设计和推理输出串成闭环。Cleaned vs Dirty V2 正好提供了这样一个足够小却不失真实感的练手机会,用来打磨小样本图像分类的基本功,价值相当稳定。

相关推荐
zzzll11111 小时前
Ollama 本地大模型部署与使用指南
人工智能
天辛大师1 小时前
天辛大师浅谈AI时代,“学会学习“本身的内涵也需要被重新定义?
人工智能·深度学习·学习·启发式算法·量子计算
_codeOH1 小时前
Agent 记忆系统设计实战:让 AI 拥有长期记忆的工程方案
人工智能·ai编程
学弟1 小时前
【系列梳理】文档解析系列梳理
人工智能·ocr
幂律智能1 小时前
穿透到合同,管控到付款
大数据·人工智能
今天AI了吗1 小时前
【AI】一文讲清 RAG:从大模型局限到企业级知识库落地流程
前端·javascript·人工智能·python·深度学习·机器学习·easyui
“AI国潮设计-小江”1 小时前
《Python实战 | 用SDXL大模型生成“潮汕英歌舞”国潮IP头像,已申请外观专利,附Prompt思路!》
人工智能·python·prompt·aigc·scikit-learn
Mr数据杨1 小时前
Arxiv论文标题生成实战 从摘要到标题的文本生成建模案例
人工智能·数据分析·kaggle竞赛
martindelophy1 小时前
开源 AI 视频编辑器实战:用 Manifest + Adapter 构建可扩展的生成插件系统
人工智能·开源·音视频