Skip to content

评估

留出验证

将数据随机分为两个集合: 一个是训练集, 另一个是测试集. 通常是\(2/3\)的训练集, \(1/3\)的测试集.

使用训练集构建模型, 使用测试集评估模型. 主要是计算准确度还可以使用其他的表现评估手段.

准度

准度表示的是正确分类的比例. 可以在训练集和测试集上计算准度.

  • 训练集上计算的准度: 过于乐观, 不能很好的反映泛化性能, 特别是在过拟合的情况下
  • 测试集上计算的准度: 用于评估泛化表现

验证集

有些时候我们需要第三种集合, 即验证集. 例如, 有一些分类方法, 如决策树, 神经网络有两个阶段:

  1. 构建分类器
  2. 调教超参数, 测试集是不能用于超参数调教的

所以说, 正确的评估过程分为三步:

  1. 训练集: 除验证集之外的数据参与训练, 用于构建分类器
  2. 验证集: 不参与训练, 用于调教超参数, 是训练集中的一部分
  3. 测试集: 不参与训练, 用于评估准度
Tip

超参数: 机器学习算法中用于性能调教的参数, 不同于普通的参数, 后者本身就属于模型, 例如线性回归中的系数.

常见的超参数的例子有: K最邻近算法中的参数k, 在逻辑回归中的参数lambda, 在神经网络中隐藏层的数量和每一层中的节点数, ...

注意

测试集仅用于最终评价模型的好坏, 在测试集上得到的指标是可以用来和别人训练的模型做对比, 或者用来向别人报告你的模型的效果如何. 切忌千万不能根据模型在测试集上的指标调整模型超参数(这是验证集应该干的事情), 这会导致模型对测试集过拟合, 使得测试集失去其测试效果的客观性和准确性.

分层

当将数据集随机分为训练集和测试集时, 有时会出现某类别的数据在训练集或者测试集中缺失或者失衡的情况. 比如, 如果某一类别的所有样本都分配到测试集中, 那么模型在训练时将无法学习如何预测这个类别, 因为训练集中没有该类别的样本.

为了解决这个问题, 可以使用分层的方法, 即stratification, 这种方法可以和保留法结合使用. 例如, 如果整个数据集中某个类别的比例为60%, 另一个类比的比例为40%, 那么分层可以确保这个比例在训练集和测试集中都保持一致.

重复

可以通过重复留出验证法让其变得更加可靠. 如, 运行以下的方法10次: 从数据集中选出一定比例的数据用于训练, 剩余的用于测试. 10次计算出的准度取平均值就是一个整体的平均准度.

交叉验证

上面我们讲到了重复留出验证法, 交叉验证其实和这个差不多, 也是将数据划分10次, 但是不同的是不是随机划分的, 而是有规则的划分的. 而且留出验证的对象是整个数据集, 而交叉验证的对象是训练集(不包含测试集).

交叉验证是将训练集分为多个不重叠的子集(称为"折"), 通常为10折. 在k折交叉验证中, 训练集被分为k个等大小的部分, 每次迭代中使用k-1个部分进行训练, 剩下的一个部分用于测试. 这一过程重复k次, 每次用一个不同的部分作为测试集, 最终的模型性能是k次测试结果的平均值.

交叉验证通常用于调教参数, 如在KNN中, 我们可以选择的超参数有k和距离的测量方式. 可以使用网格方法将他们组合, 然后对于每一个组合, 都来一个交叉验证, 每个交叉验证都会产生平均准度, 我们可以通过对比这些准度来判断模型的优劣. 下面有讲到, 这就是网格搜索交叉验证法.

分层

分层10折交叉验证, 这是机器学习验证的标准方法. 许多的实验都证明选10这个数字能得到最准确的估计, 这只是经验, 没有任何理论证明.

如果能够重复分层交叉验证, 那效果更佳, 如重复分层10折交叉验证, 实际上运行了100次的循环.

留一法

将折数设置为训练样本数量, 也就是说, 如果有n个训练样本, 就会进行n次模型训练, 每次使用n-1个样本进行训练, 剩下的1个样本进行测试.

这种方法的优点是在每次训练中, 除了一个样本之外, 其他的所有数据用于训练, 因此可以最大化地利用数据. 并且这种方法不涉及随机抽样, 因此每次得到的结果都是一致的, 不会因为随机性而有所不同.

缺点也很明显, 那就是在训练集较大的情况下, 需要进行n次计算, 开销很大.

调教参数

我们也可以用交叉验证来遍历不同的参数组合并选择最合适的那一个.

如在KNN中, 我们需要考虑的是k的值和距离的测量方法. k的值可以取1, 3, 5, 11, 13, ... 距离的测量方式可以选择曼哈顿距离或者欧拉距离... 一共有2*5=10种情况, 我们要从里面选择最优的组合.

我们可以创建一个参数网格然后跑上述步骤, 这种又叫作网格搜索交叉验证法, 用于调教参数. 简单的步骤如下:

  1. 创建一个参数网格
  2. 将数据分为训练集和测试集
  3. 对于每一个参数组合
    1. 在训练集上用10折交叉验证训练一个KNN分类器
    2. 计算交叉验证的准度cv_acc
    3. 如果cv_acc大于best_cv_acc, 则best_cv_acc=cv_acc, best_parameters=current_parameters
  4. 用整个训练集和best_parameters重新建立KNN模型
  5. 在测试集上对模型进行评估, 汇报结果

混淆矩阵

混淆矩阵, confusion matrix, 常见于分类问题. 以二分类问题为例, 在二分类问题中, 有两种可能的标签: yes和no.

混淆矩阵用来显示模型在预测时产生的四种可能结果:

  • TP (True Positives): 模型正确地将yes类样本预测为yes
  • FN (False Negatives): 模型错误地将yes类样本预测为no
  • FP (False Positives): 模型错误地将no类样本预测为yes
  • TN (True Negatives): 模型正确地将no类样本预测为no

准度计算公式为\(\frac{TP+TN}{TP+FN+FP+TN}\), 混淆矩阵本身不是性能度量的指标, 但它是性能指标计算的基础工具, 通过它, 可以计算得到准度, 精确度, 召回度等性能指标.

  • 精确度: \(P=\frac{TP}{TP+FP}\)
  • 召回度: \(R=\frac{TP}{TP+FN}\)
  • F1分: \(F1=\frac{2PR}{P+R}\)