回归 vs 分类:深度学习两大核心任务,一文彻底搞懂
1. 引言
深度学习作为机器学习的一个重要分支,近年来在图像识别、自然语言处理、语音识别等领域取得了突破性进展。在众多应用场景中,回归(Regression)与分类(Classification)是最基础也最核心的两类任务。无论是预测房价、股票价格,还是识别图片中的物体、判断邮件是否为垃圾邮件,本质上都可以归结为回归或分类问题。
本文将系统性地介绍深度学习中的回归与分类问题,包括它们的基本概念、核心区别、常用模型结构、损失函数、评估指标以及实际应用场景,帮助读者建立完整的知识框架。
2. 回归与分类的基本概念
2.1 什么是回归问题
回归问题是指预测连续数值型输出的任务。其目标是学习一个从输入特征到连续输出的映射函数,输出值可以是任意实数。
典型应用场景包括:
- 房价预测:根据面积、位置、房龄等特征预测房价
- 股票价格预测:根据历史数据预测未来股价
- 温度预测:根据气象数据预测未来温度
- 销售额预测:根据历史销售数据预测未来销量
2.2 什么是分类问题
分类问题是指预测离散类别标签的任务。其目标是将输入样本划分到预定义的类别中,输出是有限的类别集合。
分类问题根据类别数量可分为:
- 二分类:只有两个类别,如垃圾邮件判断(是/否)、疾病检测(患病/健康)
- 多分类:多个互斥类别,如图像识别(猫/狗/鸟/鱼)、手写数字识别(0-9)
- 多标签分类:一个样本可同时属于多个类别,如一篇新闻可同时标注为"科技"和"国际"
2.3 回归与分类的核心区别
| 维度 | 回归问题 | 分类问题 |
|---|---|---|
| 输出类型 | 连续数值 | 离散类别 |
| 输出范围 | 任意实数 | 有限类别集合 |
| 损失函数 | MSE、MAE 等 | 交叉熵、Hinge 等 |
| 输出层激活函数 | 无(或线性) | Sigmoid / Softmax |
| 评估指标 | R²、MAE、RMSE | 准确率、精确率、召回率 |
| 典型应用 | 预测、估计 | 识别、判别 |
3. 深度学习解决回归问题
3.1 回归问题的网络结构
解决回归问题的神经网络通常采用以下结构:
- 输入层:接收特征向量
- 隐藏层:一个或多个全连接层(或卷积层、循环层等),通过非线性激活函数(如 ReLU)提取特征
- 输出层:单个神经元,不使用激活函数(或使用线性激活),直接输出预测值
3.2 回归问题的损失函数
回归问题常用的损失函数包括:
均方误差(MSE)
MSE=1n∑i=1n(yi−y^i)2MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2MSE=n1i=1∑n(yi−y^i)2
MSE 对异常值敏感,因为误差被平方放大。
平均绝对误差(MAE)
MAE=1n∑i=1n∣yi−y^i∣MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|MAE=n1i=1∑n∣yi−y^i∣
MAE 对异常值更鲁棒,但梯度在零点不可导。
Huber Loss
Lδ(y,y^)={12(y−y^)2∣y−y^∣≤δδ(∣y−y^∣−12δ)otherwiseL_{\delta}(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & |y - \hat{y}| \le \delta \\ \delta(|y - \hat{y}| - \frac{1}{2}\delta) & \text{otherwise} \end{cases}Lδ(y,y^)={21(y−y^)2δ(∣y−y^∣−21δ)∣y−y^∣≤δotherwise
Huber Loss 结合了 MSE 和 MAE 的优点,对异常值鲁棒且梯度平滑。
3.3 回归问题的评估指标
- R²(决定系数):衡量模型解释方差的比例,取值范围 (−∞,1](-\infty, 1](−∞,1],越接近 1 越好
- RMSE(均方根误差):MSE 的平方根,与原始数据同量纲
- MAE:平均绝对误差,直观反映平均预测偏差
3.4 回归问题代码示例
import torch
import torch.nn as nn
import torch.optim as optim
# 定义回归网络
class RegressionNet(nn.Module):
def __init__(self, input_dim):
super(RegressionNet, self).__init__()
self.fc1 = nn.Linear(input_dim, 64)
self.fc2 = nn.Linear(64, 32)
self.fc3 = nn.Linear(32, 1) # 输出层:单神经元,无激活函数
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x) # 直接输出预测值
return x
# 训练示例
model = RegressionNet(input_dim=10)
criterion = nn.MSELoss() # 均方误差损失
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 假设已有训练数据 X, y
# for epoch in range(100):
# optimizer.zero_grad()
# pred = model(X)
# loss = criterion(pred, y)
# loss.backward()
# optimizer.step()
4. 深度学习解决分类问题
4.1 分类问题的网络结构
分类问题的神经网络结构:
- 输入层:接收样本特征
- 隐藏层:特征提取层,结构与回归类似
- 输出层:
- 二分类:单个神经元 + Sigmoid 激活函数,输出属于正类的概率
- 多分类:K 个神经元 + Softmax 激活函数,输出各类别的概率分布
4.2 分类问题的损失函数
二分类交叉熵(Binary Cross-Entropy)
L=−1n∑i=1n[yilog(y^i)+(1−yi)log(1−y^i)]L = -\frac{1}{n}\sum_{i=1}^{n}[y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]L=−n1i=1∑n[yilog(y^i)+(1−yi)log(1−y^i)]
多分类交叉熵(Categorical Cross-Entropy)
L=−1n∑i=1n∑k=1Kyiklog(y^ik)L = -\frac{1}{n}\sum_{i=1}^{n}\sum_{k=1}^{K} y_{ik} \log(\hat{y}_{ik})L=−n1i=1∑nk=1∑Kyiklog(y^ik)
其中 KKK 为类别数,yiky_{ik}yik 为第 iii 个样本属于第 kkk 类的真实标签(one-hot 编码),y^ik\hat{y}_{ik}y^ik 为预测概率。
4.3 分类问题的评估指标
- 准确率(Accuracy):预测正确的样本比例
- 精确率(Precision):预测为正类的样本中真正为正类的比例
- 召回率(Recall):真正为正类的样本中被正确预测的比例
- F1-Score:精确率和召回率的调和平均数
- AUC-ROC:衡量分类器在不同阈值下的综合性能
4.4 分类问题代码示例
import torch
import torch.nn as nn
import torch.optim as optim
# 定义分类网络(多分类)
class ClassificationNet(nn.Module):
def __init__(self, input_dim, num_classes):
super(ClassificationNet, self).__init__()
self.fc1 = nn.Linear(input_dim, 64)
self.fc2 = nn.Linear(64, 32)
self.fc3 = nn.Linear(32, num_classes) # 输出层:K 个神经元
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.relu(self.fc2(x))
x = self.fc3(x) # 原始 logits,训练时配合 CrossEntropyLoss
return x
# 训练示例
model = ClassificationNet(input_dim=10, num_classes=3)
criterion = nn.CrossEntropyLoss() # 交叉熵损失(内部包含 Softmax)
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 假设已有训练数据 X, y(y 为类别索引)
# for epoch in range(100):
# optimizer.zero_grad()
# logits = model(X)
# loss = criterion(logits, y)
# loss.backward()
# optimizer.step()
5. 回归与分类的进阶话题
5.1 从回归到分类的转化
在某些场景下,回归问题可以转化为分类问题。例如:
- 将连续的温度值离散化为"低温/常温/高温"三个类别
- 将房价预测转化为"低价/中价/高价"分类
这种转化虽然简化了问题,但会丢失部分信息,通常不推荐。
5.2 从分类到回归的转化
反之,分类问题也可以转化为回归问题。例如:
- 将类别标签编码为数值(如 0、1、2),用回归模型预测
- 但这种方式会引入类别间的顺序关系,可能误导模型
5.3 多任务学习
在实际应用中,回归和分类常常同时出现在一个模型中。例如:
- 目标检测:同时预测物体的类别(分类)和边界框坐标(回归)
- 自动驾驶:同时预测车辆位置(回归)和交通信号(分类)
这种多任务学习可以共享特征提取层,提高模型效率和泛化能力。
5.4 不平衡分类问题
当类别样本数量严重不均衡时(如罕见病检测),需要特殊处理:
- 重采样:过采样少数类或欠采样多数类
- 加权损失:为少数类分配更高的损失权重
- Focal Loss:聚焦难分类样本,降低易分类样本的权重
6. 实际应用案例
6.1 回归应用:房价预测
# 使用 PyTorch 构建房价预测模型
import torch
import torch.nn as nn
class HousePriceModel(nn.Module):
def __init__(self):
super(HousePriceModel, self).__init__()
self.net = nn.Sequential(
nn.Linear(13, 64),
nn.ReLU(),
nn.Linear(64, 32),
nn.ReLU(),
nn.Linear(32, 1)
)
def forward(self, x):
return self.net(x)
6.2 分类应用:手写数字识别
# 使用 PyTorch 构建 MNIST 分类模型
import torch
import torch.nn as nn
class DigitClassifier(nn.Module):
def __init__(self):
super(DigitClassifier, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3)
self.fc1 = nn.Linear(64 * 12 * 12, 128)
self.fc2 = nn.Linear(128, 10) # 10 个数字类别
def forward(self, x):
x = torch.relu(self.conv1(x))
x = torch.max_pool2d(x, 2)
x = torch.relu(self.conv2(x))
x = torch.max_pool2d(x, 2)
x = x.view(x.size(0), -1)
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
7. 总结
回归与分类是深度学习的两个基础任务类型,它们的核心区别在于输出的性质:
- 回归预测连续数值,使用 MSE/MAE 等损失函数,输出层无激活函数
- 分类预测离散类别,使用交叉熵损失函数,输出层使用 Sigmoid/Softmax
在实际工程中,两者常常结合使用(如多任务学习)。理解它们的本质区别和适用场景,是构建有效深度学习模型的基础。建议读者通过实际项目练习,加深对这两类问题的理解。
8. 参考资料
- 《Deep Learning》— Ian Goodfellow
- PyTorch 官方文档:https://pytorch.org/docs/
- CS231n:Convolutional Neural Networks for Visual Recognition
更多推荐

所有评论(0)