分类与回归:概述
● 分类与回归
■ 监督机器学习的核心任务
■ 训练:在数据集中找到依赖变量的值与独立变量(特征)的值之间的模式
■ 预测:使用这些模式为新的/未见过的数据的依赖变量分配值
● 分类与回归的区别
■ 分类:依赖变量是分类的
■ 回归:依赖变量是连续的
分类与回归:例子
● 预测公寓价格(回归任务)
■ 帮助卖家和买家做出更好的决定
■ 理解属性对公寓价格的重要性
● 健康分析:心脏病预测
■ 诊断和治疗支持系统
■ 识别最重要的风险因素
● 情感分析 / 观点挖掘(基于文本)
● 自动驾驶车辆
■ 输入:图像和传感器数据
● 回归任务,例如:
■ 加速度
■ 转向角
■ 事件预测
● 分类任务,例如:
■ 障碍物检测
■ 路标识别
监督训练/学习: 基本设置
步骤:训练数据,测试数据 -- 模型(分类 / 回归)--> 预测 <-- 评估 --> 真实值
● 给定:数据集 D,由一对 {(x, y)} 组成
■ x — 特征(独立变量)
■ y — 标签(依赖变量)
● 将数据集 D 分为:
■ — 用于训练模型的数据
■ — 用于评估模型的数据
■ 重要: (测试数据在训练过程中不允许使用)
● 模型 — 参数化函数 h(x, Θ) = y
■ 将输入空间(特征)映射到输出空间(标签)
■ Θ — 模型的可训练/可学习参数 (注意:并非所有模型都是参数化的,KNN)
● 模型选择 — 选择一“族”函数 h(x, Θ) = y
■ K-最近邻,决策树,线性模型,神经网络,…
● 训练 / 学习
■ 系统地找到 Θ 的最佳值的过程
■ ⇔ 特征和标签之间的最佳映射
分类与回归 —— 评估
● 回归:数值的直接比较 常见的:均方根误差(RMSE):
预期值, 真实值
● 分类
■ 基础情况:二元分类(2个标签:0 或 1)
■ 示例:COVID-19 测试
分类:评估 — 混淆矩阵
● 真正例(TP):被正确预测为正类的正类数量
● 真负例(TN):被正确预测为负类的负类数量
● 假正例(FP):被错误预测为正类的负类数量
● 假负例(FN):被错误预测为负类的正类数量
分类:评估 — 流行的指标
● 准确率
Accuracy:衡量模型的整体正确率。
- 很高:模型在分类任务中的总体表现很好,正确地预测了大部分的样本。
- 很低:模型的总体预测性能很差,经常做出错误的预测。
● 敏感性
Sensitivity/Recall:衡量模型对阳性样本的识别能力。
- 很高:模型很好地识别出了实际阳性的样本,几乎没有错过任何阳性样本。
- 很低:模型经常错过真正的阳性样本,这可能导致很多假阴性。
● 特异性
Specificity:衡量模型对阴性样本的识别能力。
- 很高:模型很好地识别出了实际阴性的样本,几乎没有误报。
- 很低:模型经常将实际的阴性样本错误地预测为阳性,导致很多假阳性。
● 精确度
Precision:衡量模型预测为阳性的样本中有多少是真正的阳性。
- 很高:模型预测为阳性的样本中,大部分确实是阳性。
- 很低:模型预测为阳性的样本中,很多实际上是阴性,导致很多假阳性。
● 召回率
Sensitivity/Recall:衡量模型对阳性样本的识别能力。
● F1 分数: 精确度和召回率的调和平均
F1 Score:是 Precision 和 Recall 的调和平均值,用于在两者之间找到平衡。
- 很高:模型在Precision和Recall之间达到了很好的平衡,整体性能很好。
- 很低:模型在Precision和Recall之间的平衡性很差,可能导致很多假阳性或假阴性。
举例:
1. 医疗诊断:
场景:假设我们有一个用于检测某种罕见但严重的疾病的测试。
-
高Sensitivity (灵敏度):几乎所有真正患有该疾病的患者都被正确地识别出来。这是非常重要的,因为错过一个真正的阳性可能导致患者没有得到及时的治疗。
-
低Precision (精确度):许多被诊断为阳性的患者实际上并没有患病。这可能导致不必要的焦虑和进一步的医疗检查。
2. 垃圾邮件过滤器:
场景:电子邮件系统中的垃圾邮件过滤器。
-
高Accuracy (准确率):大部分邮件,无论是垃圾邮件还是合法邮件,都被正确地分类。
-
低Recall (召回率):许多真正的垃圾邮件都没有被过滤器识别,导致用户的收件箱被垃圾邮件充斥。
3. 信用卡欺诈检测:
场景:银行使用算法来检测可能的信用卡欺诈活动。
-
高Specificity (特异性):几乎所有合法的交易都被正确地识别,用户很少收到关于合法交易的误报警告。
-
低F1 Score (F1得分):由于假阳性和假阴性都很高,模型在Precision和Recall之间的平衡性很差,导致银行可能错过一些真正的欺诈活动,同时也误报了一些合法的交易。
总结:
在医疗诊断的例子中,我们更关心Sensitivity,因为错过一个真正的阳性可能导致严重的后果。而在垃圾邮件过滤器的例子中,我们可能更关心Accuracy和Recall,因为我们不希望错过任何重要的邮件,同时也不希望收件箱被垃圾邮件充斥。在信用卡欺诈检测的例子中,我们希望F1 Score尽可能高,以确保模型在Precision和Recall之间达到良好的平衡。
分类:评估 — 为什么有这么多的衡量标准?
● 问题:(高度)不平衡的数据集
● 使用案例:COVID-19 测试
■ 在一个人群中,大多数人都没有被感染
■ 假设一个测试总是(!)返回“阴性”
➜ 尽管测试“无用”,但值非常高
对比精确度和召回率
● 观察:FP 和 FN 并不总是同样的问题 ;
● 例子:心脏病预测
召回率 > 精确度
■ 坏:错误分类高风险人群
■ 还可以:错误分类健康人群
● 例子:新闻文章分类 (例如,用于像 Google News 这样的搜索引擎)
召回率 < 精确度
■ 坏:展示错误类别的文章
■ 可以:在结果中遗漏相关文章
举例
1. 医疗诊断:
场景:假设一个医疗测试用于检测某种严重的疾病。
-
False Negative (FN):测试结果为阴性,但实际上患者患有该疾病。这意味着患者可能会错过关键的治疗时机,导致疾病恶化或其他严重后果。
-
False Positive (FP):测试结果为阳性,但实际上患者并没有患病。这可能导致患者经历不必要的压力、进一步的测试或治疗,但不太可能导致直接的生命危险。
在这种情况下,FN明显比FP更为严重,因为它可能导致患者失去生命。
2. 安全监控系统:
场景:假设一个安全监控系统用于检测入侵者。
-
False Negative (FN):系统没有检测到入侵者。这意味着入侵者可以自由进入并可能造成损害或盗窃。
-
False Positive (FP):系统错误地认为有入侵者。这可能导致不必要的警报或安全人员的干扰,但不会导致实际的损害。
在这种情况下,错过真正的威胁(FN)比误报(FP)更为严重。
3. 垃圾邮件过滤器:
场景:电子邮件系统中的垃圾邮件过滤器。
-
False Negative (FN):一个垃圾邮件没有被过滤器识别并进入了用户的收件箱。这可能导致用户受到欺诈或恶意软件的威胁。
-
False Positive (FP):一个重要的、合法的邮件被错误地标记为垃圾邮件并被移至垃圾邮件文件夹。用户可能错过重要的信息或机会。
在这种情况下,根据具体情境,FN和FP都可能造成问题,但错过重要邮件(FP)可能对用户有更大的影响。
总结:
在不同的应用场景中,FN和FP可能带来不同的后果。选择优化哪个指标取决于具体的应用和潜在的风险。在某些情境中,减少FN可能比减少FP更为关键。
分类:评估 — 数值类别分数
● 到目前为止的假设: 是类别标签
● 许多模型的输出: 是类别分数
■ 例如,一个类的概率
➜ 阈值化
■ 使用阈值将 转换为二进制变量 0/1
● 不同的阈值会产生不同的结果
➜ 问题:应该使用哪个阈值? — 答案:全部试一遍!
接收者操作特性(ROC)
● 绘制真正例率(敏感性)与假正例率(1-特异性)的图表
■ 为每个有意义的阈值 t 绘制值(有意义 = 对结果有影响)
ROC 曲线是一个二维图,其中横轴表示假阳性率(False Positive Rate,FPR),纵轴表示真阳性率(True Positive Rate,TPR)。ROC 曲线显示了在不同的分类阈值下,模型的 TPR 和 FPR 之间的关系。
真阳性率 (TPR):也称为召回率,是真阳性样本数与所有实际阳性样本数之比。TPR=TP/TP+FN 假阳性率 (FPR):是假阳性样本数与所有实际阴性样本数之比。 FPR=FP/FP+TN
● 使用 AUROC(或 AUC)量化分类器的质量
■ 接收者操作特性曲线下的面积
■ 随机分类器的 AUROC:0.5
AUC 是 ROC 曲线下的面积。AUC 的值介于 0 和 1 之间,其中 1 表示完美的分类器,0.5 表示随机猜测的分类器。AUC 越高,分类器的性能越好。
ROC / AUROC — 实际例子
● IRIS 数据集
■ 3类鸢尾植物
■ 每类50个样本
■ 4个连续特征 (花萼/花瓣的长度/宽度)
● ROC / AUROC
■ 样本越多,阈值越多
■ ROC 更加平滑
■ 阈值通常被省略
为什么使用ROC和AUC?
-
不依赖于特定的决策阈值:与其他指标(如准确率)相比,ROC和AUC不依赖于特定的分类阈值,因此它们为我们提供了一个更全面的模型性能视图。
-
不平衡数据:在不平衡类别的情况下,准确率可能会误导。在这种情况下,ROC和AUC是更好的性能指标。
-
比较模型:AUC为我们提供了一个简单的数字来比较不同模型的性能。
分类:评估 — 超过2个类别
● 示例:3个类别,每个类别50个样本
多类评估 — 一 vs 其余混淆矩阵
2-vs-Rest:
- 正类为2,其他类别(1和0)为负类。
- 正类和正类交互的数量是8。
- 正类和负类交互的数量是6 + 0 = 6。
- 负类和正类交互的数量是3 + 4 = 7。
- 负类和负类交互的数量是12 + 1 + 2 + 14 = 29。
1-vs-Rest:
- 正类为1,其他类别(2和0)为负类。
- 正类和正类交互的数量是12。
- 正类和负类交互的数量是3 + 1 = 4。
- 负类和正类交互的数量是6 + 2 = 8。
- 负类和负类交互的数量是8 + 0 + 4 + 14 = 26。
0-vs-Rest:
- 正类为0,其他类别(2和1)为负类。
- 正类和正类交互的数量是14。
- 正类和负类交互的数量是4 + 2 = 6。
- 负类和正类交互的数量是0 + 1 = 1。
- 负类和负类交互的数量是8 + 6 + 3 + 12 = 29。
一 vs 其余 — 微平均
一 vs 其余 — 宏平均
一 vs 其余 — 宏平均 vs. 微平均
● 两种方法都使用一对其余混淆矩阵
■ 所有介绍的指标都适用(包括 ROC/AUROC)
● 微平均
■ 对所有一vs其余混淆矩阵的 TP、FP、FN、TN 值进行平均
■ 偏向于较大的类别(因为是对计数进行平均)
● 宏平均
■ 对每个一对其余混淆矩阵得出的指标进行平均
■ 所有类别都平等对待(因为指标都经过了归一化)
● 示例:IRIS 数据集
■ 3类鸢尾植物
■ 每类50个样本
■ 4个连续特征 (花萼/花瓣的长度/宽度)
KNN--K-最近邻算法
K-最近邻算法(KNN)
● KNN 背后的直觉:需要:相似性/距离的概念
■ 未见过的数据点 x 的标签来自于 x 的 k 个最近邻居的标签
■ 相似的数据点 ➜ 相似的标签
● 例子
■ 未见过的(灰色)数据点的标签/颜色应该是什么?
KNN 用于分类
● “训练”
■ 记住训练数据
● 对未见过的点 的预测
■ 计算到所有 训练数据点 xj 的距离 ,
例如:欧几里得距离,d = #特征数
■ 获取 k 个最近邻居
■ 的标签 = 所有 k 个最近邻居中最频繁的标签
k 通常选择为奇数,以最小化出现平局的机会
KNN 用于分类 — 距离度量
● 不同距离度量的例子
■ 欧几里得距离
■ 曼哈顿距离
■ 切比雪夫距离
● 其他度量,例如:
■ 余弦相似度
■ 杰卡德相似度
■ ...
■ 用户定义的度量
KNN 用于分类 — 示例
● IRIS 数据集
■ 3个类别,每个类别50个样本
■ 4个连续特征,但只 使用了2个:(花萼的长度和宽度)
● 基本的探索性数据分析
■ “红色”类别分离得很好
■“绿色”和“蓝色”类别之间有很多重叠
● 常见结果
■ 不同的 k 会产生不同的结果
■ (非常)小的 k — 结果对噪声和异常值非常敏感
■ 大的 k — 没有足够的能力来正确分离类别
■ 非常大的 k — 训练数据中最频繁的类别开始占主导地位
1-最近邻:Voronoi镶嵌
● 1-NN的决策边界=来自Voronoi镶嵌
■ 将空间分割成单元格
■ 单元格:最接近单个数据点的一组点
“红色”和“蓝色”类别之间的决策边界
KNN 用于回归
● “训练”
■ 记住训练数据
● 对未见过的点 xi 的预测
■ 计算到所有 训练数据点 xj 的距离,
例如:欧几里得距离,d = #特征数
■ 获取 k 个最近邻居
■ 的标签 = 所有 k 个最近邻居的分数的平均值
KNN 用于回归 — 示例
● “年龄与体重”数据集
■ 257名男性的年龄和体重
■ 200个训练样本,57个测试样本
● 常见结果(再次)
■ 不同的 k 会产生不同的分数
■ (非常)小的 k — 预测分数对噪声和异常值非常敏感
■ 大的 k — 对太多邻居取平均
■ 非常大的 k — 预测分数趋向于平均值
k 值的选择 — 总结
● k 太小 -- 过拟合的风险
■ 预测对噪声/异常值敏感
■ 非常不均匀的决策边界 (或回归线)
● k 太大 -- 欠拟合的风险
■ 无法捕捉局部模式
■ 非常平滑的决策边界 (或回归线)
优点 & 缺点...及注意事项
优点 & 缺点...及注意事项
● 优点
■ 非常简单和直观的算法 — 但性能常常出人意料地好!
■ 通用算法 — 只要点之间的距离可以“有意义地”测量,就可以应用
■ 可以产生任意形状的决策边界
■ 无训练时间
● 缺点
■ 在测试时找到邻居可能会很慢 (实践中:数据结构和辅助算法用于加速 k-NN 搜索)
■ 需要存储所有训练数据
● 注意事项
■ “...只要点之间的距离可以‘有意义地’测量,就可以应用”
注意事项 1:
特征值(范围,大小)
● 欧几里得距离对属性值的范围和大小敏感
数据归一化
● Z-分数归一化,例如:
- :是第i个观测值的“weight”特征的标准化值。
- :是“weight”特征的均值。
- :是“weight”特征的标准差。标准差 = sqrt(方差)
● 最小-最大归一化,例如:
数据归一化 —— 直观展示
● 187名女性(红色)和165名男性(蓝色)的(体重,身高)数据点
注意:归一化假设所有特征都同样重要。但这可能并不总是正确的!
注意事项 2:
维数灾难
● 高维度的效应(即,特征众多)
■ 数据点往往不会靠得很近
■ 点与点之间的平均距离趋于一致
● 直觉
■ 假设 N 个数据点均匀分布 在一个具有 d 维度的单位立方体内
■ 设 L 为包含数据点的 k-NN 的最小立方体的边长
立方体与k-NN几乎占据了整个单位立方体!
维度诅咒
● 在不同数量的维度下,1000个随机数据点之间的成对距离分布
注意事项 3:非数值数据
● 实际应用中:特征通常是分类的
■ 有序的 —— 教育水平,成绩等。
■ 无序的 —— 性别,婚姻状况等。
● 基本方法:将分类特征转换为数值特征
■ 允许直接使用常见的距离度量
■ 不会自动产生良好的结果
● 二元特征
■ 分类数据的特殊情况
■ 转换为二进制变量 0/1 以表示不存在/存在
● 有序特征
■ 利用特征值的自然顺序
■ 在保留其原始顺序的同时,将其转换为数值
● 无序特征(具有n个不同的值)
■ 独热编码:将无序特征转换为N个二元特征
■ 将每个新的二元特征转换为二进制变量0/1,以表示不存在/存在
■ 增加了维度! (特别是当N非常大时)
● 讨论 / 限制
■ 独热编码增加了数据的维度
■ 有序值之间的距离通常不直观
5(PhD)-4(Masters) ?= 2(College)- 1 (Poly)
■ 通常需要数据标准化 (特别是与数值特征结合时)
● 替代方法:自定义距离度量
■ 设计适当量化分类值之间距离的度量
■ 通常非常特定于给定的数据集和应用上下文。
注意事项 4:语义相似性 vs. 低级相似性
● 非结构化数据 (文本,图像,视频,音频)
■ 对象通常不仅仅是 其各部分的总和
● 示例(狗粮广告)
■ 像素级相似性大; 易于计算
■ 语义相似性小
监督训练/学习 —— 扩展设置
● 回顾基本设置:训练数据 + 测试数据
● 构建一个好的分类器或回归器
■ 找到最佳的数据预处理步骤 ➜ 需要迭代评估
■ 找到最佳模型(模型选择)➜ 需要迭代评估
■ 找到最佳超参数值 ➜ 需要迭代评估
● 重要:不允许为此使用测试数据!
■ 测试数据应该包含真正未见过的数据
■ 当用于优化/调整模型时,测试数据不再是未见过的 (例如,对于不同的训练-测试分割,结果可能会有所不同)
使用验证数据的训练和评估过程
● 常见的数据分割以确保结果的普遍适用性
■ 只在最后使用测试数据来评估最终模型的性能
■ 使用验证数据进行模型选择和超参数调整
K-折交叉验证(众多验证技术中的一种)
● k-折交叉验证的核心思想
■ 将训练数据分成k个大小相等的块(例如,k=10)
■ 使用(k-1)个块进行训练,剩下的块用于评估
■ 用不同的排列重复k轮
● K-折交叉验证的优点:
-
更可靠的性能评估:由于模型在 K 个不同的训练/验证集上进行了评估,得到的性能指标更为稳定和可靠。
-
减少过拟合:通过多次训练和验证,可以减少模型对特定数据子集的过拟合。
-
充分利用数据:所有的数据都被用作了训练和验证,这在数据量有限的情况下尤其有价值。结果之间的方差是有用的指标。
● K-折交叉验证的缺点:
-
计算成本高:需要训练和验证模型 K 次,这可能需要更多的计算时间和资源。
-
不适用于所有数据分布:如果数据集中的某些类别样本很少,简单的K-折交叉验证可能不会在每个折中都反映这些类别。在这种情况下,可以使用分层 K-折交叉验证,确保每个折中都有各个类别的代表样本。
通过标准化的信息泄露
● 重要指南
■ 在将数据集分割为训练和测试数据之前,不要进行标准化!
■ 对训练和测试数据进行标准化,但只基于训练数据!
总结
● 分类器的评估(对于回归器来说很直接)
■ 不同的度量有不同的解释
■ 度量的适用性取决于数据和任务
● K-最近邻(KNN)分类器/回归器
■ 非常直观的监督学习模型
■ 对于(非常)大的数据集适用性有限 (在预测时而不是在训练时进行重计算)
■ 超参数k的选择重要,以解决过拟合和欠拟合的风险
● 1. k 值过小:
-
噪声的影响增大:当 k=1 时,算法完全依赖于训练数据中的单个最近邻居。这可能导致模型对噪声和异常值非常敏感,因为它可能会基于一个噪声点做出决策。
-
高方差:由于模型过于依赖于训练数据中的局部特征,它可能会有很高的方差和较低的偏差。这意味着模型可能在训练数据上表现得很好,但在新的、未见过的数据上表现得很差。
● 2. k 值过大:
-
计算成本增加:考虑更多的邻居需要更多的计算。
-
可能忽略局部模式:当 k 值非常大时,算法可能会考虑许多远离查询点的邻居,这可能导致忽略数据的局部模式。
-
高偏差:当 k 值增加时,决策边界可能会变得更加平滑。这可能导致模型的偏差增加,因为它可能过于简化问题,不能捕捉到数据中的细微差异。
-
受到主导类的影响:在不平衡的数据集中,如果 k 值过大,那么模型可能会受到主导类的影响。例如,如果某个类的样本数量远远大于其他类,那么大的 k 值可能会导致这个主导类对预测结果产生过大的影响。