1. 项目概述:从“预测”到“决策”的算法分水岭

在机器学习的入门路上,几乎所有人都会在同一个路口感到困惑:我手头这个问题,到底该用回归还是分类?这不仅仅是选个算法那么简单,它决定了你整个建模的思考方式、数据预处理的方向,以及最终如何衡量模型的好坏。我见过不少新手,兴致勃勃地收集了数据,却因为一开始选错了“路”,导致模型效果一塌糊涂,最后还得从头再来。

简单来说, 回归 分类 是监督学习的两大核心任务,它们都致力于从数据中学习规律,但输出的“东西”截然不同。你可以把回归想象成预测一个 连续的量 ,比如预测明天的气温(25.6℃)、一套房子的价格(358.7万元),或者用户观看视频的时长(125.3秒)。它的输出是一个可以在数轴上任意取值的数字。而分类,则是预测一个 离散的标签 ,比如判断一封邮件是“垃圾邮件”还是“正常邮件”,一张图片是“猫”还是“狗”,一个客户是“会流失”还是“不会流失”。它的输出是有限个类别中的一个。

这个根本性的区别,引出了后续一系列技术选型、损失函数设计、评估指标的不同。搞懂它,是构建有效神经网络模型的第一步,也是避免在错误方向上浪费大量时间的关键。无论你是刚入门的数据科学爱好者,还是希望巩固基础的从业者,理清这条分界线都至关重要。

2. 核心概念辨析:回归与分类的本质差异

2.1 输出空间:连续值与离散类别的根本对立

这是最直观、也最本质的区别。我们用一个具体的例子来感受一下。

假设我们正在开发一个智能健康手环的应用。我们收集了用户的心率、步数、睡眠时长等数据。

  • 回归任务 :我们想 预测用户今天消耗的具体卡路里数 。模型需要输出一个像 485.6 这样的具体数值。这个数值理论上可以是 200、500、800.5,在合理范围内是连续的。我们关心的是预测值与真实值之间的“距离”有多近。
  • 分类任务 :我们想 判断用户今天的活动强度属于哪个等级 ,比如 ["低强度", “中等强度”, “高强度”] 。模型需要输出这三个标签中的一个。输出是离散的、有限的几个选项。我们关心的是预测的“类别”是否正确。

从数学上看,回归模型的输出空间是实数集 R 或其子集,而分类模型的输出空间是一个有限的集合 {C₁, C₂, ..., Cₖ} 。这个差异直接决定了神经网络最后一层的设计。

2.2 目标与损失函数:如何定义“错误”

模型如何知道自己预测得对不对?靠损失函数。损失函数量化了预测值与真实值之间的差异,模型训练的目标就是最小化这个损失。

  • 回归的损失函数 :衡量的是 数值上的差距 。最常用的是 均方误差
    • 公式 MSE = (1/n) * Σ(y_i - ŷ_i)²
    • 解读 :计算所有样本的真实值 y_i 与预测值 ŷ_i 之差的平方和,再求平均。平方操作放大了大误差的惩罚,使得模型对异常值更敏感。它的输出是一个非负的连续值,越小越好。
    • 为什么用MSE? 在假设误差服从高斯分布的前提下,最小化MSE等价于进行最大似然估计,这在数学上是优雅且有效的。
  • 分类的损失函数 :衡量的是 概率分布的差异 。最常用的是 交叉熵损失
    • 二分类公式(Binary Cross-Entropy) BCE = - (1/n) * Σ [y_i * log(ŷ_i) + (1 - y_i) * log(1 - ŷ_i)]
    • 多分类公式(Categorical Cross-Entropy) CCE = - (1/n) * Σ Σ y_i,c * log(ŷ_i,c)
    • 解读 :这里的 ŷ_i 不再是直接的类别标签,而是模型预测的属于某个类别的 概率 。交叉熵衡量的是真实概率分布(通常是 one-hot 编码,如 [0, 0, 1] 表示第三类)与预测概率分布之间的“距离”。当预测概率完全正确时(对于真实类别预测为1,其他为0),交叉熵为0;预测越离谱,损失越大。
    • 为什么用交叉熵? 它源于信息论,非常适合于衡量两个概率分布之间的差异。在分类中,我们将问题转化为“模型预测的类别概率分布有多接近真实的分布”,交叉熵是衡量这个接近程度的天然工具。

注意 :选择损失函数不是随意的。如果你在分类问题上错误地使用了MSE,模型会很难收敛,或者收敛到一个很差的解,因为MSE对于概率的惩罚方式与分类问题的目标不匹配。

2.3 评估指标:如何判断模型好坏

模型训练好了,我们用什么标准来评判它?回归和分类的“成功”标准完全不同。

  • 回归常用指标
    • 均方根误差 :RMSE = √MSE。由于开了根号,它的量纲和原始数据一致,更易于解释。比如房价预测的RMSE是10万元,意味着平均预测误差在10万左右。
    • 平均绝对误差 :MAE = (1/n) * Σ|y_i - ŷ_i|。对异常值不如RMSE敏感,更能反映“典型”误差。
    • 决定系数 R² :表示模型能够解释的目标变量方差的比例。越接近1越好,表示模型拟合度越高。
  • 分类常用指标
    • 准确率 Accuracy = (预测正确的样本数) / (总样本数) 。最直观,但在类别不平衡的数据集上会失真(比如99%的样本都是负类,一个全预测负类的模型准确率也有99%,但毫无用处)。
    • 精确率与召回率 :这对指标在二分类中尤为重要,尤其是在关注正类(如疾病检测、欺诈识别)时。
      • 精确率 Precision = TP / (TP + FP) 。在所有 预测为正 的样本中,有多少是 真的正 。追求“宁缺毋滥”。
      • 召回率 Recall = TP / (TP + FN) 。在所有 真实为正 的样本中,有多少被 成功找出 。追求“宁可错杀,不可放过”。
    • F1分数 F1 = 2 * (Precision * Recall) / (Precision + Recall) 。精确率和召回率的调和平均数,试图在两者间取得平衡。
    • 混淆矩阵 :一个表格,清晰展示了TP、FP、TN、FN的数量,是所有分类指标的基础。

3. 神经网络中的实现架构

理解了本质区别,我们来看在神经网络中如何具体实现这两种任务。关键就在于 网络的最后一层

3.1 回归网络:线性输出与激活函数

回归网络的输出层通常非常简单。

  1. 神经元数量 :输出层神经元的数量等于你要预测的连续值维度。预测房价(1个值)就用1个神经元;预测物体在图像中的边界框(x, y, width, height,4个值)就用4个神经元。
  2. 激活函数 通常不使用任何激活函数,或者使用线性激活函数 。因为我们需要输出任意范围的实数值。如果使用了Sigmoid或Tanh,输出会被限制在(0,1)或(-1,1)之间,无法预测更大范围的数值。
  3. 损失函数 :如前所述,使用 MSE MAE

一个简单的房价预测网络架构示例

输入层 (特征如:面积、房龄、地段等)
        ↓
    全连接层 (ReLU激活)
        ↓
    全连接层 (ReLU激活)
        ↓
输出层 (1个神经元,无激活函数)  --> 输出预测房价
        ↓
        MSE Loss

3.2 分类网络:从得分到概率的转换

分类网络的核心是将网络最后一层输出的原始“得分”或“逻辑值”,转化为可以解释为“概率”的形式。

  1. 神经元数量 :输出层神经元的数量等于 类别数 。对于二分类,可以用1个神经元(输出属于正类的概率),也可以用2个神经元(输出属于两个类别的概率,更通用)。对于多分类(K类),必须使用K个神经元。
  2. 激活函数 :这是与回归最大的不同。
    • 二分类 :最后一层使用 Sigmoid函数 。它将单个神经元的输出压缩到(0,1)区间,可以解释为属于正类的概率。
    • 多分类 :最后一层使用 Softmax函数 。它对K个神经元的输出进行运算,确保所有输出值之和为1,且每个值都在(0,1)区间。这样,每个输出值就可以解释为样本属于对应类别的概率。
    • 公式 Softmax(z_i) = exp(z_i) / Σ_j exp(z_j)
  3. 损失函数 :对应地,使用 二元交叉熵损失 分类交叉熵损失

一个图像多分类网络架构示例

输入层 (图像像素)
        ↓
    卷积层 + 池化层
        ↓
    展平层
        ↓
    全连接层 (ReLU激活)
        ↓
输出层 (10个神经元,对应10个类别) --> 输出原始逻辑值
        ↓
    Softmax激活函数 --> 输出概率分布 [0.1, 0.05, ..., 0.7]
        ↓
    Categorical Cross-Entropy Loss

实操心得 :在搭建网络时,很多深度学习框架(如PyTorch、TensorFlow Keras)将 Softmax 和交叉熵损失合并成了一个更数值稳定的计算单元。例如,在PyTorch中,多分类问题的最后一层通常 不显式使用Softmax ,而是直接使用 nn.Linear 输出逻辑值,然后在损失函数中使用 nn.CrossEntropyLoss ,这个损失函数内部已经包含了Softmax计算。如果你在最后一层又加了Softmax,反而会导致计算错误。这是一个非常常见的坑。

4. 实战场景与模型选择指南

理论说再多,不如看实战。我们通过几个典型场景,来感受如何做选择,以及一些高级的变体。

4.1 典型回归场景与模型变体

  1. 金融领域:股价预测

    • 任务 :基于历史开盘价、收盘价、成交量、市场情绪等数据,预测未来某天的股价。
    • 模型考量 :这是一个经典的时序回归问题。简单的全连接网络可能抓不住长期依赖。更合适的可能是 循环神经网络 长短期记忆网络 ,它们能更好地处理序列数据。损失函数常用MSE,但金融数据噪声大,有时也会考虑Huber损失,它对异常值不那么敏感。
  2. 自动驾驶:方向盘转角预测

    • 任务 :根据车载摄像头捕捉的道路图像,预测方向盘应该转动的角度(一个连续值,如-30.5度)。
    • 模型考量 :这是一个从图像到连续值的回归问题。通常使用 卷积神经网络 作为主干来提取图像特征,然后在最后接一个或多个全连接层,输出一个代表角度的数值。这里MSE是常用的损失函数。
  3. 气象预测:降水量预测

    • 任务 :基于卫星云图、气压、温度等网格数据,预测未来24小时的总降水量(毫米)。
    • 模型考量 :输入可能是时空数据。可以使用 卷积LSTM 这类结合了CNN和RNN优势的架构。输出是一个非负的连续值,可以在输出层使用 ReLU 作为激活函数,确保预测值不为负。

4.2 典型分类场景与模型变体

  1. 计算机视觉:图像分类

    • 任务 :识别图片中的物体(如ImageNet竞赛:1000个类别)。
    • 模型考量 :这是CNN的统治领域。从经典的ResNet、EfficientNet到现在的Vision Transformer,都是为此而生。输出层神经元数等于类别数,使用Softmax和交叉熵损失。 数据增强 (旋转、裁剪、色彩抖动)是提升模型泛化能力的关键技巧。
  2. 自然语言处理:情感分析

    • 任务 :判断一段影评是“正面”还是“负面”(二分类),或是“愤怒”、“高兴”、“悲伤”等(多分类)。
    • 模型考量 :对于文本序列,可以使用 RNN、LSTM ,或者现在更主流的基于 Transformer 的模型(如BERT的微调)。将文本编码后,通过一个全连接层映射到类别空间,再用Softmax输出概率。
  3. 异常检测:欺诈交易识别

    • 任务 :根据交易时间、金额、地点、商户类型等,判断一笔交易是否“欺诈”。
    • 模型考量 :这通常是一个极端类别不平衡的二分类问题(正常交易远多于欺诈交易)。直接训练模型容易偏向多数类。此时需要:
      • 损失函数层面 :使用 带权重的交叉熵损失 ,给少数类(欺诈)更高的惩罚权重。
      • 数据层面 :采用 过采样 欠采样 技术。
      • 评估指标 :绝不能只看准确率!必须重点关注 精确率、召回率 F1分数 ,并分析 混淆矩阵 。有时为了抓住更多欺诈,宁愿接受精确率稍低,也要保证高召回率。

4.3 模糊地带与特殊任务

有些问题初看像分类,细想又像回归,或者需要更复杂的输出。

  1. 序数回归 :预测电影的星级(1星到5星)。输出是离散的,但有明确的顺序(5星 > 4星)。这既不是简单的多分类(忽略了顺序信息),也不是标准的回归(输出是离散的)。一种处理方法是将它视为多分类,但使用能利用顺序信息的损失函数;另一种是将其视为回归,然后将连续输出四舍五入到最近的整数星级。

  2. 多标签分类 :给一张图片打上多个标签,如“沙滩”、“日落”、“人物”、“狗”。一个样本可以同时属于多个类别。这不再是互斥的多分类。此时, 输出层的每个神经元对应一个标签,并使用Sigmoid激活函数 (而不是Softmax),因为每个标签的判断是独立的。损失函数则使用对每个标签计算的二元交叉熵损失的总和。

  3. 目标检测 :这是计算机视觉中的核心任务,它完美地结合了分类和回归。模型需要:

    • 分类 :识别边界框内是什么物体(如“人”、“车”、“狗”)。
    • 回归 :预测物体边界框的精确位置(通常是中心点坐标和宽高,4个连续值)。
    • 像YOLO、Faster R-CNN这类模型,其输出层是混合的,一部分神经元用Softmax做分类,另一部分神经元做线性回归预测坐标,并使用复合损失函数(如分类损失 + 回归损失)。

5. 从零开始的决策流程图与避坑指南

当你拿到一个新问题时,可以遵循以下流程图来决策:

开始
  ↓
你的目标是预测一个连续数值吗? (如价格、温度、数量)
  ├── 是 ──> 选择回归模型
  │         ├── 输出层:神经元数=预测值维度,无激活或线性激活
  │         ├── 损失函数:MSE / MAE
  │         └── 评估指标:RMSE, MAE, R²
  │
  └── 否 ──> 你的目标是预测一个离散的类别/标签吗?
           ├── 是 ──> 进入分类分支
           │         ├── 类别间互斥吗? (一个样本只属一类)
           │         │   ├── 是 ──> 多分类
           │         │   │         ├── 输出层:神经元数=类别数,使用Softmax
           │         │   │         ├── 损失函数:分类交叉熵
           │         │   │         └── 评估指标:准确率、混淆矩阵、F1
           │         │   │
           │         │   └── 否 ──> 多标签分类
           │         │               ├── 输出层:神经元数=标签数,每个用Sigmoid
           │         │               ├── 损失函数:二元交叉熵(求和)
           │         │               └── 评估指标:按标签评估精确率/召回率
           │         │
           │         └── 只有两个互斥类别吗?
           │             ├── 是 ──> 二分类
           │             │         ├── 输出层:1个神经元+Sigmoid,或2个神经元+Softmax
           │             │         ├── 损失函数:二元交叉熵
           │             │         └── 评估指标:准确率、精确率、召回率、AUC-ROC
           │             │
           │             └── 否 ──> 返回多分类
           │
           └── 否 ──> 可能是更复杂的任务(如检测、分割、生成),需专门设计

5.1 十大常见陷阱与解决方案

在实际项目中,即使选对了回归或分类,依然会踩很多坑。以下是我总结的常见问题:

问题现象 可能原因 排查与解决思路
回归模型预测值全集中在某个常数附近 1. 学习率设置过大,模型震荡无法收敛。
2. 数据未标准化/归一化,特征尺度差异巨大,导致梯度更新不稳定。
3. 网络结构太深或太浅,无法捕捉模式。
4. 损失函数选择不当(如分类问题误用MSE)。
1. 绘制损失曲线,观察是否震荡或下降缓慢,调整学习率(尝试减小10倍)。
2. 检查输入数据,对数值型特征进行标准化(减均值除方差)或归一化(缩放到[0,1])。
3. 从简单模型(如单层线性回归)开始,确保基线有效,再逐步加深网络。
4. 再次确认问题本质是回归还是分类!
分类模型准确率很高(如99%),但实际应用效果极差 类别极度不平衡 。模型学会了永远预测多数类,就能获得高准确率,但对少数类的预测完全失败。 1. 查看混淆矩阵,确认是否所有预测都是同一类。
2. 使用过采样、欠采样或生成合成数据来平衡数据集。
3. 在损失函数中为少数类设置更高的类别权重。
4. 改用F1分数、AUC-ROC或精确率-召回率曲线作为主要评估指标。
多分类模型对所有类别的预测概率都很平均(如三类各~0.33) 1. 模型没有学到任何有效特征,输出接近随机。
2. 最后一层Softmax前,网络输出(逻辑值)的幅度太小。
3. 数据标签噪声大,或特征与标签相关性弱。
1. 检查训练集上的损失是否在下降。如果没有,可能是网络结构或学习率问题。
2. 尝试在最后一层前不使用激活函数,或使用更弱的正则化。
3. 进行数据探索性分析,可视化特征,确认数据本身是可分的。
训练集上表现很好,验证集/测试集上表现骤降 过拟合 。模型记住了训练数据的噪声,而非一般规律。 1. 获取更多训练数据(最有效但最难)。
2. 使用正则化技术:L1/L2权重正则化、Dropout层。
3. 简化模型(减少层数或神经元数)。
4. 对于图像或文本,使用数据增强。
二分类问题,使用准确率评估,但业务更关心“抓住正例” 评估指标与业务目标不匹配。例如在疾病筛查中,漏诊(假阴性)的代价远高于误诊(假阳性)。 1. 立即停止使用准确率作为主要指标
2. 分析混淆矩阵,重点关注 召回率
3. 可以通过调整分类阈值(默认0.5)来权衡精确率和召回率,绘制P-R曲线,选择符合业务需求的阈值。
模型输出概率值不是校准的(如预测概率0.8的事件实际只发生了60%) 许多复杂的神经网络(特别是深度网络)输出的概率并不代表真实的置信度,它们可能过于“自信”或“不自信”。 1. 使用** Platt Scaling** 或 Isotonic Regression 等概率校准方法在验证集上对输出概率进行后处理。
2. 使用 标签平滑 技术,在训练时软化one-hot标签,可以缓解模型过度自信。
做多分类时,报错“目标值超出范围”或维度不匹配 数据标签的编码方式与损失函数期望的格式不匹配。 1. 对于 CrossEntropyLoss (PyTorch)或 sparse_categorical_crossentropy (Keras),标签应该是 整数形式 的类别索引(如 [0, 2, 1, ...] )。
2. 对于 CategoricalCrossentropy (Keras),标签必须是 one-hot 编码 (如 [[1,0,0], [0,0,1], [0,1,0], ...] )。
3. 仔细检查框架文档,确保输入格式正确。
训练过程不稳定,损失出现NaN 1. 学习率过高,导致梯度爆炸。
2. 数据中包含NaN或无穷大的值。
3. 在计算交叉熵损失时,输入给log函数的概率值为0,导致计算出负无穷。
1. 大幅降低学习率,或使用学习率预热、梯度裁剪。
2. 彻底清洗数据,检查并处理缺失值和异常值。
3. 在Softmax或Sigmoid输出后,给概率值加一个极小的epsilon(如1e-7),防止log(0)的情况。
想用神经网络做简单的逻辑回归/线性回归,感觉杀鸡用牛刀 想法正确。对于线性可分或关系简单的问题,复杂模型容易过拟合且效率低。 1. 先从简单的经典模型开始 :尝试线性回归、逻辑回归、决策树。它们训练快、可解释性强,能提供一个强基线。
2. 如果简单模型效果已经很好,通常没必要上神经网络。
3. 神经网络的优势在于从原始数据(如图像、文本、音频)中自动学习复杂特征和模式。
不确定该用回归还是分类处理“评分预测”(如1-5分) 这就是前面提到的“序数回归”场景。 1. 方法一(视为分类) :使用多分类,但考虑使用序数损失函数。
2. 方法二(视为回归) :使用回归模型预测连续值,然后四舍五入到最近的整数分数。评估时既看回归指标(如MSE),也看分类指标(如准确率)。
3. 对比实验 :两种方法都尝试,在验证集上选择效果更好的。通常,当类别数较多且有明确顺序时,回归方法有时更优。

5.2 我的个人工具箱与习惯

最后,分享几个我多年来养成的、能提升效率的小习惯:

  • 永远从基线开始 :不要一上来就设计复杂的神经网络。先用最简单的模型(如线性回归、逻辑回归、或一个3层全连接网络)在数据上跑通,得到一个基准性能。这能帮你快速验证数据管道是否正确,以及问题是否是可学习的。
  • 可视化是你的朋友 :训练时,实时绘制损失曲线和评估指标曲线。预测完成后,对于回归问题,绘制“预测值-真实值”散点图;对于分类问题, 一定要画混淆矩阵 。这些图比任何数字都更能揭示问题。
  • 理解你的数据分布 :在建模前,花时间做探索性数据分析。看看目标变量的分布(是连续的还是离散的?是否平衡?),看看特征与目标的关系。这能直接指导你选择回归还是分类,以及后续如何处理数据。
  • 阈值是可调的 :记住,二分类中默认的0.5阈值并非金科玉律。根据业务需求调整阈值,是优化模型实际表现的最简单有效的方法之一。用验证集上的P-R曲线或ROC曲线来帮你找最佳阈值。

回归和分类,就像机器学习世界里的两种基本“语法”。掌握它们的核心区别、实现方式和适用场景,你就能在面对具体问题时,快速、准确地选择工具,搭建起有效的模型骨架,从而把更多精力花在特征工程、模型调优和解决真正的业务挑战上。这条路没有捷径,多动手、多思考、多踩坑,自然就通了。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐