用途:针对表格数据的多标签分类任务,即每行可同时拥有零个、一个或多个非互斥标签(如帖子标签、商品属性、患者疾病、内容审核类别)。每个标签应有至少数百条正样本,否则稀有标签效果不佳。每行仅一个标签应改用多分类技能,恰好两个标签应改用二分类技能,超过约1000个标签的极端多标签场景不在本技能范围内。
主要能力:默认方案是用 MultiOutputClassifier 包装 XGBClassifier,为每个标签拟合一个独立的二分类模型,简单、快速且有竞争力。当标签之间存在相关且顺序有意义时,可改用 ClassifierChain,它按顺序拟合N个分类器,每个分类器可看到前序分类器的预测作为额外特征;链顺序会影响结果,常见做法是训练多个随机顺序的链并平均预测。
关键要点:目标 Y 是形状为 (n_samples, n_labels) 的矩阵,而非向量。主指标为汉明损失(越低越好),而非子集准确率;后者过于严格,容易误导。F1 有四种平均策略:macro、micro、weighted、samples,默认使用 macro 以暴露稀有标签失败。应计算标签条件共现矩阵 P(label_j | label_i),判断标签是否相关:若接近边际分布则独立,用 MultiOutputClassifier;若明显偏高则考虑 ClassifierChain。每个标签应单独监控 F1 并记录到 MLflow。
使用方式:项目包含 data/、src/train.py(ibis 读取 → MultiOutputClassifier(XGBClassifier) → MLflow)、src/predict.py(重新加载并返回每行标签向量与每标签概率)、src/plots.py(标签平衡、共现、每标签指标、基数)等。数据访问使用 ibis 连接 DuckDB 并读取 Parquet,选取 feature_ 前缀的特征列与 label_ 前缀的标签列。MLflow 记录参数、指标与制品。
限制与常见陷阱:不要以子集准确率作为主指标;不要对每行使用单一阈值而应按标签调阈值;记得设置 n_jobs=-1 并行训练;F1 计算需设置 zero_division=0;MultiOutputClassifier 不便为每个标签单独设置 scale_pos_weight,可用全局 sample_weight 或手工逐标签训练;注意多标签与多分类的 Y 形状差异;监控真实与预测的标签基数漂移,以发现阈值问题。