模型评估与选择

本文详细介绍了模型评估与选择的基本概念,包括经验误差、泛化误差、过拟合与欠拟合。接着,讨论了评估模型的四种方法:留出法、交叉验证法、自助法和验证集,以及每种方法的适用场景和优缺点。在性能度量部分,针对回归和分类问题,阐述了如均方误差、查准率、查全率和F1分数等指标。最后,文章提到了比较学习器性能的统计方法以及偏差与方差的概念,为模型优化提供指导。
摘要由CSDN通过智能技术生成

一、基本概念

1. 经验误差与泛化误差

  • 误差: 预测值与样本的真实值之间的差异。
  • 经验误差(训练误差): 学习器在训练集上的误差。
  • 测试误差: 学习器在测试集上的误差。
  • 泛化误差: 学习器在新样本上的误差。
    我们希望得到在新样本上表现的好,即泛化误差小的学习器。

2. 过拟合与欠拟合(overfitting/underfitting)

  • 过拟合: 学习器学习能力过于强大,对训练样本学的太好,把训练集自身的一些特点当做了所有潜在样本的一般性质,会导致泛化能力下降。
    • 解决办法:正则化、丢弃一些不能帮助我们正确预测的特征等。
  • 欠拟合: 学习器学习能力低下,对训练样本的一般性质尚未学好。
    • 解决办法:在决策树学习中扩展分支、在神经网络中增加训练轮数等。

看图就更好懂啦~
下图是一个回归问题的例子:

第一个模型是一个线性模型, 欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型, 过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。
分类问题中也存在这样的问题:
在这里插入图片描述
以多项式理解, x 的次数越高,拟合的越好,但相应的预测的能力(泛化能力)就可能变差。

二、评估方法

我们可以通过实验测试来对学习器的泛化误差进行评估,进而做出选择。因此,需使用一个“测试集”来测试学习器对新样本的判别能力,以测试集上的测试误差作为泛化误差的近似。
我们有一个包含m个样例的数据集D,如何划分训练集和测试集呢?常见方法如下:

1. 留出法(hold-out)

将数据集D划分为两个互斥的集合,一个作为训练集S,一个作为测试集T。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
小数据量时代,如果只有 100 条, 1000 条或者 1 万条数据,常见做法是将所有数据三七分,就是人们常说的 70%训练集, 30%测试集;
大数据时代,数据量可能是百万级别,测试集占数据总量的比例会趋向于变得更小。如果有 100 万条数据,那么取 1 万条数据便足以进行评估,即99%训练集,1%测试集。

注意:
(1)训练/测试集的划分要尽可能保持数据分布的一致性,如在分类任务中至少要保持样本的类别比例相似,可采用分层采样。
(2)即使给定了训练/测试集的样本比例,仍存在多种划分方式对数据集D进行分割。不同的划分将导致不同的训练/测试集,模型评估结果也会有差别。因此,单次留出法得到的估计结果往往不够稳定可靠,一般采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

python实现:
在python中可以使用 sklearn.model_selection.train_test_split 随机划分训练集和测试集。
官网文档:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split

一般形式:
train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train data和testdata,形式为:

X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size=0.4, random_state=0)

参数解释:
train_data:所要划分的样本特征集

train_target:所要划分的样本结果

test_size:样本占比,如果是整数的话就是样本的数量

random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

2. 交叉验证法(K-fold cross validation)

先将数据集D划分为k个大小相似的互斥子集,每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样就可获得k组训练/测试集,进行k次训练和测试,最终返回这k个测试结果的均值。
交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值。
k最常用的取值是10,称为10折交叉验证;其他常用的k值有5、20等。

与留出法相似,将数据集D划分为k个子集同样存在多种划分方式。为减少因样本划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值。常见的有“10次10折交叉验证”。

  • 留一法: 假定数据集D中包含m个样本,若令k=m,则得到了交叉验证法的一个特例:留一法。
    优点:不受随机样本划分方式的影响;由于只比初始数据集少1个样本,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似,评估结果比较准确。
    缺点:在数据集比较大时计算开销大;根据“No-Free-Lunch”定理,留一法的估计结果也未必永远比其他评估方法准确。

python实现:

(1)K次交叉检验(K-Fold Cross Validation)

from sklearn.model_selection import KFold
import numpy as np
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits=2)
for train_index, test_index in kf.split(X):
	print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

(2)Stratified k-fold
StratifiedKFold()这个函数较常用,比KFold的优势在于将k折数据按照百分比划分数据集,每个类别百分比在训练集和测试集中都是一样,这样能保证不会有某个类别的数据在训练集中而测试集中没有这种情况,同样不会在训练集中没有全在测试集中,这样会导致结果糟糕透顶。

from sklearn.model_selection import StratifiedKFold
import numpy as np

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 0, 1, 1])
skf = StratifiedKFold(n_splits=2)
for train_index, test_index in skf.split(X, y):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

3. 自助法(bootstrapping)

给定包含m个样本的数据集D,对它进行采样参数数据集D’:每次随机从D中挑选一个样本,将其拷贝放入D’,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被采到。重复m次,得到包含m个样本的数据集D’。
D中有一部分样本会在D’中多次出现,而另一部分样本不出现,样本在m次采样中始终不被采到的概率是(1-1/m)m,取极限得到0.368,即通过自助采样,初始数据集D中约有36.8%的样本未出现在采样数据集D’中。

优点:自助法在数据集较小、难以有效划分训练/测试集时很有用;自助法能从初始数据集中产生多个不同的训练集,对集成学习等方法有很大好处。

缺点:自助法产生的数据集改变了初始数据集的分布,会引入估计偏差。

4. 验证集

给定包含m个样本的数据集D,在模型评估与选择过程中由于需要留出一部分数据进行评估测试。通常我们把学得模型在实际使用中遇到的数据成为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集称为 “验证集”

在研究比对不同算法的泛化性能时,我们把训练数据划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。在模型选择完成后,学习算法和参数配置已选定,此时应用数据集D重新训练模型,用测试集上的判别效果来估计模型在实际使用时的泛化能力。

三、性能度量

对学习器繁华性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量。

性能度量反映了任务需求。在对比不同模型的能力时,根据任务需求,选择合适的单一数字评估指标,能让你快速判断学习器A或者学习器B更好,进而加速改进机器学习算法的迭代过程。

1. 回归问题

1.1 均方误差(Mean Squared Error)

均方误差是指参数估计值与参数真值之差平方的期望值;
MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。

  M S E = 1 m ∑ i = 1 m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值