3. 分类分级模型选型流程:从需求到模型

做数据分类分级,最怕一上来就调模型。我见过不少团队,连业务要分几级都没搞清楚,直接拿BERT开搞,最后精度上去了,业务说“这分级不对”——全白干。这套流程我踩过三次坑才总结出来,今天一次性讲透。

核心原则:需求先于模型,业务定义第一,数据质量决定上限。

3.1 需求分析阶段

为什么把需求分析放最前面?你想想看,分类分级的“类”和“级”是谁定的?是业务规则,不是算法。我在一个金融项目中遇到过,业务要求把“客户姓名”标记为敏感级别2,但模型自己学到的分布却把“客户姓名”归到公开类——因为公开数据里名字出现最多。这就是需求没对齐。

需求分析要输出三样东西:

  • 分级体系:分为几级?描述是什么?例如 L1(公开)、L2(内部)、L3(敏感)、L4(绝密)。
  • 分类粒度:是按字段分、按表分、还是按记录分?粒度越细,模型复杂度越高。
  • 误判容忍度:误报(把敏感标为非敏感)能接受吗?漏报(把非敏感标为敏感)呢?这直接决定模型阈值怎么调。
我曾经踩过的坑:一次项目业务说“按字段分级就行”,结果落地后发现同一字段(如“备注”)在不同表中包含完全不同类型的敏感内容。最后只能回炉重做——需求必须写清楚“字段值是否跨表统一”。

3.2 数据探索与预处理

需求定了,别急着跑模型。先看看数据长什么样。我习惯先跑一个简单的数据概览脚本:

import pandas as pd

df = pd.read_parquet("sample.parquet")
print("行数:", len(df))
print("字段数:", len(df.columns))
print("空值率:", df.isnull().mean().sort_values(ascending=False))

# 快速看字段值的长度分布
for col in df.columns[:5]:
    print(f"{col}: 均值长度 {df[col].astype(str).str.len().mean():.1f}")

这一步要重点关注:

  • 空值太多的字段,要么补全,要么排除。
  • 字段值长度差异极大(比如“姓名”和“身份证号”长度一样),可能是格式混杂。
  • 中文/英文混排,影响分词效果。
小技巧:对文本字段先做一次“敏感词匹配”快速标注少量样本,用来评估后续模型的基线和召回率。

3.3 候选模型筛选

模型怎么选?我习惯用一张表来对比。下面这张表是我自己整理的,每次选型都拿出来过一遍:

方法 适用场景 训练成本 精度 可解释性
规则引擎(正则+关键词) 格式固定字段(身份证、手机号等) 低 高(匹配即正确) 极高
传统ML(TF-IDF + LR/XGB) 短文本、有标注数据、需泛化 中 中高 中
深度学习(BERT/ALBERT) 长文本、语境敏感、标注充足 高 高 低
大语言模型(/LLM) 零样本或少样本、规则频繁变动 极高(API/微调) 中高 低

说白了,选模型就是选成本与精度的平衡点。我个人的建议:先规则,再ML,最后考虑DL。规则搞不定再加ML,ML搞不定再上BERT。一步到位上大模型,除非你预算无上限。

3.4 模型评估与验证

评估不能只看准确率。分类分级任务里,漏报的代价远大于误报。我一般用以下指标组合:

  • 召回率(尤其是敏感级别的召回)
  • 精确率(控制误报数量)
  • F1-score(综合平衡)
  • 混淆矩阵(看哪些级别容易被混)

另外别忘了做交叉验证。我习惯于把数据按“数据源”做分层抽样,保证训练集和测试集来自不同的业务表,否则容易高估泛化能力。

from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import classification_report

skf = StratifiedKFold(n_splits=5, shuffle=True)
for train_idx, val_idx in skf.split(X, y):
    X_train, X_val = X[train_idx], X[val_idx]
    y_train, y_val = y[train_idx], y[val_idx]
    model.fit(X_train, y_train)
    y_pred = model.predict(X_val)
    print(classification_report(y_val, y_pred, target_names=class_names))

3.5 落地部署与持续监控

模型选出来、调参完,只完成了30%。剩余70%在落地。我经历过的几个重要事项:

  • 模型接口设计:建议返回概率值和分级结果,方便下游做二次筛选。
  • 阈值可配置:业务方可能随时要求“把敏感级别L3的阈值从0.8降到0.7”,不要在代码里hardcode。
  • 数据漂移监控:部署后每周统计字段长度分布、词频分布,如果变化超过阈值,触发重训练。
最佳实践:我建议把模型选型全流程画成一张图,团队所有人都能一目了然。下面这张SVG图就是本章知识体系的缩影。
分类分级模型选型全流程 需求分析 数据探索与预处理 候选模型筛选 模型评估与验证 落地部署与监控 评估不通过 → 重新筛选 输出:可落地的分级模型 + 阈值配置 + 监控方案 业务驱动 数据驱动 工程驱动

全流程的核心就是“需求→数据→模型→评估→部署”,每一步都有坑。但只要你按照这个流程走,至少能保证落地时不出大篓子。下次遇到分类分级任务,别急着调参,先问自己一句:需求真的对齐了吗?