机器学习中分类与回归的差异
在分类(Classification)问题与回归(Regression)问题之间,有着一个重要的区别。
从本质来说,分类是对标签(Label)作出的预测,回归则是对于量(Quantity)的预测。
我时常看到有如下的问题:
我要如何计算我的回归问题的准确率?
提出诸如此类的问题,是因没有真正理解分类和回归之间的区别,以及所谓的准确度(Accuracy)是对什么进行测量。
在本教程中,您将了解到分类和回归之间的差异。
学习完本教程后,您将知道:
- 预测建模,是关于学习从输入到输出的映射函数的问题,它被称为函数逼近(Function approximation)。
- 分类问题,就是要为样本预测一组离散类标签的输出。
- 回归问题,则是为样本预测一组连续数量的输出。
我们开始本次学习之旅吧!
图片由 thomas wilson 拍摄,保留部分版权。
教程概述
本教程共分为 5 个部分,分别是:
- 函数逼近
- 分类
- 回归
- 分类与回归之间的比较
- 分类与回归之间的转换
函数逼近
预测建模问题,是基于历史数据来开发一个模型的问题,这个模型可以对新数据(我们没有相应的答案)进行预测。
要了解关于预测建模的更多信息,请参阅以下文章:
预测建模问题可以这样来描述:对从输入变量(X)到输出变量(y)映射函数(f)进行逼近。这被称为函数逼近问题。
建模算法的任务是:基于我们所能提供的时间与资源,找到最佳的映射函数。
要了解机器学习应用中的函数逼近的更多信息,请参阅以下文章:
- How Machine Learning Algorithms Work(机器学习算法是如何运作的)
通常情况下,我们可以将所有函数逼近任务划分为分类任务以及回归任务。
分类预测建模
分类预测建模的任务,是逼近一个映射函数(f),它能将输入变量(X)映射到离散的输出变量(y)。
输出变量通常被称为标签或类别(Categories)。映射函数则预测给定观测值的类或类别。
例如,我们可以将文本邮件归为两类,即 “垃圾邮件“ 和 “非垃圾邮件”。
- 分类问题要求将样本分为两类(或更多类)中的一类。
- 对于分类,它的输入可以是实值,也可以是离散变量。
- 分为两个类的问题,通常被称为两类或二元分类问题。
- 多于两个类别的问题通常被称为多类分类(Multi-class classification)问题。
- 一个样本属于多个类别,这样的问题被称为多标签分类(Multi-label classification)问题。
分类模型通常预测得到一个连续值,该值作为给定样本属于输出的各个类别的概率。这一概率可以理解为样本属于各个类别的置信度(或者说可能性)。我们可以选择具有最高概率的类别标签,从而将预测概率转换为类别值。
举个例子,可能有某个文本邮件被指定是 “垃圾邮件” 的概率为 0.1,而是 “非垃圾邮件” 的概率为 0.9。此时通过选择 “非垃圾邮件” (因为它对应着最高的预测概率)标签,我们就可以将这些概率转换为一个类标签。
对分类预测模型进行能力评估的方法有很多,其中最常见的大概就是计算分类的准确率。
分类准确率是所有预测结果中,属于正确的分类实例的百分比。
比如说,如果一个分类预测模型作出了 5 个预测,其中 3 个是正确的,另外 2 个是错误的,那么基于这些预测的模型分类准确率将是:
accuracy = correct predictions / total predictions * 100
accuracy = 3 / 5 * 100
accuracy = 60%
能够对分类预测模型进行学习的算法被称为分类算法。
回归预测建模
回归预测建模的任务,是逼近一个映射函数(f),它能将输入变量(X)映射到连续的输出变量(y)。
连续的输出变量是一个实数值(例如整数,或浮点值)。这些值往往是数量,比如金额和尺寸。
举个例子,我们可能会预测一套房子可能以某个特定的美元价值进行出售,而这个值可能会在 $100,000 到 $200,000 的范围内。
- 回归问题需要预测一个数量。
- 对于回归,它的输入可以是实值,也可以是离散变量。
- 我们通常将具有多个输入变量的问题称为多元回归(Multivariate regression)问题。
- 具有时序输入变量的回归问题称为时间序列预测(Time series forecasting)问题。
由于回归预测模型预测了一个数量,模型的能力必须根据这些预测的误差进行评估报告。
我们有许多方法能够评估回归预测模型的能力,但最常见的方法可能就是计算均方根误差(Root mean squared error,根据首字母缩写为 RMSE)了。
比如说,如果一个回归预测模型作出了 2 个预测,其中预测值 1.5 的期望值是 1.0,另一个预测值是 3.3,期望值是 3.0,那么 RMSE 则是:
RMSE = sqrt(average(error^2))
RMSE = sqrt(((1.0 - 1.5)^2 + (3.0 - 3.3)^2) / 2)
RMSE = sqrt((0.25 + 0.09) / 2)
RMSE = sqrt(0.17)
RMSE = 0.412
RMSE 的优点在于其误差值的单位与预测值的单位是相同的。
能够对回归预测模型进行学习的算法被称为回归算法。
有一些算法的名称中包含 “回归” 这个词,譬如说线性回归和逻辑回归,这可能会使人混淆。此处线性回归是一种回归算法,然而 Logistic 回归则是一种分类算法。
分类与回归之间的比较
分类预测建模问题不同于回归预测建模问题。
- 分类的任务是预测离散的类标签。
- 回归的任务是预测连续的数量。
分类和回归算法之间有一些重叠的部分,比如说:
- 分类算法可以预测连续值,这个连续值是以相应类标签的概率的形式表现出来的。
- 回归算法可以预测离散值,这个离散值是以一个整形量的形式表现的。
通过进行一些小的修改,某些算法可以同时用于分类和回归(例如决策树算法和人工神经网络)。另外的一些算法则不能(或者说不能轻易地)同时用于两种问题类型(例如用于回归预测建模的线性回归,和用于分类预测建模的 Logistic 回归)。
重点是,我们评估分类和回归预测的方式各不相同,毫无重叠部分:
- 分类预测可以使用准确率进行评估,而回归预测则不能。
- 回归预测可以使用均方根误差进行评估,而分类预测则不能。
分类和回归之间的转换
在某些情况下,我们可以将回归问题转换为分类问题。比如说,要预测的数量可以转换成离散的桶(Buckets)。
例如,$0 到 $100 的连续范围内的金额可以转换为 2 个桶:
- 类别 0:0 到 49 美元
- 类别 1:50 美元到 100 美元
这通常称为离散化,得到的输出变量是具有一个有序关系(称为序数)的分类。
在某些情况下,分类问题可以转化为回归问题。比如说,一个标签可以转换为一个连续的范围。
一些算法已经通过预测每个类的概率来实现这一目的,预测得到的概率可以扩展到特定的范围:
quantity = min + probability * range
或者,可以对类别值进行排序,并映射到一个连续的范围中:
- $0 至 $49 范围内的值属于类别 1
- $0 至 $100 范围内的值属于类别 2
如果分类问题中的类标签不具有自然的序数关系,则将分类转换为回归也许会导致模型具有使人讶异或低下的性能,因为模型可能会从输入到连续的输出范围中学习到错误或着并不存在的映射。
扩展阅读
如果您想继续深入了解相应的内容,本节将提供更多有关该主题的资源。
- Gentle Introduction to Predictive Modeling(预测建模简介)
- How Machine Learning Algorithms Work(机器学习算法是如何运作的)
总结
通过学习本教程,您了解到了分类和回归问题之间的差异所在。
具体说来,你学到了:
- 预测建模问题,是关于学习从输入到输出的映射函数的问题,我们称其为函数逼近。
- 分类问题,就是要为样本预测一组离散的类标签输出。
- 回归问题,就是要为样本预测一组连续数量的输出。
- 使用dbms_parallel_execute来完成DML的并行(r3笔记第1天)
- 有趣的linux命令总结(78天)
- 生产环境sql语句调优实战第七篇(r2笔记99天)
- 一个普通数据库用户所能查到的"意料之外"的信息(r2笔记98天)
- 查看并行进程的一些简单信息(r3笔记第17天)
- 多行数据的批处理之bulk collect(r3笔记第16天)
- pl/sql中错误的异常处理 (r3笔记第15天)
- 关于session leak的问题分析(r3笔记第13天)
- 执行计划的偏差导致的性能问题(r3笔记第12天)
- 关于评审开发人员的sql语句(r3笔记第11天)
- 性能下降的不定时炸弹_过旧的sql_profile(r3笔记第9天)
- 关于抓取session信息的一个脚本(r3笔记第8天)
- oracle PL/SQL中的重载 (r3笔记27天)
- 使用Python进行描述性统计
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 统计PHP目录中的文件数方法
- python json.dumps() json.dump()的区别详解
- Win10下用Anaconda安装TensorFlow(图文教程)
- TP5(thinkPHP框架)实现后台清除缓存功能示例
- PHP递归的三种常用方式
- python实现xlwt xlrd 指定条件给excel行添加颜色
- PHP解析url并得到url参数方法总结
- TP5(thinkPHP5框架)基于bootstrap实现的单图上传插件用法示例
- PHP实现微信小程序用户授权的工具类示例
- thinkphp5.0整合phpsocketio完整攻略(绕坑)
- Yii2框架自定义类统一处理url操作示例
- tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
- PHP htmlspecialchars_decode()函数用法讲解
- ThinkPHP中获取指定日期后工作日的具体日期方法
- php curl操作API接口类完整示例