INT303 Big Data Analysis 大数据分析 Pt.10 分析模型和混合模型

文章目录

  • [1. 最近邻分类器(Nearest neighbor classifier)](#1. 最近邻分类器(Nearest neighbor classifier))
    • [1.1 基于实例的分类器(Instance-Based Classifiers)](#1.1 基于实例的分类器(Instance-Based Classifiers))
      • [1.1.1 最近邻分类器(Nearest neighbor classifier)](#1.1.1 最近邻分类器(Nearest neighbor classifier))
        • [1.1.1.1 计算距离](#1.1.1.1 计算距离)
        • [1.1.1.2 识别k个最近邻居](#1.1.1.2 识别k个最近邻居)
        • [1.1.1.3 从最近邻列表中确定类别](#1.1.1.3 从最近邻列表中确定类别)
        • [1.1.1.4 Voronoi图](#1.1.1.4 Voronoi图)
        • [1.1.1.5 选择k的值](#1.1.1.5 选择k的值)
        • [1.1.1.6 小结](#1.1.1.6 小结)
  • [2. SVM](#2. SVM)
    • [2.1 SVM的细节](#2.1 SVM的细节)
    • [2.2 如果非线性可分](#2.2 如果非线性可分)
    • [2.3 如果超平面非线性](#2.3 如果超平面非线性)
  • [3. 逻辑回归](#3. 逻辑回归)
    • [3.1 线性回归](#3.1 线性回归)
    • [3.2 逻辑回归](#3.2 逻辑回归)
      • [3.2.1 一维情况](#3.2.1 一维情况)
      • [3.2.2 二维情况](#3.2.2 二维情况)
    • [3.3 最大似然估计](#3.3 最大似然估计)
  • [4. 泛化能力(Generalization)](#4. 泛化能力(Generalization))
    • [4.1 偏差-方差权衡(Bias-Variance Tradeoff)](#4.1 偏差-方差权衡(Bias-Variance Tradeoff))
    • [4.2 小结](#4.2 小结)
  • [5. 评估](#5. 评估)
    • [5.1 性能评估指标](#5.1 性能评估指标)
      • [5.1.1 混淆矩阵(Confusion Matrix)](#5.1.1 混淆矩阵(Confusion Matrix))
      • [5.1.2 ROC曲线](#5.1.2 ROC曲线)
      • [5.1.3 精确率-召回率(Precision-Recall)图](#5.1.3 精确率-召回率(Precision-Recall)图)
    • [5.2 评估方法](#5.2 评估方法)
    • [5.3 获得可靠的估计](#5.3 获得可靠的估计)
      • [5.3.1 成本矩阵(Cost Matrix)](#5.3.1 成本矩阵(Cost Matrix))
      • [5.3.2 小结](#5.3.2 小结)
  • [6. 监督学习的步骤](#6. 监督学习的步骤)
    • [6.1 建模问题(Model the problem)](#6.1 建模问题(Model the problem))
    • [6.2 特征提取(Feature Extraction)/特征工程(Feature Engineering)](#6.2 特征提取(Feature Extraction)/特征工程(Feature Engineering))
    • [6.3 获取标记数据(Obtain labeled data)](#6.3 获取标记数据(Obtain labeled data))
    • [6.4 处理少量标记数据](#6.4 处理少量标记数据)
    • [6.5 决定技术(Decide on the technique)](#6.5 决定技术(Decide on the technique))

1. 最近邻分类器(Nearest neighbor classifier)

1.1 基于实例的分类器(Instance-Based Classifiers)

基于实例的分类器是一种机器学习方法,它通过存储训练数据集(即"已存储的案例")来对新的、未见过的数据(即"未见过的案例")进行分类。

当需要对新样本进行分类时,分类器会查找训练集中与新样本最相似的样本,并根据这些相似样本的类别来预测新样本的类别。

我们可以理解为我们最基本的现实世界中以最近似的情况做参考从而解决我们当下的问题。

我们给出这样的基于实例的分类器(Instance-Based Classifiers)的例子:

  1. 死记硬背学习器(Rote-learner)
    这种分类器会记住整个训练数据集。
    它只在新样本的属性与训练集中某个样本的属性完全匹配时才进行分类。
    这意味着,如果新样本与训练集中的某个样本完全相同,死记硬背学习器可以直接给出该样本的类别标签。
    这种方法的缺点是,它对噪声和不相关的属性非常敏感,因为它需要完全匹配,这在实际应用中可能不太现实。
  2. 最近邻分类器(Nearest neighbor classifier)
    这种分类器使用k个"最接近"的点(即最近邻)来进行分类。
    当遇到一个新的样本时,最近邻分类器会计算这个新样本与训练集中所有样本的距离(通常使用欧几里得距离、曼哈顿距离等)。
    然后,它会选择距离最近的k个样本(即k个最近邻)。
    最后,根据这k个最近邻样本的类别,通过投票或其他方法来决定新样本的类别。
    最近邻分类器的优点是它不需要在训练阶段学习一个模型,因此对于新样本的分类可以非常灵活。但它的缺点是计算成本可能较高,尤其是在大数据集上,因为每次分类都需要计算新样本与所有训练样本的距离。

1.1.1 最近邻分类器(Nearest neighbor classifier)

下图展示了一个其的基本思想:如果测试数据走起来像个鸭子,叫起来像鸭子,那么它应该是鸭子。

最近邻分类器由三部分组成:

  1. 存储的记录集(The set of stored records):这是用于训练的数据集,包含已知类别的样本。
  2. 距离度量(Distance Metric):用于计算未知记录与其他训练记录之间的距离。常见的距离度量包括欧氏距离、曼哈顿距离等。
  3. k值(The value of k):即最近邻的数量,表示在进行分类时需要考虑的最近邻居的数量。

分类步骤如下:

  1. 计算距离(Compute distance to other training records):计算未知记录与所有训练记录之间的距离。
  2. 识别k个最近邻居(Identify k nearest neighbors):根据计算出的距离,找出距离最近的k个训练记录。
  3. 使用最近邻居的类别标签确定未知记录的类别标签(Use class labels of nearest neighbors to determine the class label of unknown record):通过某种方法(例如多数投票)来确定未知记录的类别标签。

如图所示,根据最近邻的三个的类别标签进行投票,那这个点就是正类。

1.1.1.1 计算距离

那如何计算两点之间的距离呢?

通常使用欧几里得距离(Euclidean distance):这是一种常用的距离度量方法,用于计算多维空间中两点之间的直线距离。

公式如下: d ( p , q ) = ∑ i ( p i − q i ) 2 d(p, q) = \sqrt{\sum_{i} (p_i - q_i)^2} d(p,q)=∑i(pi−qi)2

其中, p p p和 q q q是两个点, p i p_i pi和 q i q_i qi分别是这两个点在第 i i i个维度上的坐标。

1.1.1.2 识别k个最近邻居

我们的k值决定要识别几个最近邻居。

k=1时,1-nearest neighbor(1-最近邻):

只考虑与未知记录距离最近的一个训练数据点。

k=2时, 2-nearest neighbors(2-最近邻):

考虑与未知记录距离最近的两个训练数据点。

k=3时, 3-nearest neighbors(3-最近邻):

考虑与未知记录距离最近的三个训练数据点。

1.1.1.3 从最近邻列表中确定类别

我们从最近邻列表中确定类别也有两种方法:

  1. 多数投票法:在找到k个最近邻后,可以通过多数投票的方式来确定未知点的类别。即,看这k个最近邻中哪个类别的点最多,就将未知点归为该类别。
  2. 根据距离加权投票:除了简单的多数投票,还可以根据距离对投票进行加权。距离越近的点对最终决策的影响越大。
    • 权重因子: w = 1 d 2 w = \frac{1}{d^2} w=d21,这里 d d d是未知点与最近邻点之间的距离。
      通过这种方式,距离未知点更近的邻居在投票时会有更大的权重。
1.1.1.4 Voronoi图

Voronoi图是一种将空间划分为多个区域的方法,每个区域由一个点(训练样本)定义,并且包含所有比任何其他点更接近该点的点。

下图展示了一个例子。

1.1.1.5 选择k的值

当k值较小时,模型会更多地受到噪声点的影响,因为噪声点可能会错误地影响分类决策。

当k值较大时,所考虑的邻域可能会包括来自不同类别的点,这可能会稀释分类的准确性。

因此k值的选择直接影响模型的拟合程度和泛化能力。当k值较小时,模型可能会过于复杂,以至于它开始拟合训练数据中的噪声和细节,而不是学习数据的一般模式。这可能导致过拟合,即模型在训练数据上表现很好,但在新数据上表现不佳。

下图展示了k=1和k=15时,数据分类的区别。

1.1.1.6 小结

k-NN分类器是惰性学习器(lazy learners),与积极学习器(eager learners)(例如决策树)相对,惰性学习器在训练阶段不构建明确的模型。相反,它们存储训练数据,并在需要进行预测时才使用这些数据。这意味着它们在训练阶段的计算成本较低,但在预测阶段可能需要更多的计算资源。

由于k-NN需要对每个新数据点计算与所有训练数据点的距离,这个过程可能非常耗时,特别是当训练数据集很大时。所以其对未知记录进行分类相对昂贵。

使用朴素方法(即直接计算新点与所有训练点的距离)的k-NN算法的时间复杂度为 O ( n ) O(n) O(n),其中n是训练数据点的数量。

为了提高检索最近邻的效率,通常需要使用特定的数据结构(如kd树、球树等)来组织训练数据,从而加快距离计算和最近邻检索的速度。

当数据集非常大或维度非常高时,精确搜索最近邻可能不切实际。在这种情况下,可以使用近似算法来快速找到近似的最近邻。

随着数据维度的增加,数据点之间的距离变得不那么有意义,因为高维空间中的距离往往会变得均匀分布。这使得在高维空间中使用基于距离的算法(如k-NN)变得困难。也就是陷入维度的诅咒(Curse of dimensionality)。

2. SVM

线性分类器是一类假设类别可以通过线性边界(即超平面)分离的分类器。这意味着在特征空间中,存在一个平面(在二维空间中)或超平面(在高维空间中),可以将不同类别的数据点分开。

支持向量机是一种特定的线性分类器,它也假设类别是线性可分的。

SVM的主要目标是找到一个最优的超平面,使得不同类别的数据点被正确分类,并且超平面与最近的数据点之间的距离(即间隔)最大化。这种最大化间隔的超平面被称为最优超平面(Optimal Hyperplane)。

如下面的几张图片给出了对相同数据不同的超平面。


那这些超平面哪个更好呢?我们刚刚说了SVM是想超平面与最近的数据点之间的距离(即间隔)最大化。

如下图所示,B1的超平面与最近的数据点之间的距离比B2的超平面更大,所以B1的超平面比B2更好。

2.1 SVM的细节

如上图所示,我们的超平面方程为:
w ⃗ ⋅ x ⃗ + b = 0 \vec{w} \cdot \vec{x} + b = 0 w ⋅x +b=0。

有了超平面之后,我们便可以决定一个新的数据点 x ⃗ \vec{x} x 属于哪个类别,决定的决策函数如下:
f ( x ⃗ ) = { 1 if w ⃗ ⋅ x ⃗ + b ≥ 1 − 1 if w ⃗ ⋅ x ⃗ + b ≤ − 1 f(\vec{x}) = \begin{cases} 1 & \text{if } \vec{w} \cdot \vec{x} + b \geq 1 \\ -1 & \text{if } \vec{w} \cdot \vec{x} + b \leq -1 \end{cases} f(x )={1−1if w ⋅x +b≥1if w ⋅x +b≤−1

间隔是支持向量边界之间的距离,它是SVM优化的目标之一。SVM试图最大化这个间隔,以提高分类器的泛化能力。间隔的表达式为: Margin = 2 ∥ w ⃗ ∥ \text{Margin} = \frac{2}{\|\vec{w}\|} Margin=∥w ∥2

这里最大化间隔其实可以等价于最小化损失函数:
L ( w ⃗ ) = ∥ w ⃗ ∥ 2 2 L(\vec{w}) = \frac{\|\vec{w}\|^2}{2} L(w )=2∥w ∥2

这个优化问题还受到以下约束条件的限制:
w ⃗ ⋅ x ⃗ i + b ≥ 1 if y i = 1 \vec{w} \cdot \vec{x}_i + b \geq 1 \quad \text{if } y_i = 1 w ⋅x i+b≥1if yi=1
w ⃗ ⋅ x ⃗ i + b ≤ − 1 if y i = − 1 \vec{w} \cdot \vec{x}_i + b \leq -1 \quad \text{if } y_i = -1 w ⋅x i+b≤−1if yi=−1

这里, x ⃗ i \vec{x}_i x i是第 i i i个数据点, y i y_i yi是其对应的类别标签(1 或 -1)。

我们可以将约束条件简化为 y i ( w ⃗ ⋅ x ⃗ i + b ) ≥ 1 y_i(\vec{w} \cdot \vec{x}_i + b) \geq 1 yi(w ⋅x i+b)≥1 从而方便处理。

因此我们现在是一个约束优化问题,我们需要找到 w ⃗ \vec{w} w 和 b b b,使得损失函数最小化,同时满足所有数据点的约束条件。通常使用数值方法(如二次规划)来解决这个问题。

2.2 如果非线性可分

我们前面展示的这些例子中,数据都正好线性可分,也就是超平面正好将数据分为了两类,那么如果数据不是线性可分的呢,如下图所示。

SVM通过引入松弛变量 ξ i \xi_i ξi(slack variables)来处理这种情况,这就是软间隔(Soft Margin)。以这样的方式SVM允许一些数据点位于间隔边界内或边界上。这些点不完全满足原始的间隔约束,但它们的存在可以帮助模型更好地适应数据的实际情况,从而提高模型的泛化能力。

这时超平面方程为 w ⃗ ⋅ x ⃗ + b = ξ i \vec{w} \cdot \vec{x} + b = \xi_i w ⋅x +b=ξi

间隔为 Margin = ξ i ∥ w ⃗ ∥ \text{Margin} = \frac{\xi_i}{\|\vec{w}\|} Margin=∥w ∥ξi

现在优化目标为: L ( w ) = 1 2 ∥ w ⃗ ∥ 2 + C ∑ i = 1 n ξ i L({w}) = \frac{1}{2} \|\vec{w}\|^2 + C \sum_{i=1}^{n} \xi_i L(w)=21∥w ∥2+C∑i=1nξi,其中, ∥ w ⃗ ∥ 2 \|\vec{w}\|^2 ∥w ∥2是超平面法向量的范数的平方, C C C是一个正则化参数,用于控制模型对间隔违规的容忍度,较大的 C C C值意味着更小的间隔违规容忍度,而较小的 C C C值意味着更大的容忍度。

现在的约束条件为:
w ⃗ ⋅ x ⃗ i + b ≥ 1 − ξ i if y i = 1 \vec{w} \cdot \vec{x}_i + b \geq 1 - \xi_i \quad \text{if } y_i = 1 w ⋅x i+b≥1−ξiif yi=1
w ⃗ ⋅ x ⃗ i + b ≤ − 1 + ξ i if y i = − 1 \vec{w} \cdot \vec{x}_i + b \leq -1 + \xi_i \quad \text{if } y_i = -1 w ⋅x i+b≤−1+ξiif yi=−1

2.3 如果超平面非线性

我们刚刚说的数据非线性可分其实是其中的一种情况,我们只是有一小部分数据在分界线附近影响结果,但是如果整体数据上不能用一个简单的线性超平面分开呢, 下图展示了其中一个例子。

在这个例子中我们可以清楚的看到红色的点汇聚成了一个圆形,我们能清晰地区分这里的数据,但是这里的决策平面非线性。

这个例子中,我们的分类函数为:
y ( x 1 , x 2 ) = { 1 if ( x 1 − 0.5 ) 2 + ( x 2 − 0.5 ) 2 > 0.2 − 1 otherwise y(x_1, x_2) = \begin{cases} 1 & \text{if } \sqrt{(x_1 - 0.5)^2 + (x_2 - 0.5)^2} > 0.2 \\ -1 & \text{otherwise} \end{cases} y(x1,x2)={1−1if (x1−0.5)2+(x2−0.5)2 >0.2otherwise

这个函数定义了一个圆形的决策边界,其中心位于 (0.5, 0.5),半径为 0.2。如果一个点到中心的距离大于半径,则分类为1;否则分类为-1。

对于一些处理非线性可分的数据地时候,我们可以通过将数据转换到更高维的空间来实现线性可分。下图展示了一个例子。

非线性方程:
x 1 2 − x 1 + x 2 2 − x 2 = − 0.46 x_1^2 - x_1 + x_2^2 - x_2 = -0.46 x12−x1+x22−x2=−0.46

这个方程在原始二维空间中定义了一个曲线,但在转换后的空间中,这个曲线可以被看作是线性的。

特征映射(Feature Mapping):
Φ : ( x 1 , x 2 ) → ( x 1 2 , x 2 2 , 2 x 1 , 2 x 2 , 1 ) \Phi : (x_1, x_2) \rightarrow (x_1^2, x_2^2, \sqrt{2}x_1, \sqrt{2}x_2, 1) Φ:(x1,x2)→(x12,x22,2 x1,2 x2,1)

这个映射将原始的二维数据点 ( x 1 , x 2 ) (x_1, x_2) (x1,x2)转换为五维特征向量,使得数据在新的空间中可能变得线性可分。

决策边界:
w 4 x 1 2 + w 3 x 2 2 + w 2 2 x 1 + w 1 2 x 2 + w 0 = 0 w_4x_1^2 + w_3x_2^2 + w_2\sqrt{2}x_1 + w_1\sqrt{2}x_2 + w_0 = 0 w4x12+w3x22+w22 x1+w12 x2+w0=0

这是在转换后的空间中的线性决策边界方程。这里, w 0 w_0 w0, w 1 w_1 w1, w 2 w_2 w2, w 3 w_3 w3, w 4 w_4 w4是权重参数。

核函数:
w ⃗ ⋅ Φ ( x ⃗ ) + b = 0 \vec{w} \cdot \Phi(\vec{x}) + b = 0 w ⋅Φ(x )+b=0

这是使用核函数表示的决策边界,其中 Φ ( x ⃗ ) \Phi(\vec{x}) Φ(x )是特征映射, w ⃗ \vec{w} w 是权重向量, b b b是偏置。

3. 逻辑回归

回归不是直接预测记录的类别,而是预测给定记录属于某个类别的概率。

我们需要将传统的分类问题转化为回归问题。这里复习以下这两个问题。

分类问题:通常涉及预测离散的类别标签,例如,一个图像是猫还是狗。

回归问题:涉及预测连续的数值,例如,明天的气温。

那现在如何定义要预测的概率?

3.1 线性回归

我们现在使用线性回归来学习一个线性函数,该函数预测0或1的值。

下面给出一个例子。

这里展示了30天内患有败血症的患者的死亡率与基线时的APACHE II评分之间的关系。蓝色点表示存活(Survived)和死亡(Died)的患者。红色直线表示通过线性回归学习到的线性函数,该函数试图将存活和死亡的患者分开。

这种方法可能产生负概率或大于1的概率,这在概率预测中是不合理的。

我们希望对于较小的值,概率接近0,对于较大的值,概率接近1,并且在值20左右有一个从0到1的过渡。

3.2 逻辑回归

逻辑函数(也称为sigmoid函数),表达式如下:
f ( x ) = 1 1 + e − α − β x f(x) = \frac{1}{1 + e^{-\alpha - \beta x}} f(x)=1+e−α−βx1

这是逻辑函数的标准形式,其中 α \alpha α和 β \beta β是参数,控制函数的形状。

参数 β β β影响函数的斜率,即函数变化的快慢。

参数 α α α影响函数的S形曲线的中心位置,即函数从0到1变化的中点。

另一种逻辑函数的表达方式是:
π ( x ) = exp ⁡ ( α + β x ) 1 + exp ⁡ ( α + β x ) \pi(x) = \frac{\exp(\alpha + \beta x)}{1 + \exp(\alpha + \beta x)} π(x)=1+exp(α+βx)exp(α+βx)

当 x = − α β x = -\frac{\alpha}{\beta} x=−βα时,函数的值为0.5,这是逻辑函数的转折点,即输出概率为50%的点。

图中展示了不同 α α α和 β β β值下的逻辑函数曲线。每条曲线代表一组特定的 α α α和 β β β值。

3.2.1 一维情况

我们现在说类别概率:
( P ( C + ∣ x ) (P(C_+|x) (P(C+∣x)表示给定输入 x x x时,属于正类 C + C_+ C+的概率,公式如下:
P ( C + ∣ x ) = 1 1 + e − β x − α P(C_+|x) = \frac{1}{1 + e^{-\beta x - \alpha}} P(C+∣x)=1+e−βx−α1

这里, α \alpha α和 β \beta β是模型参数,控制曲线的形状和位置。
( P ( C − ∣ x ) (P(C_-|x) (P(C−∣x)表示给定输入 x x x时,属于负类 C − C_- C−的概率,公式如下:
P ( C − ∣ x ) = e − β x − α 1 + e − β x − α P(C_-|x) = \frac{e^{-\beta x - \alpha}}{1 + e^{-\beta x - \alpha}} P(C−∣x)=1+e−βx−αe−βx−α

这两个概率的和总是等于1,因为它们代表了所有可能的分类结果。

找到参数 β \beta β和 α \alpha α的值,使得观察到的数据的概率最大化。
log ⁡ P ( C + ∣ x ) P ( C − ∣ x ) = β x + α \log \frac{P(C_+|x)}{P(C_-|x)} = \beta x + \alpha logP(C−∣x)P(C+∣x)=βx+α

这个公式表示的是log-odds(对数几率),即事件发生的对数几率与其不发生的几率的比值。

下图展示了参数 β β β影响逻辑函数的斜率,即函数变化的快慢。

较大的 β β β值导致决策边界更陡峭,而较小的 β β β值导致决策边界更平缓。

3.2.2 二维情况

下图展示了二维情况的一个例子。

逻辑回归模型的决策边界是通过以下公式计算得出的:
log ⁡ P ( C − ∣ x ) P ( C + ∣ x ) = β 1 x 1 + β 2 x 2 + α \log \frac{P(C_-|x)}{P(C_+|x)} = \beta_1 x_1 + \beta_2 x_2 + \alpha logP(C+∣x)P(C−∣x)=β1x1+β2x2+α

其中, x 1 x_1 x1和 x 2 x_2 x2是输入特征, β 1 \beta_1 β1、 β 2 \beta_2 β2和 α \alpha α是模型参数。

3.3 最大似然估计

我们该如何确定逻辑回归模型的系数,使得模型对观察到的数据的拟合度最高呢?

我们可以使用最大似然估计。

最大似然估计(Maximum Likelihood Estimation)的目标是找到参数 w w w(包括权重 β β β和偏置 α α α)的值,使得观察到的数据的概率最大化。

对数似然函数的公式为: L ( w ) = ∑ i [ y i log ⁡ P ( y i ∣ x i , w ) + ( 1 − y i ) log ⁡ ( 1 − P ( y i ∣ x i , w ) ) ] L(w) = \sum_{i} \left[ y_i \log P(y_i|x_i, w) + (1 - y_i) \log(1 - P(y_i|x_i, w)) \right] L(w)=∑i[yilogP(yi∣xi,w)+(1−yi)log(1−P(yi∣xi,w))]

其中, y i y_i yi是第 i i i个样本的实际类别标签, P ( y i ∣ x i , w ) P(y_i|x_i, w) P(yi∣xi,w)是给定输入 x i x_i xi和参数 w w w时,属于类别 y i y_i yi的概率。

这个函数衡量了在给定参数 w 下,观察到的数据的似然性。通过最大化这个函数,我们可以找到最优的参数值。

不幸的是,这个对数似然函数没有闭式解(即没有简单的解析解),我们可以使用梯度下降算法来找到对数似然函数的局部最小值。

4. 泛化能力(Generalization)

泛化能力指的是分类器正确分类它之前未见过的数据的能力。

我们一般假设新的数据来自与训练数据相同的分布或模型。但现实不都是如此。

我们在分类问题上有两种错误:

  1. 训练错误(Training errors):在训练集上犯的错误。这些是我们在创建分类器时可以控制的错误。我们希望训练错误能够反映泛化错误,但并不总是如此。
  2. 测试错误(Test errors):在测试集上犯的错误。这是泛化能力的真正衡量标准,我们希望这个错误尽可能小,但在训练时我们无法访问测试错误。

下图是展示了我们例子的数据集。

这些数据中我们添加了一些噪点。现在我们将这里百分之10的数据用于训练,百分之90用于测试。

下图展示了决策树模型在不同节点数量下的训练误差。

随着节点数量的增加,决策树的复杂度也增加。而随着模型复杂度的增加,训练误差会逐渐降低。

但这就代表节点越大越好吗?

我们刚刚提到泛化能力就是衡量决策树的优秀指标。

我们先看在节点数量较少的时候。

这时候模型简单,随着节点数量的增加,训练误差和测试误差都迅速下降。

这是因为模型简单,无法捕捉数据中的模式,所以欠拟合(Underfitting)。

欠拟合时,模型在训练集和测试集上的表现都不好。

但是当节点数量较多时。

这时候模型就过于复杂了,训练误差持续下降,因为更多的节点可以使模型更好地拟合训练数据。但是测试误差在达到某个点后开始上升。这就是过拟合(Overfitting),即在训练集上表现很好,但在测试集上表现不佳。

过拟合时,

模型可能会学习到训练数据中的噪声和细节,而不是数据的一般规律。这导致模型在训练数据上表现很好,但在新数据上表现不佳,即泛化能力差。

泛化能力指的是模型对未见过的数据进行预测的能力。理想的模型应具有低的训练误差和测试误差,这表明模型既能很好地拟合训练数据,也能很好地泛化到新数据。

因此选择模型时需要平衡复杂度和泛化能力。过于简单的模型(欠拟合)和过于复杂的模型(过拟合)都不理想。

4.1 偏差-方差权衡(Bias-Variance Tradeoff)

偏差-方差权衡(Bias-Variance Tradeoff)用来描述模型复杂度与泛化能力之间的关系。

偏差(Bias)衡量模型对训练数据的拟合程度。

高偏差(High Bias)意味着模型过于简单,无法捕捉到数据的真实模式,导致欠拟合(Underfitting)。例如,使用只有一个决策节点的决策树,或者在拟合复杂曲线时使用线性函数,都可能导致高偏差。

方差(Variance)衡量模型误差对训练数据变化的敏感程度。

高方差(High Variance)意味着模型过于复杂,容易过拟合(Overfitting)。例如,每个叶子节点只有一个样本的决策树,或者非常高阶的多项式曲线。这些模型对数据的小变化非常敏感,容易受到噪声的影响。

在偏差和方差之间存在一个权衡(Tradeoff)。减少一个通常会导致另一个增加。例如,增加模型的复杂度可以减少偏差(使模型更好地拟合训练数据),但同时也可能增加方差(使模型对训练数据中的噪声更加敏感)。

理想的模型应该在偏差和方差之间找到一个平衡点,以达到最佳的泛化性能。这意味着模型既不太简单也不太复杂,能够很好地拟合训练数据,同时也能在未见过的数据上表现良好。

4.2 小结

泛化能力不佳的原因有很多,可能的原因如下。

  1. 训练数据不足
    当训练数据量不足时,模型可能无法学习到数据的真实分布和模式,导致其在新数据上的泛化能力差。
  2. 训练数据不具代表性
    如果训练数据不能代表整个数据分布,模型可能会学习到一些特定于训练集的噪声或偏差,从而在更广泛的数据上表现不佳。
  3. 错误的训练数据
    训练数据中的错误或异常值可能会误导模型学习,导致模型在正常数据上的表现不佳。
  4. 模型过于复杂
    如果模型复杂度超过了数据的需要,可能会导致过拟合,即模型在训练数据上表现很好,但在新数据上泛化能力差。
  5. 多重比较程序
    在模型选择或超参数调整过程中,如果进行了多次比较或尝试,可能会无意中选择了在特定测试集上表现最好的模型,而不是真正具有最好泛化能力的模型。这种现象有时被称为"数据窥探查"(data snooping)或"选择偏差"(selection bias)。

当训练数据集的大小增加时,模型在训练集上学习到的信息更加丰富和全面,这有助于模型更好地理解数据的底层结构和分布。因此,模型在训练集上的表现(训练误差)和在测试集上的表现(测试误差)之间的差异会减少。

更多的训练数据可以帮助模型避免过拟合,即模型不会过于复杂以至于只记住训练数据的细节和噪声,而是能够捕捉到更普遍的特征,从而提高其在新数据上的泛化能力。

因此增加训练数据集的大小是提高模型泛化能力的一种有效方法。

过拟合通常会导致创建的决策树模型比实际需要的更复杂。这意味着模型可能包含过多的分支和叶子节点,试图捕捉训练数据中的每一个细节,包括噪声和异常值

当模型过拟合时,它在训练数据上的表现可能非常好,但这不再能准确反映模型在未见过的数据上的表现。换句话说,训练误差变得很低,但测试误差可能仍然很高。

我们说模型泛化能力差或泛化效果不好,意味着模型不能很好地将从训练数据中学到的知识应用到新的、未见过的数据上。

在模型选择上,我们可以使用验证集来估计泛化误差,并考虑模型的复杂度,我们可以避免过拟合,选择一个既能在训练数据上表现良好,又能在新数据上泛化得好的模型。

5. 评估

5.1 性能评估指标

我们现在评估的是模型的预测能力,而不是模型分类或构建的速度、可扩展性等其他方面。

5.1.1 混淆矩阵(Confusion Matrix)

混淆矩阵是一种表格布局,用于可视化真实类别与模型预测类别之间的关系。它帮助我们理解模型在不同类别上的表现。

行:表示实际的类别(Actual Class)。

列:表示模型预测的类别(Predicted Class)。

四个象限:

  • a: TP (true positive):真正例,模型正确预测为正类的数量。
  • b: FN (false negative):假负例,模型错误预测为负类(实际为正类)的数量。
  • c: FP (false positive):假正例,模型错误预测为正类(实际为负类)的数量。
  • d: TN (true negative):真负例,模型正确预测为负类的数量。

即下图所示。

我们有了增幅矩阵后就可以计算以下一些指标。

准确率(Accuracy):
Accuracy = a + d a + b + c + d = T P + T N T P + T N + F P + F N \text{Accuracy} = \frac{a + d}{a + b + c + d} = \frac{TP + TN}{TP + TN + FP + FN} Accuracy=a+b+c+da+d=TP+TN+FP+FNTP+TN

准确率衡量的是预测的正确率。

精确率(Precision):
Precision ( p ) = a a + c = T P T P + F P \text{Precision} (p) = \frac{a}{a + c} = \frac{TP}{TP + FP} Precision(p)=a+ca=TP+FPTP

精确率衡量的是模型预测为正类的样本中实际为正类的比例。

召回率(Recall):
Recall ( r ) = a a + b = T P T P + F N \text{Recall} (r) = \frac{a}{a + b} = \frac{TP}{TP + FN} Recall(r)=a+ba=TP+FNTP

召回率衡量的是实际为正类的样本中被模型正确预测为正类的比例。

F1分数(F-measure):
F-measure ( F ) = 1 ( 1 r + 1 p ) / 2 = 2 r p r + p = 2 a 2 a + b + c = 2 T P 2 T P + F P + F N \text{F-measure} (F) = \frac{1}{\left(\frac{1}{r} + \frac{1}{p}\right) / 2} = \frac{2rp}{r + p} = \frac{2a}{2a + b + c} = \frac{2TP}{2TP + FP + FN} F-measure(F)=(r1+p1)/21=r+p2rp=2a+b+c2a=2TP+FP+FN2TP

F1分数是精确率和召回率的调和平均数,用于综合考虑精确率和召回率。

精确率偏向正类(C(Yes|Yes))和正类被错误预测为负类(C(Yes|No))的情况。

召回率偏向正类(C(Yes|Yes))和负类被错误预测为正类(C(No|Yes))的情况。

F1分数偏向所有类别,除了C(No|No)。

除了刚刚提到的这几个常用的,还有些其他的指标。

错误率(Error Rate):
Error Rate = 1 − Accuracy \text{Error Rate} = 1 - \text{Accuracy} Error Rate=1−Accuracy

表示模型错误预测的比例。

特异性(Specificity)或真负类率(True Negative Rate):
Specificity = T N Rate = T N T N + F P \text{Specificity} = TN \text{ Rate} = \frac{TN}{TN + FP} Specificity=TN Rate=TN+FPTN

表示在所有实际为负类的样本中,被正确预测为负类的比例。

假阳性率(False Positive Rate, FP Rate):
FP Rate = α = F P T N + F P = 1 − Specificity \text{FP Rate} = \alpha = \frac{FP}{TN + FP} = 1 - \text{Specificity} FP Rate=α=TN+FPFP=1−Specificity

这里的Specificity,也就是敏感率是前面召回率的别名。

表示在所有实际为负类的样本中,被错误预测为正类的比例。

假阴性率(False Negative Rate, FN Rate):
FN Rate = β = F N F N + T P = 1 − Sensitivity \text{FN Rate} = \beta = \frac{FN}{FN + TP} = 1 - \text{Sensitivity} FN Rate=β=FN+TPFN=1−Sensitivity

表示在所有实际为正类的样本中,被错误预测为负类的比例。
α α α是拒绝真实零假设的概率(假阳性率,FP)。
β β β是接受错误零假设的概率(假阴性率,FN)。

5.1.2 ROC曲线

ROC曲线最初在20世纪50年代为信号检测理论而开发,用于分析噪声信号。

在这里ROC曲线用于描述正确识别正例(真正例,TP)和错误识别正例(假正例,FP)之间的权衡。

ROC曲线在y轴上绘制真正例率(TPR),在x轴上绘制假正例率(FPR)。
T P R = T P T P + F N = T P ALL POSITIVE TPR = \frac{TP}{TP + FN} = \frac{TP}{\text{ALL POSITIVE}} TPR=TP+FNTP=ALL POSITIVETP

表示所有实际为正例的样本中,被正确预测为正例的比例。
F P R = F P F P + T N = F P ALL NEGATIVE FPR = \frac{FP}{FP + TN} = \frac{FP}{\text{ALL NEGATIVE}} FPR=FP+TNFP=ALL NEGATIVEFP

表示所有实际为负例的样本中,被错误预测为正例的比例。

通过绘制真正例率与假正例率之间的关系,ROC曲线可以帮助我们理解模型在不同阈值下的表现,并找到最佳的分类阈值。理想情况下,我们希望ROC曲线尽可能靠近左上角,这表示高真正例率和低假正例率。

分类器的性能可以通过ROC曲线上的一个点来表示。这个点的位置反映了分类器在特定阈值下的性能。

改变分类器的某些参数(例如,决策树的深度、支持向量机的正则化参数等)可能会影响分类器的性能,从而改变ROC曲线上点的位置。

数据的分布变化(例如,类别不平衡、特征相关性变化等)也可能导致分类器性能的变化,进而影响ROC曲线上点的位置。

在某些应用中,不同的错误可能具有不同的成本。通过改变成本矩阵(即错误分类的成本分配),可以调整分类器的决策边界,从而影响ROC曲线上点的位置。

下图展示了一个一维数据的例子。

左图中的红色实线代表正类的概率密度函数,蓝色虚线代表负类的概率密度函数。垂直虚线表示一个特定的阈值 t t t,任何位于 x > t x>t x>t的点都被分类为正类。

右图展示了ROC曲线,其中横轴是假正例率(FPR),纵轴是真正例率(TPR)。图中的红色曲线表示分类器的性能。

(0,0):表示将所有样本都预测为负类,即没有真正例(TP)也没有假正例(FP)。

(1,1):表示将所有样本都预测为正类,即所有真正例都被正确预测,但所有负例都被错误预测为正例。

(1,0):理想情况下的点,表示所有样本都被正确预测,即没有假正例。

对角线(Diagonal line,图中蓝线):表示随机猜测的性能,即随机选择样本作为正类,其性能与随机猜测相当。

理想情况下,ROC曲线应尽可能靠近左上角,这表示高TPR和低FPR,即分类器具有很好的区分能力。

通过调整模型的参数,可以改变分类器的性能,从而在ROC曲线上移动点的位置。通常,这些点会从"NO"列(假负例)移动到"YES"列(真正例)。

那我们如何用ROC比较两个模型到底哪个好哪个坏呢?如下图所示。

没有模型在所有情况下都优于另一个模型。对于较小的假正例率(FPR),模型 M 1 M_1 M1表现更好。对于较大的假正例率(FPR),模型 M 2 M_2 M2表现更好。

我们可以使用AUC来量化这个问题。 AUC(Area Under the ROC curve)是ROC曲线下的面积。AUC值越接近1,模型性能越好。

因此理想情况下,AUC值为1,表示模型完美区分正负类。随机猜测的AUC值为0.5,即对角线。

5.1.3 精确率-召回率(Precision-Recall)图

精确率-召回率(Precision-Recall)图可以帮助控制精确率和召回率之间的权衡。

横轴表示召回率(Recall),即模型正确识别的正例占所有实际正例的比例。

纵轴表示精确率(Precision),即模型正确识别的正例占所有被预测为正例的比例。

下图展示了一个例子。

这里曲线越靠近右上角,模型的性能通常越好。

同样它也可以使用曲线下面积(Area Under the Curve,AUC)来进行模型间的比较。

5.2 评估方法

下面介绍一些评估模型性能的方法,这些方法用于估计模型在新数据上的泛化能力。

  1. 保留法(Holdout):
    将数据集分为三部分,其中两部分用于训练模型,剩下的一部分用于测试模型。
  2. 随机子抽样(Random subsampling):
    随机选择数据的一个子集可能不完全代表整个数据集,因此可能存在偏差。为了减少偏差,可以多次执行保留法,每次选择不同的训练集和测试集。
  3. 交叉验证(Cross validation):
    将数据集划分为k个互不重叠的子集。在k-1个子集上训练模型,在剩下的一个子集上测试模型。这种方法确保每个数据点都被用于训练和测试相同次数。
  4. 留一法(Leave-one-out):
    这是交叉验证的特例(k=n)。当数据集的大小为n时,每次只留下一个样本作为测试集,其余n-1个样本用于训练集。
  5. 自助法(Bootstrap)
    从原始数据集中有放回地抽取样本,即同一个样本可能被多次抽取。这样大约百分之67的数据用于训练,剩余的百分之27用于测试。

5.3 获得可靠的估计

我们有时候会遇到类别不平衡的问题。

类别不平衡指的是数据集中不同类别的样本数量差异很大。下面给出一个例子:

类别0(Class 0)的样本数量:9990

类别1(Class 1)的样本数量:10

在给出的例子中,类别0(Class 0)的样本数量远多于类别1(Class 1)的样本。

如果模型简单地将所有样本预测为类别0,那么在这种情况下,模型的准确率(Accuracy)会非常高达到百分之99.9,因为大多数样本都是类别0。但这显然是误导性的,因为模型没有正确检测到任何类别1的样本。

在类别不平衡的数据集中,准确率可能不是一个好的性能评估指标,因为它不能反映模型对少数类别的识别能力。

在类别不平衡的情况下,精确率(Precision)和召回率(Recall)是更好的性能评估指标。

还可以通过从样本数量较多的类别中采样,使得两个类别的样本数量相同,从而平衡类别分布。

我们也可以通过复制少数类别的样本,使得各类别的样本数量相等,从而平衡类别分布。

为了避免这里过拟合,我们通过使用成本敏感的度量(cost-sensitive metric)来修改模型的优化准则。这意味着模型在训练过程中会给予少数类别更高的权重,从而减少对这些类别的过拟合。

5.3.1 成本矩阵(Cost Matrix)

成本矩阵(Cost Matrix)用于在机器学习中处理分类问题时,特别是当不同错误类型具有不同成本时。成本矩阵帮助我们量化分类错误的影响,从而优化模型的性能。

C ( i ∣ j ) C(i|j) C(i∣j)表示将类别 j j j的样本错误分类为类别 i i i的成本。

我们将每个单元格的成本用不同的权重进行计算。

因此我们现在再结合混淆矩阵计算的是加权准确率:
Weighted Accuracy = w 1 a + w 4 d w 1 a + w 2 b + w 3 c + w 4 d \text{Weighted Accuracy} = \frac{w_1a + w_4d}{w_1a + w_2b + w_3c + w_4d} Weighted Accuracy=w1a+w2b+w3c+w4dw1a+w4d

这个公式用于计算考虑不同错误类型成本的加权准确率,其中 a a a是真正例(TP), b b b是假负例(FN), c c c是假正例(FP), d d d是真负例(TN),而 w 1 w_1 w1, w 2 w_2 w2, w 3 w_3 w3, w 4 w_4 w4是对应于这些分类错误的权重。

下图展示了一个例子。

最上面的成本矩阵中我们给了很多的权重在负类错误分类为正类的成本上。

因此无论是模型 M 1 M_1 M1还是 M 2 M_2 M2上,这些模型本来正确率都很高,但是加权准确率反应了这个模型还是不够理想。

我们还可以用成本去比较不同模型。成本考虑了错误分类的成本,提供了一个更全面的模型性能评估指标,特别是在错误分类成本不同的场景中。。计算公式为:
Classification Cost = w 1 a + w 2 b + w 3 c + w 4 d \text{Classification Cost} = w_1a + w_2b + w_3c + w_4d Classification Cost=w1a+w2b+w3c+w4d

5.3.2 小结

总结一下准确率的公式为:
Accuracy = a + d N = a + d a + b + c + d \text{Accuracy} = \frac{a+d}{N} = \frac{a+d}{a+b+c+d} Accuracy=Na+d=a+b+c+da+d

成本计算的公式为:
Cost = p ( a + d ) + q ( b + c ) \text{Cost} = p(a + d) + q(b + c) Cost=p(a+d)+q(b+c)
= p ( a + d ) + q ( N − a − d ) = p(a + d) + q(N - a - d) =p(a+d)+q(N−a−d)
= q N − ( q − p ) ( a + d ) = qN - (q - p)(a + d) =qN−(q−p)(a+d)
= N [ q − ( q − p ) × Accuracy ] = N[q - (q - p) \times \text{Accuracy}] =N[q−(q−p)×Accuracy]

6. 监督学习的步骤

我们系统学习一下监督学习的步骤。

  1. 建模问题(Model the problem)
    确定你试图预测的内容。例如,是分类问题、回归问题还是其他类型的问题。
    确定你需要哪种类型的优化函数来训练模型。这取决于问题的性质,例如,分类问题可能需要一个能够最大化类别间边界的函数。
    确定你是需要类别标签还是预测概率。例如,在某些情况下,你可能需要预测属于每个类别的概率。
  2. 提取特征(Extract Features)
    找到有助于区分不同类别的正确特征。特征选择是监督学习中的关键步骤,因为它直接影响模型的性能。
  3. 获取标记数据(Obtain labeled data)
    获取一组足够大、准确且具有代表性的标记数据。确保数据中各类别都得到了良好的表示。
  4. 决定技术(Decide on the technique)
    根据问题的性质选择正确的技术。例如,对于线性可分的问题,可能选择线性模型;对于非线性可分的问题,可能选择决策树或神经网络。
  5. 实际应用(Apply in practice)
    这里包含模型训练、模型测试、模型改进。
    • 模型训练:确定模型是否可以处理非常大的数据集,以及如何在实践中训练模型。
    • 模型测试:确定如何在实践中测试模型,以及如何评估模型的性能。
    • 模型改进:确定如何改进模型,例如通过调整模型参数、使用不同的优化算法或集成多个模型等方法。

6.1 建模问题(Model the problem)

建模问题并不总是显而易见的。下面给出一些例子。

  1. 检测电子邮件是否为垃圾邮件(Detecting if an email is spam):
    这是一个二分类问题,目的是识别收到的电子邮件是否为垃圾邮件。模型需要从邮件的特征(如发件人、主题、内容等)中学习模式,以区分垃圾邮件和非垃圾邮件。
  2. 搜索引擎查询分类(Categorizing the queries in a search engine):
    在搜索引擎中,用户输入的查询可能属于不同的类别(如新闻、购物、娱乐等)。任务是将查询分类到正确的类别,以便提供更相关的搜索结果。
  3. 网页搜索结果排名(Ranking the results of a web search):
    这是一个排序问题,目标是根据相关性对搜索结果进行排序。模型需要评估每个结果的相关性,并按相关性从高到低进行排序。
  4. 预测问题的回答(Predicting the reply to a question):
    在问答系统中,模型需要根据用户的问题预测最合适的回答。这可能涉及到自然语言处理(NLP)和理解问题的含义。
  5. 预测移动物体的路径(Predicting the path of a moving object):
    这是一个回归问题,模型需要预测物体在物理空间中的移动路径。这可能需要考虑物体的速度、加速度、方向和环境因素等。

6.2 特征提取(Feature Extraction)/特征工程(Feature Engineering)

特征提取是机器学习中最耗时但也是最重要的步骤之一。它直接影响模型的性能和预测能力。

例如,如何区分希腊国家队和瑞典国家队的球员。这需要从数据中提取能够区分不同类别的特征。

特征提取的两种思路如下:

  1. 直接扔给分类器:
    将所有可能的特征都提供给分类器,让分类器自己找出哪些特征是重要的。
    问题是这种方法可能导致模型过拟合,因为它可能包括了许多不相关的特征,从而增加了模型的复杂度。
  2. 特征选择:
    使用各种函数和技术仔细选择特征。
    这样做的优点是可以减少过拟合的风险,提高模型的泛化能力。缺点是计算密集,需要更多的计算资源。

我们还可以使用深度神经网络(Deep Neural Networks)在监督或自监督的方式中使用原始数据进行分类。使用深度神经网络的中间权重生成数据的表示。将这些表示用作特征输入到模型中。

6.3 获取标记数据(Obtain labeled data)

在训练机器学习模型时,通常需要大量的标记数据,即已经标注了正确输出的数据。

获取这些标记数据可能具有挑战性,例如,如何获取用于排名网页搜索结果的训练数据。

获取标记数据通常需要大量的人工努力和领域专业知识,并且需要仔细规划标签。由于缺乏专业知识,结果可能并不总是高质量的。而且标记数据可能覆盖范围不足,即数据可能不包含所有可能的情况或类别。

最近行业内部的解决方案是:

  1. 找到数据源:寻找能够为你生成标记数据的来源,或者直接使用这些数据进行预测任务(自监督学习)。
  2. 众包技术(Crowd-sourcing techniques):利用群体的力量来标记数据,例如通过在线平台让多个用户共同完成标记任务。
  3. 自监督方法(Self-supervised methods):使用未标记的数据,通过设计任务让模型自己生成标签,从而学习有用的特征表示。

6.4 处理少量标记数据

处理少量标记数据的方法如下:

  1. 半监督学习技术(Semi-supervised learning techniques):
    半监督学习是一种结合了少量标记数据和大量未标记数据的学习技术。它利用未标记数据来提高模型的泛化能力。
  2. 自训练(Self-training):
    在这种方法中,首先在标记数据上训练一个分类器,然后使用该分类器对未标记数据进行预测,并选择高置信度的预测结果作为新的训练数据。
  3. 协同训练(Co-training):
    协同训练涉及训练两个"独立"的分类器,并将一个分类器的输出作为另一个分类器的输入。这种方法假设数据可以被分成两个互补的子集。
  4. 正则化(Regularization):
    正则化是一种技术,它将学习视为一个优化问题,其中定义了你想要分类的对象之间的关系,并利用这些关系来改进模型。

应用可以是图像修复(Image restoration)。

6.5 决定技术(Decide on the technique)

选择技术时需要考虑问题的具体需求。例如,是否需要概率估计(即模型输出为每个类别的概率)。

需要考虑问题的具体细节,例如数据是否满足某些假设(如独立性假设),类别是否线性可分(即类别之间是否可以用线性边界分开)。

在许多情况下,找到合适的技术可能需要通过试错法(trial and error)来实现。这意味着可能需要尝试多种不同的方法,看哪种效果最好。

在许多情况下,选择哪种具体的技术可能并不重要。只要模型能够满足基本的性能要求,不同的技术可能都能达到相似的效果。

相关推荐
QiZhang | UESTC1 小时前
学习日记day41
学习
光头程序员1 小时前
学习笔记——常识解答之垃圾回收机制
java·笔记·学习
Thomas21431 小时前
pyspark3.5给paimon1.2的表打tag报错 spark_catalog is not a ProcedureCatalog
大数据·分布式·spark
爱吃番茄鼠骗1 小时前
Linux操作系统———线程同步
linux·学习
晨曦5432102 小时前
学习数据分析第一天
学习
FserSuN2 小时前
Agent开发总结学习
人工智能·学习
稚辉君.MCA_P8_Java2 小时前
Gemini永久会员 Hadoop分布式计算框架MapReduce
大数据·hadoop·分布式·架构·mapreduce
资深低代码开发平台专家2 小时前
通用编程时代正在向专用化分层演进
java·大数据·c语言·c++·python
TL滕2 小时前
从0开始学算法——第六天(进阶排序算法)
笔记·学习·算法·排序算法