基于企业交易数据的OKVED行业分类实战解析

OKVED detection 关注的不是通用文本分类,而是依据企业交易记录识别所属行业类别。这类任务在金融科技和企业服务场景中很常见,核心难点在于如何把零散流水、摘要文本和交易模式转换成稳定可学习的行业信号。

这道题虽然在平台分类中出现了偏差,但从题面与评测方式看,本质仍是准确率导向的行业分类问题。真正有价值的部分不在模型名词堆叠,而在于数据理解是否到位、标签结构是否厘清、企业级特征是否能够支撑业务可解释的分类结果。

文章目录

赛题概述

本案例地址 OKVED detection

这道题本质上是基于企业交易流水推断所属行业分类的监督学习任务,目标接近真实业务中的商户识别、客户画像补全与风险规则分层。题面虽然被自动归到目标检测,但从简介与评测方式看,更接近结构化交易数据上的多分类问题,核心不在复杂模型堆叠,而在于把交易行为转成可区分的行业特征。适合用来训练数据理解、特征工程、类别体系建模、离线验证与业务解释能力,对金融科技、企业服务和风控分析场景都有直接参考价值。

模块名称 内容简介 所需技能 数据类型 应用场景
赛题背景 题目聚焦"通过组织交易记录识别行业类别"这一典型行业数据问题,本质是把分散的行为信号映射到标准经营分类体系。它更像企业数据智能中的分类建模练习,约束来自交易噪声、类别边界不清、样本分布不均和业务可解释性要求,而不是视觉或生成式任务中的内容理解。 业务问题抽象、分类体系理解、交易行为建模、特征提炼、样本分布分析、结果解释 结构化交易数据、企业标注类别、时间序列行为记录、聚合统计特征、自建验证切分 金融风控、商户识别、企业画像构建、行业分层运营、企业服务数据治理
竞赛目标 参赛结果需要交付一个能够依据企业交易特征输出行业类别的分类方案,本质上是可复用的行业识别模型,而不是只给出概念性分析。真正有价值的完成方式通常包括稳定的数据清洗流程、有效的特征表达、合理的验证方法,以及可解释的分类输出逻辑。 监督学习建模、特征工程、类别不平衡处理、验证集设计、误差分析、模型迭代 训练集与测试集、类别标签、交易统计特征、时间窗口特征、频次与金额特征 自动行业归类、客户主数据补全、销售线索筛选、B 端客户管理、经营主体识别
评价指标 平台给出的核心评审逻辑是分类准确率,即预测类别与真实类别一致的比例。这意味着方案优化重点应放在整体分类正确性,而在真实落地中,还需要额外关注高相似行业之间的混淆情况、少数类识别效果,以及错误分类对后续业务流程造成的影响。 离线评估设计、准确率导向优化、混淆矩阵分析、分类阈值与误差诊断、稳健性验证 真实标签、预测类别、验证结果、类别混淆关系、错误样本分析记录 行业分类质检、模型验收、规则系统校准、运营标签体系维护、风控策略验证
业务意义 这类任务在企业场景中对应的是把原始交易流水转成可直接服务运营、风控和分析系统的行业标签能力。行业识别一旦稳定,既能减少人工归类成本,也能提升客户分层、授信评估、营销触达和异常监测的效率,是将零散业务数据沉淀为可用智能服务的典型路径。 数据产品化思维、模型服务化、业务规则协同、结果落地评估、工程整合、可解释交付 业务流水、标签主数据、规则配置、模型输出结果、人工复核样本、监控反馈数据 公共企业信息整理、金融科技智能分类、企业数据中台、商业分析系统、自动化决策支持

数据详解

该竞赛的结构化信息非常精简,真正与建模相关的内容主要集中在任务主题、标签、评价方式、时间约束和数据入口几个部分。赛题标题为 OKVED detection ,简介说明任务目标是"根据组织的交易记录识别其 OKVED 类别",本质上属于基于交易行为数据的行业分类问题。虽然平台自动标签将其归到"计算机视觉/目标检测",但从题目描述和评价指标来看,这一归类与实际任务并不一致,阅读时应优先相信赛题简介、数据内容和指标定义,而不是机械依赖平台标签。评价指标采用 Categorization Accuracy,说明提交结果关注的是类别预测是否正确,属于标准监督分类任务而非排序、回归或检测框架。平台元数据中存在不少空字段以及管理属性,例如论坛、机构 ID、Notebook 支持状态、若干控制开关等,这些信息对理解业务问题和建模路线帮助有限,可以忽略。真正值得关注的是:标签体系是否单标签分类、训练数据中目标字段如何组织、测试集是否只保留特征不含标签、提交频率和组队限制是否影响实验节奏,以及数据文件入口是否提供足够的信息支持特征工程与验证集设计。

字段名称 类型/范围 描述信息
competition_title 字符串 赛题名称为 OKVED detection,直接指向任务核心:识别企业所属的 OKVED 类别。对建模而言,这决定了问题类型更接近结构化分类,而不是平台标签暗示的视觉任务。
competition_subtitle 字符串 / 空值 副标题为空,说明平台没有额外补充任务背景,实际理解任务时需要更多依赖简介、数据文件和提交格式来还原业务场景。
overview 字符串 简介内容为"根据组织的交易记录确定其 OKVED"。这是理解数据含义的关键入口,说明特征大概率来自企业交易行为,目标是预测行业编码或行业类别,属于真实业务中常见的企业画像与行业识别问题。
tags JSON 数组 当前只有一个标签,且表现为"分类准确率"相关标签,提示该任务以离散类别预测为核心。标签数量很少,也意味着平台侧并未提供足够细粒度的任务注释,任务判断应回到原始描述与数据本身。
category_level_1 / category_level_2 字符串 平台自动归类为"计算机视觉/目标检测",与赛题简介明显不一致。这类字段可作为平台检索标签参考,但不应作为技术路线依据,否则容易误判问题类型。
evaluation_algorithm_name 字符串 评价指标为 Categorization Accuracy,即分类准确率。该指标强调预测类别与真实类别完全一致的比例,适合单标签分类场景,也意味着类别不平衡问题可能被掩盖,验证阶段需要额外关注混淆情况。
evaluation_algorithm_abbreviation 字符串 指标缩写为 CA。字段本身信息量不大,但在查看榜单、提交结果或外部讨论时可快速确认平台采用的是准确率口径。
enabled_date 时间 比赛开放时间可用于判断任务发布时间和资料沉淀程度。对实战读者而言,更重要的意义在于评估该题是否已有成熟公开解法,是否适合作为入门练习或复现实验。
deadline_date 时间 截止时间决定可提交窗口长度,也影响实验规划。当前截止时间较晚,说明该竞赛更像长期开放练习题,适合用于完整走通数据理解、建模、验证和提交流程。
team_merger_deadline_date 时间 队伍合并截止时间与比赛截止时间一致,但由于最大队伍人数只有 1,这一字段在实操中的意义有限,更多是平台规则的一部分。
max_daily_submissions 整数 每日最多提交 5 次,这会直接影响调参策略。准确率类任务容易因小幅特征改动频繁试榜,提交上限要求本地验证必须更扎实,不能完全依赖排行榜反馈。
max_team_size 整数 最大组队人数为 1,意味着这是典型的个人练习型竞赛。对学习者而言,这种限制降低了协作因素干扰,更适合独立完成从数据分析到模型提交的全流程训练。
reward_type / reward_quantity / num_prizes 字符串 / 数值 / 空值 奖励相关字段为空,说明这不是以奖金驱动的正式商业竞赛,更适合作为业务建模练习题。阅读时不必在奖项信息上投入注意力,应把重点放在任务抽象和数据处理方法上。
dataset_url URL 数据下载入口是实际建模工作的起点。对这类结构化分类题,核心信息通常藏在训练集、测试集、样本说明和提交样例中,这个链接比多数平台管理字段更有价值。
dataset_description Markdown 长文本 / 空值 数据集描述为空,意味着平台没有提供现成的数据字典。实战中需要通过文件名、字段分布、缺失模式和样例记录逆向理解数据,这也是结构化数据项目里非常常见的情况。
total_compressed_bytes / total_uncompressed_bytes 整数 / 空值 数据规模字段缺失,无法提前判断样本量和存储压力。实际工作中需要下载后自行确认文件大小、行数、列数和内存占用,再决定是否采用采样、分块读取或稀疏表示。
total_teams 整数 当前参赛队伍数仅 5,说明公开讨论和成熟方案可能较少,排行榜参考价值有限。对学习用途反而有利,因为重点会回到任务理解与独立建模,而不是套用高度同质化方案。
has_kernels / only_allow_kernel_submissions 布尔值 平台未提供 Notebook 支持,也不是仅允许在线提交。这类字段不直接决定建模方法,但会影响开发环境选择,通常意味着更适合在本地完成数据分析、训练和结果生成。
rules Markdown 长文本 / 空值 规则字段为空,说明没有额外公开的复杂限制条件。即便如此,仍需在数据页重点确认提交格式、是否允许外部数据、测试集是否隐藏标签等关键信息。
description Markdown 长文本 / 空值 详细描述为空,进一步说明赛题信息密度不高。面对这种情况,真正重要的不是等待完整文档,而是通过数据文件和指标定义主动还原问题结构。
目标标签字段 未在结构化元数据中给出 这是当前最值得警惕的信息缺口。虽然已知任务是预测 OKVED 类别,但具体标签列名、编码方式、是否为单列多分类、是否存在层级编码,都需要从训练数据文件中确认,这将直接决定标签处理、损失函数和提交格式。
数据文件说明 未在结构化元数据中给出 当前元数据没有列出训练集、测试集、样例提交文件等具体文件名。实际建模前需要优先核对文件构成,因为这决定了特征字段来源、是否存在时间信息、是否需要聚合交易明细,以及本地验证如何切分。
平台管理与内部属性 多种类型,含 ID、布尔开关、论坛信息等 论坛 ID、组织 ID、模型附件控制、排行榜显示比例等字段对任务理解帮助有限,属于平台运行层面的元数据。阅读竞赛信息时可统一弱化处理,避免被噪声分散注意力。

解题思路

这道题本质上是基于企业交易信息推断所属行业分类,虽然平台分类被标记到"目标检测",但从题目描述来看,更接近结构化序列数据或交易文本语义驱动的分类任务。此类问题天然适合多路线并行:一类方法依赖业务规则、频次统计和交易模式特征,适合快速建立可解释基线;一类方法把交易记录转成"文本"或"词袋"表示,再用线性模型完成高效分类,往往在样本量有限、类别边界相对清晰时表现稳定;更复杂的路线会引入词向量、卷积网络、循环网络或 Transformer,通过建模交易描述、对手方、金额区间和时间序列中的上下文关系提升泛化能力。由于评价指标是分类准确率,意味着最终提交通常更强调主标签判定是否正确,因此既要关注模型的判别能力,也要关注类别不均衡、相近行业混淆以及多标签或层级标签可能带来的决策偏差。放在真实业务中,这类任务对应的是企业画像、风险识别、授信审核、商户运营分层等场景,建模路线的选择不能只看分数,还要兼顾可解释性、部署成本与对噪声数据的容忍度。

方法标题 案例适配度 方法说明 操作流程 优点 缺点
基于业务规则与统计画像的行业归类基线 70% 把企业交易数据先还原为行业行为画像,例如高频交易时段、收支方向、金额分布、交易对手集中度、关键词命中率、类目共现模式,再结合简单规则或朴素贝叶斯、逻辑回归完成分类。这条路线更像业务可解释基线,适合在数据字段含义明确、交易模式差异明显时使用。 清洗交易字段并统一编码,提取金额统计、频次统计、时间分布、关键词命中特征,构造企业级聚合特征,使用规则系统或轻量分类器训练,输出行业类别并分析误判样本。 与真实业务结合最紧,容易解释,适合冷启动和字段理解阶段;即使训练样本不大,也能形成可用基线;对后续特征工程有明显指导价值。 上限通常不高,对隐含语义和复杂模式捕捉不足;一旦行业边界依赖交易文本细节或上下文组合,仅靠规则与统计特征容易混淆;维护成本也会随规则增长而上升。
TF-IDF 加线性分类器的高性价比方案 88% 将交易描述、商户名称、摘要字段或拼接后的企业交易序列视作文本语料,使用 TF-IDF 表示词项重要性,再配合 Logistic Regression、Linear SVM 或 SGDClassifier 做分类。这是结构化文本混合任务中极常见的强基线。 拼接企业相关文本字段,完成分词或子词切分,构造词级与字级 TF-IDF 特征,配合线性模型训练,使用交叉验证选择正则化强度与 n-gram 范围,生成最终预测。 对中短文本分类非常稳健,训练速度快,资源消耗低,适合初学者快速建立高质量基线;在准确率指标下通常表现不差;对稀疏高维特征也有很强适应性。 难以显式建模交易顺序、上下文依赖和深层语义;如果文本噪声大、缩写多、行业表达不规范,单纯 TF-IDF 容易受表面词频影响;对多字段交互信息利用有限。
词向量聚合加传统机器学习分类 80% 使用 Word2Vec、FastText 或预训练静态词向量把交易文本映射为稠密向量,再通过平均池化、加权池化或序列聚合形成企业级表示,交给 LightGBM、XGBoost 或逻辑回归做分类。这条路线介于稀疏文本方法和深度学习之间。 训练或加载词向量,生成交易文本向量表示,按企业聚合成定长特征,并与金额、频次等统计特征拼接,训练树模型或线性模型,验证不同聚合方式对准确率的影响。 比 TF-IDF 更能表达词语相似性,对同义词、缩写、拼写变化的鲁棒性更好;与结构化统计特征融合方便,适合做多模态轻量实验;训练成本仍然可控。 静态词向量无法充分理解上下文,同一词在不同交易场景中的差异表达能力有限;聚合方式若过于简单,容易丢失序列信息;效果往往依赖较好的预训练语料或足够大的本地语料。
基于序列文本的 CNN 或 BiLSTM 分类模型 76% 把交易记录按时间或业务顺序组织成序列,利用 TextCNN 捕捉局部模式,或使用 BiLSTM 建模上下文依赖,再输出企业行业类别。这类模型适合文本序列长度适中、上下文确实影响分类判断的场景。 对交易文本序列做分词和索引编码,构建嵌入层,使用 CNN 或 BiLSTM 提取序列特征,接入全连接分类层,结合验证集调整序列长度、嵌入维度和正则化参数。 能比词袋模型更好地利用顺序信息和局部搭配模式,适合存在固定交易短语、描述模板或时序上下文线索的数据;也是从传统方法过渡到深度学习的良好练习。 对样本规模和清洗质量更敏感,训练时间明显高于线性模型;如果有效信息主要来自词频而非顺序,未必能稳定超过 TF-IDF 基线;可解释性也弱于统计和线性路线。
Transformer 预训练模型微调方案 90% 使用 BERT、RoBERTa 或多语言 Transformer 对交易描述、企业摘要或拼接文本进行微调,直接学习上下文语义表示。这类方法适合字段中自然语言信息占比高、行业类别边界依赖细粒度语义差异的情况。 选择适配语言的预训练模型,整理单条或多条交易文本输入,按长度截断或分段,进行分类头微调,结合交叉验证与学习率调度优化训练,并分析长文本截断对结果的影响。 语义表达能力最强,对同义替换、上下文差异、行业关键词组合有更强识别能力;若数据中存在复杂文本模式,通常具备最高上限;适合进阶学习完整的文本分类工程流程。 训练和推理成本高,对算力、批大小和数据预处理要求更高;如果数据量较小或文本很短,优势可能不如预期明显;长交易序列还可能遇到输入长度限制。
结构化特征与文本特征的双塔或混合建模方案 92% 同时利用企业交易统计画像与文本语义信息,分别建立结构化分支和文本分支,再在分类层前融合。这类路线最接近真实业务落地,因为企业行业识别往往既依赖交易数值模式,也依赖交易内容语义。 提取金额、频率、时间分布、对手方集中度等结构化特征,同时构造 TF-IDF 或 Transformer 文本表示,在中间层或最终层做特征拼接,训练统一分类器并比较不同融合方式。 能充分利用多源信息,通常比单一路线更稳;对相近行业的区分更有效,因为数值行为与文本语义可以互相补充;业务落地价值高,适合企业画像、风控和商户分类等场景。 特征工程与训练流程更复杂,调参空间大;数据对齐、缺失值处理、字段标准化都可能成为性能瓶颈;若样本量有限,融合模型也更容易过拟合。
多模型融合与分类阈值校准方案 85% 在已有若干单模型基础上,通过投票、加权平均、Stacking 或类别后处理提升稳定性,并针对类别不均衡或疑似多标签特征做阈值校准。虽然比赛指标是准确率,但融合能减少单模型偶然性误判。 训练统计模型、线性文本模型和深度文本模型,收集各模型验证集概率输出,设计加权融合或二层学习器,对易混类别做阈值调整与后处理,选择验证集上最稳的组合作为提交方案。 对排行榜表现通常更稳健,能够综合不同方法对不同类别的优势;适合比赛后期冲分,也适合真实业务中降低误判波动;对复杂样本有更强容错性。 前提是已有多条成熟单模型路线,工程成本最高;若验证集划分不合理,融合很容易产生虚高结果;准确率指标下阈值优化空间有限,收益依赖类别分布与概率质量。

操作案例

基础流程样例

数据读取与任务映射

该赛题的核心目标,是根据企业交易相关文本信息识别对应的 OKVED 类别。放到真实业务中,这类问题通常对应"依据交易描述、商户名称、收付款备注等行为文本,为企业自动打行业标签"。教学示例不追求还原平台全部文件结构,而是展示一条可复用的多标签文本分类主线:将若干文本字段合并为模型输入,将一个或多个行业标签字段转换为多标签监督信号,再基于常见机器学习工具完成训练与评估。由于 Kaggle 页面提供的是竞赛入口而非字段明细,代码中采用了"自动识别文本列与标签列"的写法,便于落地时按真实数据结构快速调整。

python 复制代码
import re
import ast
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.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.multiclass import OneVsRestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score, classification_report

DATA_DIR = Path("./data")

# 按实际下载后的文件名修改
train_path = DATA_DIR / "train.csv"
test_path = DATA_DIR / "test.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())
print(train_df.columns.tolist())

标签结构查看与多标签目标构造

多标签任务与普通单标签分类的差异,在于单条样本可能同时属于多个行业类别,因此不能直接用单个类别编码完成监督学习。真实项目中,标签常见形态包括以分隔符拼接的字符串、JSON 风格列表、多个二值标签列,或者主类目加辅类目并存。教学流程中先把标签统一整理为"每行一个标签列表",再用 MultiLabelBinarizer 转成多热编码矩阵,为后续 OneVsRestClassifier 训练做好准备。这一步既决定建模方式,也影响指标解释,是多标签场景最关键的数据理解环节之一。

python 复制代码
def detect_text_columns(df):
    text_candidates = []
    for col in df.columns:
        if df[col].dtype == "object":
            sample = df[col].dropna().astype(str).head(20)
            avg_len = sample.map(len).mean() if len(sample) > 0 else 0
            if avg_len >= 5:
                text_candidates.append(col)
    return text_candidates

def detect_label_source(df):
    # 优先寻找明显的标签列名
    preferred = ["labels", "label", "target", "targets", "okved", "okveds", "category", "categories"]
    lower_map = {c.lower(): c for c in df.columns}
    for p in preferred:
        if p in lower_map:
            return {"type": "single_column", "cols": [lower_map[p]]}

    # 其次寻找多个 0/1 标签列
    binary_cols = []
    for col in df.columns:
        vals = set(df[col].dropna().unique().tolist())
        if len(vals) > 0 and vals.issubset({0, 1}):
            binary_cols.append(col)
    if len(binary_cols) >= 2:
        return {"type": "binary_columns", "cols": binary_cols}

    raise ValueError("未自动识别到标签列,请结合真实字段手动指定。")

def parse_label_list(x):
    if pd.isna(x):
        return []
    if isinstance(x, list):
        return [str(i).strip() for i in x if str(i).strip()]
    s = str(x).strip()

    # 尝试解析类似 "['A', 'B']"
    if s.startswith("[") and s.endswith("]"):
        try:
            parsed = ast.literal_eval(s)
            if isinstance(parsed, list):
                return [str(i).strip() for i in parsed if str(i).strip()]
        except Exception:
            pass

    # 常见分隔符
    for sep in ["|", ";", ","]:
        if sep in s:
            return [i.strip() for i in s.split(sep) if i.strip()]

    return [s]

label_info = detect_label_source(train_df)
print("label_info:", label_info)

if label_info["type"] == "single_column":
    label_col = label_info["cols"][0]
    train_df["label_list"] = train_df[label_col].apply(parse_label_list)
else:
    binary_label_cols = label_info["cols"]
    train_df["label_list"] = train_df[binary_label_cols].apply(
        lambda row: [col for col, val in row.items() if val == 1], axis=1
    )

label_sizes = train_df["label_list"].map(len)
print("每条样本平均标签数:", label_sizes.mean())
print("每条样本最大标签数:", label_sizes.max())

all_labels = sorted({lab for labs in train_df["label_list"] for lab in labs})
print("标签总数:", len(all_labels))
print("标签示例:", all_labels[:20])

mlb = MultiLabelBinarizer()
Y = mlb.fit_transform(train_df["label_list"])
print("多标签矩阵形状:", Y.shape)

label_freq = pd.Series(Y.sum(axis=0), index=mlb.classes_).sort_values(ascending=False)
print(label_freq.head(20))

文本预处理与特征输入构造

企业交易场景中的文本来源往往比较杂,可能同时包含商户名、交易摘要、用途说明、银行附言等字段。单独使用某一列,通常无法完整表达业务语义,因此更稳妥的基础方案是合并多个文本字段。预处理不宜过重,重点放在去噪、统一空白符、保留数字与字母信息,并让 TF-IDF 捕捉词汇差异。对于俄语、英语、缩写代码、金额片段并存的数据,这种轻量清洗方式往往比激进删除更安全。

python 复制代码
text_cols = detect_text_columns(train_df)
print("检测到的文本候选列:", text_cols)

# 如存在明显非文本字段,可手动排除
exclude_cols = set(label_info["cols"] + ["label_list"])
text_cols = [c for c in text_cols if c not in exclude_cols]

if len(text_cols) == 0:
    raise ValueError("未识别到文本列,请根据真实数据手动指定。")

def clean_text(text):
    text = str(text).lower()
    text = re.sub(r"\s+", " ", text)
    text = re.sub(r"[^\w\s\-./]", " ", text)
    text = re.sub(r"\s+", " ", text).strip()
    return text

def combine_text_columns(df, cols):
    combined = df[cols].fillna("").astype(str).agg(" ".join, axis=1)
    combined = combined.apply(clean_text)
    return combined

X_text = combine_text_columns(train_df, text_cols)

print(X_text.head())

训练集验证集划分

多标签任务的划分原则,与普通分类任务相同,目标都是在训练阶段与验证阶段之间维持尽可能稳定的数据分布。若标签极不均衡,严格意义上更适合使用迭代分层等多标签专用切分方法;但在教学示例中,采用常见的随机划分已经足够展示建模闭环。实践中需要特别关注长尾标签,因为很多行业类目样本数很少,验证指标会随随机种子产生明显波动。

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:", X_train.shape)
print("X_valid:", X_valid.shape)
print("y_train:", y_train.shape)
print("y_valid:", y_valid.shape)

基础建模与多标签训练

在结构化字段有限、文本信息占主导的前提下,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 无法计算,这在长尾行业识别中非常常见,因此代码中加入了容错处理。实际部署时,阈值也不应固定写死为 0.5,而应依据业务偏好在召回与精度之间做平衡。

python 复制代码
# 预测概率
y_valid_prob = model.predict_proba(X_valid)

# 固定阈值生成多标签预测
threshold = 0.5
y_valid_pred = (y_valid_prob >= threshold).astype(int)

# 子集准确率:一条样本所有标签都预测正确才算正确
subset_acc = accuracy_score(y_valid, y_valid_pred)
print("子集准确率:", subset_acc)

# 宏平均 ROC AUC
valid_auc_scores = []
per_label_auc = {}

for i, label_name in enumerate(mlb.classes_):
    y_true_col = y_valid[:, i]
    y_prob_col = y_valid_prob[:, i]

    # AUC 至少需要同时存在正负样本
    if len(np.unique(y_true_col)) < 2:
        continue

    auc_i = roc_auc_score(y_true_col, y_prob_col)
    per_label_auc[label_name] = auc_i
    valid_auc_scores.append(auc_i)

if valid_auc_scores:
    print("宏平均 ROC AUC:", np.mean(valid_auc_scores))
else:
    print("当前验证集标签分布不足,无法计算有效 ROC AUC")

auc_df = pd.DataFrame({
    "label": list(per_label_auc.keys()),
    "roc_auc": list(per_label_auc.values())
}).sort_values("roc_auc", ascending=False)

print(auc_df.head(20))
print(auc_df.tail(20))

# 查看部分类别的分类报告
report = classification_report(
    y_valid,
    y_valid_pred,
    target_names=mlb.classes_,
    zero_division=0,
    output_dict=True
)
report_df = pd.DataFrame(report).T
print(report_df.head(20))

测试集预测与提交结果生成

竞赛交付阶段的关键,不只是把模型跑通,而是把预测结果重新映射回平台需要的提交格式。多标签任务通常要求输出每个标签的概率,或输出按规则拼接后的标签集合。基础示例中给出两种常见做法:保留每个类目的概率分数,便于后续调阈值;同时生成标签集合字符串,便于快速检查预测结果是否符合业务直觉。真实提交时,需要按官方样例文件字段名进行适配。

python 复制代码
X_test_text = combine_text_columns(test_df, text_cols)
y_test_prob = model.predict_proba(X_test_text)
y_test_pred = (y_test_prob >= threshold).astype(int)

# 概率结果
proba_df = pd.DataFrame(y_test_prob, columns=[f"prob_{c}" for c in mlb.classes_])

# 标签集合结果
pred_labels = mlb.inverse_transform(y_test_pred)
pred_label_text = ["|".join(labels) if len(labels) > 0 else "" for labels in pred_labels]

submission_df = pd.DataFrame({
    "predicted_labels": pred_label_text
})

# 如果测试集有 id 列,建议一并保留
if "id" in test_df.columns:
    submission_df.insert(0, "id", test_df["id"])

print(submission_df.head())
print(proba_df.head())

submission_df.to_csv(DATA_DIR / "submission_labels.csv", index=False)
proba_df.to_csv(DATA_DIR / "submission_probabilities.csv", index=False)

扩展流程概述

这套入门流程的价值,在于用最常见的文本特征与线性模型完成多标签分类闭环,适合快速验证数据是否具备可学习信号,也适合作为后续优化的统一基线。进入竞赛增强版后,优化重点通常不再是"能否训练成功",而是"怎样让模型更贴近业务语义与评测机制"。在企业交易识别场景中,交易对手名称、支付用途、金额区间、交易方向、时间周期等信息往往共同决定行业类别,仅靠纯文本拼接难以充分表达;同时,多标签分布往往高度不均衡,少数行业样本稀缺,固定阈值会导致热门标签过度预测、冷门标签几乎无法召回。更进一步的实战做法,通常会围绕更稳健的数据切分、更细致的标签治理、文本与结构化特征融合、标签级阈值寻优,以及更强的预训练语言模型展开,从而把教学示例升级为具备真实业务可用性的分类系统。

扩展流程 流程说明 流程目标
多标签分层验证 使用更适合多标签分布的验证策略,减少随机划分带来的指标波动,特别是改善长尾标签评估失真问题 让离线评估更稳定,更接近真实提交表现
标签清洗与层级整理 合并重复标签、修正脏标签、处理过细或过少样本的标签,并结合 OKVED 层级关系重构目标体系 提升标签质量,降低学习噪声
文本字段精细建模 区分商户名、交易描述、附言、备注等字段,分别构建特征后再融合,而不是简单直接拼接 提高模型对不同语义来源的识别能力
文本与结构化特征融合 将金额、交易频次、时间分布、收支方向、行业统计特征与文本表示联合建模 让模型同时利用语义信息与行为模式
阈值优化 针对每个标签单独寻找最优阈值,而不是统一使用 0.5,兼顾精度与召回 改善多标签输出质量,贴近业务决策需求
类别不平衡处理 结合重采样、类别权重、难例挖掘等手段,提升稀有行业标签的可识别性 缓解热门标签主导问题
预训练语言模型替换 用 BERT、RoBERTa 或适配俄语语料的 Transformer 模型替代 TF-IDF 基线 提升复杂语义和上下文表达能力
模型集成 组合线性模型、树模型、深度学习模型的预测结果,利用不同模型的误差互补 提高排行榜成绩与线上鲁棒性
概率校准 对输出概率进行校准,使不同标签的概率更可比,便于阈值设定与业务解释 增强预测分数的可用性
错误分析闭环 对高置信度误判、标签共现错误、冷门类漏判进行系统复盘,并反推特征与标注问题 将竞赛优化转化为真实项目中的持续改进机制

优秀案例解析

该竞赛目前仍处于开放状态,公开页面中可直接检索到的高质量 Notebook、Writeup 与 Discussion 产出较少,尚不足以形成稳定的"获奖方案参考系"。因此,这一节采用"双来源"筛选思路:一类是赛中公开项目样例,重点关注与"基于交易数据识别企业所属行业"这一任务定义直接相关的实践线索;另一类是生态标杆案例,选取金融交易建模、商户行业分类、表格序列建模、隐私友好风控分析等方向中已经证明有效的公开项目。这样处理的意义在于,读者不只看到比赛页面本身的信息稀缺现实,也能借助相邻问题上的成熟方案,理解高质量提交通常具备哪些共同特征:能够把弱标签或稀疏标签转化为可学习信号,能够把原始流水聚合为企业级画像,能够在类别不平衡、多类别分类与可解释性之间取得平衡,并且具备面向真实业务部署的稳健验证框架。对于 OKVED detection 这类题目,真正有参考价值的并不是单一模型名,而是"交易明细到行业编码"的完整建模链路,包括特征工程、时间窗口设计、类别体系映射、误差分析和上线可复用性。

创建时间 作者 案例解析
2022-05 Kaggle 竞赛主办页 OKVED detection 关键词:企业行业识别、交易聚合、多类别分类、准确率评估、赛中样例。该案例属于赛题原始入口,本身不是完整解法,但定义了一个非常典型的金融数据建模问题:依据组织的交易记录推断其 OKVED 行业编码。参考价值在于问题边界清晰,适合据此搭建基线原型,例如把交易对手、金额分布、收支节奏、时间周期性和高频商户模式聚合为企业级特征,再用 LightGBM、CatBoost 或多层感知机建立多分类模型。对于真实业务,类似方法可直接迁移到对公客户画像、授信准入、反欺诈初筛与风险分层。
2022-05 Kaggle Code 页面公开作者群体 OKVED detection Code 页面 关键词:赛中公开样例、Notebook 复现、基线构建、特征实验、提交原型。该页面是赛中公开项目样例的主要聚合入口。当前公开案例数量有限,但从技术博客写作角度,它仍然值得纳入,因为读者可以从这里观察一个冷门结构化竞赛常见的现实情况:没有现成冠军方案可抄,必须回到问题本身完成从读取流水、构造企业画像、处理类别不均衡到本地验证的全过程。此类入口的价值不在于现成答案,而在于逼近真正的数据项目场景,即资料稀缺、标签有限、验证难度高,需要独立完成方案拆解。
2021-10 Kaggle / American Express American Express - Default Prediction 关键词:交易序列、表格深度学习、时间聚合、类别不平衡、业务风控。虽然目标是违约预测,但它是金融交易型表格任务中最具代表性的生态标杆之一。高质量方案通常会把长序列账单行为压缩成稳定的客户画像,结合统计聚合、差分特征、最近窗口与长期窗口双视角建模,再配合 GBDT 与神经网络融合。这类思路对 OKVED 识别非常有借鉴性,因为企业行业往往不是由单笔交易决定,而是由持续交易结构、往来对象生态和资金流模式共同刻画。其现实价值在于证明了"交易行为结构化编码"比生硬套用通用模型更重要。
2022-09 Kaggle / JP Morgan & Payments 团队 JPX Tokyo Stock Exchange Prediction 关键词:时序特征、稳健验证、表格建模、数据泄漏控制、金融场景。该竞赛并非行业分类,但在金融时序表格任务中展示了非常成熟的验证与特征体系设计。其标杆意义在于提醒读者,交易类问题最怕的不是模型不够复杂,而是验证方式失真导致线下分数与线上效果脱节。对于 OKVED detection,若企业交易跨月份或存在明显时间漂移,就需要借鉴这类项目的分层时间切分、窗口滚动验证和泄漏检查思路,避免把未来信息错误带入训练集。这种工程规范对业务落地的价值远高于盲目追求更深的模型结构。
2023-07 Hugging Face / 公开研究与工程社区 TabPFN: Prior-Data Fitted Networks for Tabular Classification 关键词:小样本表格、多分类、快速原型、自动归纳偏置、低算力。该案例不是 Kaggle 竞赛项目,而是表格分类方向的生态标杆,尤其适合样本规模不大、参赛活跃度低、需要快速建立强基线的场景。OKVED detection 当前公开队伍数量很少,意味着很可能面临"小规模数据+高类别数+特征工程成本高"的局面。TabPFN 这类方法的参考价值在于,能够在不做过多手工调参的前提下快速验证特征是否具备可分性,为后续是否投入复杂交易聚合、序列建模或类别重采样提供决策依据。对实际项目而言,这种快速原型能力有助于缩短行业识别系统的探索周期。
2021-06 Yandex Research 等 CatBoost for Categorical Features and Tabular Learning 关键词:类别特征、目标统计、缺失鲁棒性、表格基线、工业可用。CatBoost 相关公开文档与实践长期是金融表格任务中的标杆参考。对于"企业交易推断行业"这一问题,原始数据中往往包含大量高基数类别字段,例如交易对手类别、地区、渠道、商户编码或文本映射后的离散标签。CatBoost 的价值不只是模型效果稳定,更在于对类别特征友好、工程落地简单、解释性相对较强,适合作为比赛与业务双重场景下的首选基线。如果后续还需要离线部署或在算力有限环境下上线,这类方法通常比复杂深度模型更容易维护。
2020-12 TensorFlow 决策森林 / Google 生态 TensorFlow Decision Forests 关键词:决策森林、结构化数据、可解释部署、边缘友好、工业集成。该案例属于生态标杆,而非赛题内项目。其参考价值在于提供了一条"结构化数据高性能模型 + 工程框架集成"的路线,适合需要把行业识别能力嵌入现有风控、审批或客户分层系统的团队。对于 OKVED detection,一套成熟方案往往不止停留在提交 CSV,而是要考虑如何批量推断企业行业、如何输出置信度、如何对低置信样本回流人工校验。决策森林类方案在这方面具备较好优势,既能利用复杂非线性关系,又便于产出特征重要性和规则级解释。
2023-11 隐私计算与联邦学习研究社区 Flower Federated Learning Framework 关键词:隐私保护、联邦学习、跨机构数据、多方协同、可信建模。该案例属于面向真实金融业务的生态标杆。OKVED 识别在现实中常常受限于数据孤岛,单一机构持有的交易视角并不完整,而跨银行、支付机构或税务侧联合建模又面临强监管约束。Flower 这类联邦学习框架的参考价值在于,为"行业识别模型在不直接汇聚原始交易数据的情况下协同训练"提供了可行原型。即使比赛本身不要求隐私保护,这类思路依然有现实意义,尤其适合数字金融、普惠信贷和合规风控场景,有助于把竞赛解法升级为可讨论的生产级架构。

总结

这类竞赛的实战意义,在于完整演示了从交易明细到行业标签的建模链路。无论采用 TF IDF 加线性分类器,还是结合统计聚合与更复杂的文本表示,决定效果上限的往往都是特征组织、验证设计和对混淆类别的分析能力,而不是单次提交的偶然分数。

放到真实项目中,OKVED 分类可以直接服务商户识别、客户画像补全、风控分层和自动化运营。比赛提供的是一个相对收敛的练习环境,真正值得沉淀的,是把行业识别方案做成可复用流程:数据清洗稳定、标签映射清楚、结果可解释、误判可复盘。

相关推荐
AI推荐率1 小时前
品牌的核心能力只写在图片里,公开资料该怎样补充文字解释?
人工智能
能源革命1 小时前
DeepAR(概率自回归模型)介绍
人工智能·数据挖掘·回归
IvorySQL1 小时前
PostgreSQL 日报|大模型破解在线校验和(9 月 15 日)
数据库·人工智能·postgresql
人工智能AI技术1 小时前
模型越强越翻车?GPT-6 旧配置踩坑深度避坑指南
人工智能
小酒星小杜1 小时前
【AI+Gpt-Image2.5】我偷偷把同事做成了虚拟角色,结果被发现了
人工智能·程序员·产品
ElfBoard1 小时前
作品展示|基于RK3588的复杂空间下自主导航无人机与多传感器 AI 融合环境监测分析
大数据·人工智能·单片机·嵌入式硬件·团队开发
hoaxxcj1 小时前
DeepSeek Harness 本地部署与第三方插件排障实录:从 fetch failed 到 preset not found
人工智能·windows·开源·ai agent·deepseek
鲜于言悠9051 小时前
AgentLoop
人工智能
猫哥随身wifi1 小时前
AI 手机越智能,随身网络越关键|AI 终端带来的网络新需求
网络·人工智能·智能手机