机器学习四种分类任务详解:二分类、多分类、多标签与多输出

📅 发布时间:2026/10/14 6:46:19
机器学习四种分类任务详解:二分类、多分类、多标签与多输出
1. 分类任务到底在分什么从标签结构说起刚接触机器学习的人十有八九是从分类任务入门的。手写数字识别、垃圾邮件判断、猫狗图片区分这些经典案例几乎贯穿了每一本教材的前三章。但真到了自己上手做项目很多人会卡在一个看似简单的问题上我手头这个任务到底属于哪一类分类标签该怎么组织评估指标该选哪个损失函数又该用哪种这些问题不搞清楚后面调参调得再勤快也是白搭。我自己就踩过这样的坑早期做一个文本情感分析的小项目标签是“正面、负面、中性”三类我下意识地把它当成二分类来处理用了一堆二分类的评估逻辑结果模型上线后表现和离线评估对不上排查了大半天才发现是任务类型判断错了评估口径整个偏了。所以这篇内容我想把机器学习里四种常见的分类任务类型彻底掰开揉碎讲一遍。这四种类型分别是二分类、多分类、多标签分类、多输出分类。它们看起来都是“给东西打标签”但标签的结构、样本的归属方式、模型输出的形式、损失函数的选择、评估指标的设计全都不一样。搞混了轻则指标失真重则整个建模方向跑偏。这篇文章适合谁看如果你刚开始做机器学习项目对分类任务的边界还比较模糊那这篇能帮你建立清晰的分类框架如果你已经做过一些项目但总是在评估指标和损失函数的选择上犹豫不决那这篇能帮你把每种任务对应的技术选型理清楚。我会尽量用生活化的例子来解释同时把每个环节的参数选择、实操要点、常见坑都摊开来讲。先给一个最直观的区分方式看一个样本能同时拥有几个标签以及标签之间是什么关系。二分类是“二选一”多分类是“多选一”多标签是“多选多每个标签独立”多输出是“多选多每个输出维度各有自己的候选集”。这个区分方式虽然粗糙但能帮你快速定位手头任务的大致归属。接下来我们逐个拆解。2. 四种分类任务的核心差异与选型逻辑2.1 二分类最基础但也最容易想当然二分类任务是指每个样本只能属于两个类别中的一个。比如判断一封邮件是不是垃圾邮件、一个交易是不是欺诈、一个用户会不会流失。标签通常用0和1表示模型输出一个概率值大于某个阈值就判为正类否则判为负类。听起来简单但二分类的坑一点都不少。第一个坑是类别不平衡。欺诈检测、疾病诊断这类场景正样本可能只占千分之一甚至更少。这时候如果你直接用准确率Accuracy来评估模型全预测为负类也能拿到99.9%的准确率但这个模型毫无用处。正确的做法是看精确率Precision、召回率Recall、F1值以及AUC-ROC曲线。具体选哪个取决于你的业务场景更怕误报还是更怕漏报。第二个坑是阈值选择。模型输出的是一个0到1之间的概率默认阈值是0.5但这个默认值在很多场景下并不合理。比如在疾病筛查中你可能希望召回率尽可能高那就把阈值调低宁可误报也不能漏报在垃圾邮件过滤中你可能希望精确率更高避免把正常邮件误判为垃圾邮件那就把阈值调高。阈值的选择不是一个技术问题而是一个业务问题需要和业务方一起确定。第三个坑是损失函数的选择。二分类最常用的损失函数是二元交叉熵Binary Cross-EntropyBCE。如果类别不平衡很严重可以考虑用Focal Loss它通过降低易分类样本的权重让模型更关注难分类的样本。另外加权BCE也是一种常见做法给少数类样本更高的权重。实操心得做二分类任务时先别急着上复杂模型。用逻辑回归跑一个基线看看AUC大概在什么水平。如果AUC已经不错了再考虑用XGBoost或神经网络去提升。很多时候特征工程带来的收益比换模型大得多。2.2 多分类互斥标签的组织方式多分类任务是指每个样本只能属于多个类别中的一个类别之间是互斥的。比如手写数字识别0到9共10类、新闻主题分类体育、财经、科技等、图像中的物体分类猫、狗、鸟等。注意多分类的关键特征是“互斥”——一个样本不可能同时属于两个类别。多分类的输出层通常用Softmax函数它把每个类别的得分转化为概率所有类别的概率之和为1。损失函数用分类交叉熵Categorical Cross-Entropy。如果标签是整数形式用稀疏分类交叉熵Sparse Categorical Cross-Entropy更省内存。多分类任务有几个需要特别注意的地方。第一是类别数量。如果类别数很多比如上千类Softmax的计算量会比较大这时候可以考虑层次Softmax或者负采样。第二是类别间的相似性。有些类别之间非常相似模型容易混淆。比如在细粒度图像分类中不同品种的狗长得都很像这时候需要更精细的特征提取或者引入注意力机制。第三是评估指标。多分类的评估不能只看整体准确率还要看每个类别的精确率、召回率和F1值特别是当类别不平衡时。混淆矩阵是必看的它能告诉你模型到底在哪些类别之间搞混了。2.3 多标签一个样本可以贴多个标签多标签分类是指一个样本可以同时属于多个类别。比如一篇新闻文章可以同时属于“科技”和“财经”两个主题一张图片可以同时包含“人”和“车”两个物体一首歌可以同时属于“流行”和“摇滚”两种风格。多标签任务的关键特征是标签之间不互斥每个标签都是一个独立的二分类问题。多标签的输出层通常用Sigmoid函数每个标签独立计算概率标签之间不竞争。损失函数用二元交叉熵对每个标签分别计算损失后求和或求平均。评估指标不能用普通的准确率而要用精确率、召回率、F1值以及mAPmean Average Precision等专门为多标签设计的指标。多标签任务最容易被忽视的问题是标签相关性。虽然每个标签独立预测但标签之间可能存在相关性。比如“科技”和“财经”经常同时出现“体育”和“财经”同时出现的概率就低一些。如果能把标签相关性建模进去模型效果会更好。常见做法有分类器链Classifier Chains和标签幂集Label Powerset但这两个方法在标签数量多时计算量会爆炸。更实用的做法是在神经网络中共享底层特征让不同标签的预测共享信息。2.4 多输出每个输出维度各有各的候选集多输出分类是多标签分类的推广但更容易被混淆。多输出分类是指每个样本有多个输出维度每个输出维度有自己的候选类别集合且不同输出维度的候选集可以不同。比如一张图片你需要同时预测它的颜色红、绿、蓝和形状圆、方、三角这就是一个多输出分类任务两个输出维度各有各的候选集。多输出分类和多标签分类的区别在于多标签分类中所有标签共享同一个候选集都是“有”或“无”而多输出分类中每个输出维度有自己的候选集。多输出分类的输出层通常是为每个输出维度分别接一个Softmax损失函数是各个维度交叉熵的加权和。多输出任务在实际中并不少见比如在推荐系统中同时预测用户对物品的评分等级和是否会复购在自动驾驶中同时预测交通标志的类型和颜色。它的难点在于输出维度之间的相关性建模和损失权重的平衡。如果某个维度的损失远大于其他维度模型可能会偏向那个维度导致其他维度表现差。这时候需要调整各维度损失的权重或者用不确定性加权的方法自动平衡。2.5 四种任务的对比与选型速查任务类型样本标签数标签关系输出层损失函数典型评估指标二分类1个二选一互斥Sigmoid二元交叉熵AUC、F1、精确率、召回率多分类1个多选一互斥Softmax分类交叉熵准确率、混淆矩阵、宏/微F1多标签多个每个独立不互斥Sigmoid二元交叉熵mAP、精确率、召回率、F1多输出多个各有候选集维度间独立各维度Softmax各维度交叉熵加权和各维度分别评估这张表建议存下来下次拿到任务时先对照一下能省不少事。3. 从标签到损失函数每种任务的实操落地细节3.1 标签编码别在第一步就埋雷标签编码是分类任务的第一步也是最容易埋雷的地方。二分类的标签通常编码为0和1这个没什么好说的。多分类的标签有两种编码方式整数编码如0、1、2和独热编码One-Hot。整数编码省内存适合类别数多的场景独热编码直观适合类别数少的场景。但要注意如果你用整数编码损失函数要选稀疏分类交叉熵如果用独热编码损失函数选分类交叉熵。这两个搞混了训练时会直接报错或者loss不收敛。多标签的标签编码是一个二进制向量每个位置对应一个标签1表示有0表示没有。比如标签集是[科技, 财经, 体育]一个样本的标签是[1, 1, 0]表示它同时属于科技和财经。多输出分类的标签编码稍微复杂一些每个输出维度都要单独编码可以理解为多个多分类标签的组合。注意事项标签编码一定要在数据预处理阶段就确定好并且保存下来。训练集、验证集、测试集必须用同一套编码规则。我见过有人训练时用整数编码推理时用独热编码结果模型输出完全对不上排查了半天才发现是编码不一致。3.2 输出层设计Sigmoid和Softmax的选择逻辑输出层的选择直接决定了模型的输出形式。二分类和多标签用Sigmoid多分类和多输出用Softmax。这个选择不是随意的而是由标签的互斥性决定的。Sigmoid函数把每个输出节点的值独立地映射到0到1之间适合标签之间不互斥的场景。Softmax函数把所有输出节点的值映射到一个概率分布上所有节点之和为1适合标签之间互斥的场景。如果你在多分类任务中误用了Sigmoid模型可能会同时预测多个类别为高概率这不符合互斥的假设如果你在多标签任务中误用了Softmax模型会被迫在标签之间做取舍导致某些标签永远无法被激活。多输出分类的输出层设计需要特别注意每个输出维度都要接一个独立的Softmax而不是所有维度共享一个Softmax。共享Softmax会导致不同维度的输出相互竞争这是错误的。3.3 损失函数从交叉熵到Focal Loss的选型损失函数的选择和输出层是配套的。二分类和多标签用二元交叉熵多分类和多输出用分类交叉熵。但在实际项目中标准交叉熵不一定是最优选择。当类别不平衡时Focal Loss是一个很好的替代方案。它通过引入一个调节因子降低易分类样本的损失权重让模型更关注难分类的样本。Focal Loss最初是在目标检测中提出的但它在任何类别不平衡的分类任务中都能用。另一个选择是加权交叉熵给少数类样本更高的权重权重通常设为类别频率的倒数。多输出分类的损失函数需要特别注意各维度损失的平衡。如果某个维度的损失远大于其他维度模型会偏向优化那个维度。常见的做法是给每个维度的损失乘以一个权重权重可以手动设置也可以用不确定性加权的方法自动学习。3.4 评估指标不同任务不能混用同一套标准评估指标的选择必须和任务类型匹配。二分类看AUC、F1、精确率、召回率多分类看准确率、混淆矩阵、宏/微F1多标签看mAP、精确率、召回率、F1多输出看各维度分别的评估指标。这里重点说一下多分类的宏F1和微F1。宏F1是先算每个类别的F1再取平均它对少数类更敏感微F1是先算全局的TP、FP、FN再算F1它对多数类更敏感。如果类别不平衡宏F1更能反映模型在少数类上的表现。多标签的mAP是先把每个标签的AP算出来再取平均它同时考虑了精确率和召回率是多标签任务最常用的指标。实操心得评估指标一定要在项目开始前就和业务方对齐。我见过一个项目技术团队用AUC评估模型业务方看的是召回率结果模型上线后业务方觉得效果很差因为AUC高不代表召回率高。指标对齐这件事怎么强调都不为过。4. 完整实操流程从数据到模型评估的落地路径4.1 数据准备与标签质量检查数据准备阶段最重要的事情是标签质量检查。分类任务的标签往往来自人工标注或规则生成难免有噪声。标签噪声对模型的影响很大特别是多标签和多输出任务一个样本的多个标签中只要有一个错了就会影响训练。检查标签质量的方法有几种一是抽样人工复核特别是对模型预测置信度低的样本二是看标签分布如果某个类别的样本特别少或者特别多可能是标注规则有问题三是看标签之间的相关性如果两个本应互斥的标签经常同时出现说明标注可能有问题。数据划分也要注意。训练集、验证集、测试集的划分要保证标签分布一致特别是类别不平衡时要用分层抽样Stratified Sampling。多标签任务的分层抽样更复杂可以按标签组合分层或者用迭代分层的方法。4.2 基线模型搭建与快速验证基线模型的作用是快速验证任务是否可做以及数据质量如何。二分类和多分类可以用逻辑回归或决策树做基线多标签可以用One-Vs-Rest的逻辑回归多输出可以每个维度单独建一个模型。基线模型不需要调参用默认参数跑一遍就行。重点看两个东西一是评估指标是否显著高于随机猜测二是混淆矩阵或标签预测分布是否合理。如果基线模型的表现和随机猜测差不多说明特征有问题或者标签有问题需要回头检查数据。4.3 模型训练中的关键参数与调试技巧模型训练阶段有几个关键参数需要关注。学习率是最重要的太大容易震荡太小收敛慢。批量大小影响训练稳定性和内存占用一般从32或64开始试。训练轮数看验证集损失如果验证集损失开始上升就停这是早停Early Stopping的基本逻辑。多标签和多输出任务的调试更复杂。多标签任务要关注每个标签的预测阈值默认0.5不一定最优可以针对每个标签单独调阈值。多输出任务要关注各维度损失的平衡如果某个维度损失一直降不下来可能是权重设得太低或者那个维度的特征不够。注意事项多标签任务中标签之间的相关性会影响模型表现。如果标签高度相关可以尝试在输出层之前加一个共享的特征表示层让不同标签的预测共享信息。如果标签之间几乎独立那就各自独立预测不用强行建模相关性。4.4 模型评估与结果解读模型评估阶段除了看整体指标还要看细分指标。多分类任务要看每个类别的F1找出模型表现差的类别分析是数据问题还是模型问题。多标签任务要看每个标签的AP找出预测差的标签。多输出任务要每个维度分别评估。结果解读时要结合业务场景。比如在医疗诊断中召回率比精确率重要因为漏诊的代价远大于误诊在垃圾邮件过滤中精确率比召回率重要因为把正常邮件误判为垃圾邮件的代价很大。这些业务逻辑要在评估阶段就考虑进去而不是等模型上线后再调整。5. 常见问题与排查技巧实录5.1 损失不收敛或震荡怎么办损失不收敛或震荡是训练中最常见的问题。排查思路如下先看学习率是不是太大可以试着降低一个数量级再看数据有没有归一化特别是神经网络输入数据不归一化很容易导致训练不稳定然后看标签编码有没有问题比如多分类用了二分类的损失函数最后看模型结构输出层和损失函数是否匹配。多标签任务中如果损失震荡可能是标签不平衡导致的。可以试试Focal Loss或者加权BCE。多输出任务中如果某个维度的损失震荡可能是那个维度的权重太大可以调低权重试试。5.2 评估指标很好但上线效果差这个问题通常有三个原因。一是训练集和线上数据分布不一致比如训练集是历史数据线上是新数据分布漂移了。二是评估指标和业务指标不一致比如离线用AUC评估线上看的是点击率两者不相关。三是数据泄露训练时用了未来信息离线评估虚高。排查方法先看训练集和线上数据的特征分布用KS检验或PSI指标对比再看离线指标和线上指标的相关性如果相关性低说明离线评估不可靠最后检查特征工程流程确保没有用到未来信息。5.3 多标签任务中标签相关性怎么处理标签相关性是多标签任务的核心难点。如果标签之间高度相关可以用分类器链的方法把前一个标签的预测结果作为后一个标签的特征。但分类器链的计算量随标签数量线性增长标签多时不适合。另一种方法是标签幂集把每个标签组合当成一个新类别但组合数随标签数量指数增长只适合标签很少的场景。更实用的方法是在神经网络中共享底层特征让不同标签的预测共享信息。具体做法是在输出层之前加一个共享的全连接层然后每个标签接一个独立的输出节点。这样模型能学到标签之间的相关性又不会增加太多计算量。5.4 多输出任务中各维度损失不平衡怎么调多输出任务中各维度损失不平衡是常见问题。如果某个维度的损失远大于其他维度模型会偏向优化那个维度。解决方法有几种一是手动调整各维度损失的权重给损失大的维度更低权重二是用不确定性加权的方法让模型自动学习各维度的权重三是分阶段训练先训练损失大的维度再联合训练。实操心得多输出任务的权重调整没有万能公式需要根据具体任务试。我一般先从等权重开始看各维度损失的量级然后按损失量级的倒数设置权重再微调。这个过程可能需要试几轮但比盲目调参有效得多。5.5 常见问题速查表问题现象可能原因排查方法解决方案损失不收敛学习率太大、数据未归一化、损失函数不匹配降低学习率、检查数据分布、核对输出层与损失函数调整学习率、归一化数据、修正损失函数损失震荡批量太小、标签不平衡、权重设置不当增大批量、检查标签分布、检查损失权重增大批量、用Focal Loss、调整权重评估指标好但上线差数据分布漂移、指标不一致、数据泄露对比训练与线上分布、核对业务指标、检查特征流程重新采样、对齐指标、修正特征工程多标签预测差标签相关性未建模、阈值不合理检查标签相关性、调每个标签的阈值共享特征层、单独调阈值多输出某维度差损失权重不平衡、特征不足检查各维度损失量级、检查特征调整权重、补充特征6. 几个容易混淆的边界场景与个人经验6.1 多分类和多标签的边界互斥性判断多分类和多标签最容易混淆的地方是互斥性判断。有些任务看起来像多分类实际上是多标签。比如一部电影的题材分类如果规定一部电影只能有一个题材那就是多分类如果允许一部电影同时属于多个题材那就是多标签。这个判断不能凭感觉要和业务方确认。还有一种情况是标签之间有层次关系。比如“科技”下面有“人工智能”和“半导体”一个样本可以同时属于“科技”和“人工智能”但“人工智能”和“半导体”是互斥的。这种层次分类任务可以用层次Softmax或者多标签的方法来处理具体选哪种取决于业务需求。6.2 多输出和多标签的边界候选集是否相同多输出和多标签的边界在于每个输出维度的候选集是否相同。如果所有输出维度的候选集都是“有/无”那就是多标签如果不同输出维度有不同的候选集那就是多输出。比如同时预测颜色和形状颜色有红绿蓝形状有圆方三角候选集不同所以是多输出。多输出任务在实际中往往被当成多个独立的多分类任务来处理但这样会忽略输出维度之间的相关性。如果输出维度之间相关比如颜色和形状在自然界中有关联红色的圆苹果、黄色的弯香蕉那联合建模会更好。6.3 个人经验任务类型判断错了有多坑我自己踩过的最大的坑是把一个多标签任务当成了多分类。当时做的是一个内容标签系统一篇内容可以同时属于多个标签但我一开始用了Softmax输出层导致模型被迫在标签之间做取舍预测出来的标签总是只有一个。后来改成Sigmoid输出层每个标签独立预测效果立刻好了很多。这个坑让我意识到任务类型的判断不是学术问题而是直接影响模型结构和损失函数选择的工程问题。判断错了后面所有工作都是白费。所以我现在拿到一个新任务第一件事就是确认标签结构一个样本能有多少个标签标签之间互斥吗不同标签的候选集相同吗这三个问题回答清楚了任务类型也就确定了。6.4 后续可以扩展的方向这四种分类任务是机器学习分类问题的基础框架但实际项目中的分类任务往往更复杂。比如标签有层次结构、标签之间有依赖关系、样本有多个模态、任务需要在线学习等。这些复杂场景可以在掌握四种基础任务类型后逐步深入。另外分类任务的评估和部署也有很多值得深挖的地方。比如如何设计在线评估指标、如何处理概念漂移、如何做模型监控和告警。这些工程问题在实际项目中往往比模型本身更重要但容易被忽视。最后再分享一个小技巧做分类任务时先把标签分布画出来看看。如果标签分布严重不平衡先别急着建模想想能不能通过采样、加权或者问题重构来缓解。很多时候标签分布的问题比模型选择的问题更影响最终效果。