当前位置: 首页 > article >正文

深度学习:分类和回归的区别

文章目录

  • 两者概念上的区别
      • 1. 任务目标
      • 2. 输出类型
      • 3. 常用的评价指标
      • 4. 应用场景
      • 5. 算法选择
      • 6. 示例对比
      • 总结
  • 两者代码上的区别
      • 1. 数据准备
      • 2. 模型输出层的设置
      • 3. 损失函数
      • 4. 模型评价指标
      • 5. 模型预测后处理
      • 6. 完整代码示例
      • 总结

分类和回归是两种核心的监督学习任务,它们的差异体现在目标、输出类型、算法、评价指标和应用场景上。

两者概念上的区别


1. 任务目标

  • 分类(Classification):分类的目标是根据输入数据的特征,将其分配到一个预定义的离散类别中。这个类别可以是二分类(如“是”和“否”),也可以是多分类(如“苹果”、“香蕉”和“橙子”)。在分类任务中,模型试图找到输入特征与类别之间的关系,以准确预测每个数据的所属类别。例如,使用图像识别模型来判断一张图片是猫还是狗。

  • 回归(Regression):回归的目标是根据输入特征预测一个连续数值,通常是一个在特定范围内的浮点数。模型在回归任务中学习的是输入特征与输出数值之间的关系,并以此来做出准确的数值预测。例如,预测房屋价格、天气温度或股票价格。


2. 输出类型

  • 分类:输出是离散的、有限的标签。例如,在垃圾邮件分类中,模型可能会输出“垃圾邮件”或“非垃圾邮件”的标签。即使是多分类任务,如识别手写数字0到9的图片,模型的输出也是其中之一的整数标签。

  • 回归:输出是一个连续值,没有固定的范围限制。回归模型的目标是尽可能接近真实的数值。例如,预测一个城市的房价,模型的输出可能是浮动的小数,如 250,000.75 或 1,000,000.90,不受固定类别的限制。


3. 常用的评价指标

分类和回归的评价指标因任务目标的不同而有所不同

  • 分类

    • 准确率(Accuracy):衡量模型预测正确的样本占总样本的比例,是一种常见的分类评价标准,但在数据不平衡的情况下可能不适用。
    • 精确率(Precision):预测为正类的样本中实际为正类的比例。常用于评估模型在不平衡数据集上的表现。
    • 召回率(Recall):实际为正类的样本中被正确预测为正类的比例。适合用来评估模型对少数类的识别效果。
    • F1分数(F1 Score):精确率和召回率的调和平均,用于平衡二者。
    • AUC-ROC曲线:适用于二分类,衡量模型在不同阈值下的预测能力。AUC值越接近1,模型性能越好。
  • 回归

    • 均方误差(MSE):预测值与真实值差的平方的平均值。较大的差距会导致更大的误差值,MSE更适合关注误差幅度的任务。
    • 均方根误差(RMSE):均方误差的平方根,与输出的单位一致,便于理解预测误差的绝对大小。
    • 平均绝对误差(MAE):预测值与真实值差的绝对值的平均。与MSE相比,MAE对极端误差不敏感,因此更适合噪声较多的情况。
    • R²评分(R-squared):解释预测值与真实值之间的线性关系,越接近1表示模型越准确。

4. 应用场景

  • 分类

    • 医学诊断:例如预测是否患有某种疾病(分类结果通常是“是”或“否”)。
    • 垃圾邮件检测:根据邮件内容判断是否为垃圾邮件。
    • 图像识别:如人脸识别,识别图像中的对象是“猫”还是“狗”。
    • 情感分析:从文本中判断情绪倾向(如“积极”、“消极”或“中性”)。
  • 回归

    • 房价预测:通过房屋的特征(如面积、地理位置)预测价格。
    • 股票价格预测:基于历史数据和市场趋势预测未来的股票价格。
    • 用电量预测:根据历史数据预测未来某时段的电力需求。
    • 体重预测:根据个人的饮食、活动量等特征预测体重。

5. 算法选择

分类和回归任务的模型算法选择也有所不同

  • 分类算法

    • 逻辑回归(Logistic Regression):用于二分类任务,输出概率值。
    • 支持向量机(SVM):适用于二分类和多分类,能够在高维空间中找到最佳分类边界。
    • 决策树与随机森林(Decision Tree & Random Forest):生成树形结构决策模型,适合分类和回归任务,但通常用作分类。
    • 神经网络(如 CNN、RNN):卷积神经网络适合图像分类任务,循环神经网络适合序列数据分类。
  • 回归算法

    • 线性回归(Linear Regression):用于简单的线性关系回归,适合连续数值的预测。
    • 岭回归与Lasso回归(Ridge & Lasso Regression):线性回归的正则化形式,用于防止过拟合。
    • 支持向量回归(SVR):支持向量机的回归形式,适合非线性回归任务。
    • 神经网络:用于复杂关系的回归任务,尤其适合高维数据。

6. 示例对比

  • 分类问题示例:在信用评分系统中,将用户分为“高风险”和“低风险”两类。目标是确定一个用户的风险类别。
  • 回归问题示例:在贷款申请中,预测用户的还款能力分数。这里的输出是一个连续值,用于衡量还款能力的高低。

总结

  • 分类:用于将数据分配到预定义的类别中,输出离散值。适用于识别、检测等任务。
  • 回归:用于预测一个连续数值,输出范围无限制。适用于数值预测任务。
  • 评价指标不同:分类常用准确率、精确率等,回归常用均方误差、平均绝对误差。
  • 应用领域不同:分类适合判别性任务(如图像分类),回归适合预测性任务(如房价预测)。

两者代码上的区别

分类和回归任务的代码实现上存在一些显著的差异,尤其是在数据准备、模型输出层的设置、损失函数、评价指标和模型预测的后处理方面。以下是代码实现中常见的不同之处。


1. 数据准备

  • 分类:通常需要将标签数据转换为离散类别编码(例如使用 one-hot 编码),以便模型可以输出多个类别的概率分布。
  • 回归:标签数据通常是连续值,直接作为目标值输入模型,不需要特殊处理。

示例

# 分类任务:将标签转换为 one-hot 编码
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, num_classes=10)  # 假设10个类别

# 回归任务:不需要对标签进行编码,直接使用连续值
y_train = y_train.astype(np.float32)  # 确保标签数据为浮点型

2. 模型输出层的设置

  • 分类:通常使用 softmax 激活函数,输出多个类别的概率分布。输出节点数目等于类别数。
  • 回归:不需要使用激活函数,输出一个节点用于预测连续值。

示例

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(input_dim,)))

# 分类任务的输出层
model.add(Dense(10, activation='softmax'))  # 10个类别

# 回归任务的输出层
model.add(Dense(1))  # 1个节点用于输出连续值

3. 损失函数

  • 分类:使用分类损失函数,例如 categorical_crossentropysparse_categorical_crossentropy,用于计算预测概率分布与真实标签之间的差异。
  • 回归:使用回归损失函数,例如 mean_squared_errormean_absolute_error,用于衡量预测值与实际值之间的误差。

示例

from tensorflow.keras.optimizers import Adam

# 分类任务的损失函数
model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])

# 回归任务的损失函数
model.compile(optimizer=Adam(), loss='mean_squared_error', metrics=['mean_absolute_error'])

4. 模型评价指标

  • 分类:常用的评价指标包括 accuracy(准确率)、precision(精确率)、recall(召回率)等。
  • 回归:常用的评价指标包括 mean_squared_error(均方误差)、mean_absolute_error(平均绝对误差)等。

示例

# 分类任务的评价指标
model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])

# 回归任务的评价指标
model.compile(optimizer=Adam(), loss='mean_squared_error', metrics=['mean_absolute_error'])

5. 模型预测后处理

  • 分类:模型输出是各类别的概率分布,通常使用 argmax 提取概率最大的类别作为预测结果。
  • 回归:直接输出预测的连续数值,不需要额外处理。

示例

# 分类任务
y_pred = model.predict(X_test)
y_pred_classes = np.argmax(y_pred, axis=1)  # 提取概率最大的类别

# 回归任务
y_pred = model.predict(X_test)  # 直接输出预测的连续值

6. 完整代码示例

  • 分类任务代码示例

    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    from tensorflow.keras.utils import to_categorical
    from tensorflow.keras.optimizers import Adam
    
    # 假设输入维度和类别数
    input_dim = 100
    num_classes = 10
    
    # 模型定义
    model = Sequential()
    model.add(Dense(64, activation='relu', input_shape=(input_dim,)))
    model.add(Dense(num_classes, activation='softmax'))  # 输出类别概率
    
    # 编译模型
    model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
    
    # 生成示例数据
    X_train = np.random.random((1000, input_dim))
    y_train = np.random.randint(num_classes, size=(1000,))
    y_train = to_categorical(y_train, num_classes=num_classes)
    
    # 训练模型
    model.fit(X_train, y_train, epochs=10, batch_size=32)
    
    # 预测
    y_pred = model.predict(X_test)
    y_pred_classes = np.argmax(y_pred, axis=1)  # 输出类别
    
  • 回归任务代码示例

    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    from tensorflow.keras.optimizers import Adam
    
    # 假设输入维度
    input_dim = 100
    
    # 模型定义
    model = Sequential()
    model.add(Dense(64, activation='relu', input_shape=(input_dim,)))
    model.add(Dense(1))  # 输出一个连续值
    
    # 编译模型
    model.compile(optimizer=Adam(), loss='mean_squared_error', metrics=['mean_absolute_error'])
    
    # 生成示例数据
    X_train = np.random.random((1000, input_dim))
    y_train = np.random.random((1000,))  # 连续值标签
    
    # 训练模型
    model.fit(X_train, y_train, epochs=10, batch_size=32)
    
    # 预测
    y_pred = model.predict(X_test)  # 直接输出连续值
    

总结

在代码实现上,分类和回归的主要区别体现在标签的处理、模型的输出层、损失函数、评价指标和预测的后处理上。分类需要处理类别标签,输出类别概率分布,使用分类损失函数和分类指标;回归直接输出连续值,使用回归损失函数和回归指标。


http://www.kler.cn/a/590119.html

相关文章:

  • DOM4J解析XML, 修改xml的值
  • 独立部署DeepSeek 大语言模型(如 DeepSeek Coder、DeepSeek LLM)可以采用什么框架?
  • 蓝桥杯小球碰撞
  • 蓝桥杯 刷题统计
  • Appium使用文档
  • ubuntu24.04-qt5-mysql8.0
  • AI-医学影像分割方法与流程
  • 华为eNSP(Enterprise Network Simulation Platform)实战指南
  • WEB安全--SQL注入--预防SQL注入的一些方法
  • Kafka 中的偏移量是什么?它解决了哪些问题?
  • HTML 基础夯实:标签、属性与基本结构的学习进度(二)
  • 数据可视化在特征分布对比中的应用
  • DataWhale 大语言模型 - 大模型技术基础
  • 重生之我在学Vue--第13天 Vue 3 单元测试实战指南
  • C语言文件管理详解(上)
  • 在 macOS Sequoia 15.2 中启用「三指拖动」并实现快速复制的完整指南 ✨
  • DeepSeek-R1学习
  • 如何用Python IP归属地查询API追踪网络活动?
  • 一周学会Flask3 Python Web开发-SQLAlchemy查询所有数据操作-班级模块
  • Ubuntu上部署Flask+MySQL项目