精华内容
下载资源
问答
  • 模型选择

    千次阅读 2018-03-23 19:50:51
    模型选择一个模型可能有很多种情况出现,那么我们如何选择最优的模型呢?1、哪条曲线拟合效果是最好的? 2、 泛化机器学习的目标是使学得的模型能很好地适用于“新样本”,而不是仅仅在训练样本上工作的很好;即便...

    模型选择

    一个模型可能有很多种情况出现,那么我们如何选择最优的模型呢?

    1、哪条曲线拟合效果是最好的?

    这里写图片描述
    这里写图片描述

    2、 泛化

    机器学习的目标是使学得的模型能很好地适用于“新样本”,而不是仅仅在训练样本上工作的很好;即便对聚类这样的无监督学习任务,我们也希望学得的簇划分能适用于没在训练集中出现的样本。学得模型适用于新样本的能力,称为“泛化”(generalization)能力。

    具有强泛化能力的模型能很好地适用于整个样本空间。(现实任务中的样本空间的规模通常很大,如 20 个属性,每个属性有 10 个可能取值,则样本空间的规模是 10^20 )。

    还有一个泛化的概念:

    【基础概念】模型具有好的泛化能力指的是:模型不但在训练数据集上表现的效果很好,对于新数据的适应能力也有很好的效果。
    当我们讨论一个机器学习模型学习能力和泛化能力的好坏时,我们通常使用过拟合和欠拟合的概念,过拟合和欠拟合也是机器学习算法表现差的两大原因。
    【基础概念】过拟合 overfitting:模型在训练数据上表现良好,在未知数据或者测试集上表现差。
    【基础概念】欠拟合 underfitting:在训练数据和未知数据上表现都很差。

    3、欠拟合

    这里写图片描述

    图 1 和图 2 都是模型欠拟合的情况:即模型在训练集上表现的效果差,没有充分利用数据,预测准确率很低,拟合结果严重不符合预期。

    产生的原因:模型过于简单出现的场景:欠拟合一般出现在机器学习模型刚刚训练的时候,也就是说一开始我们的模型往往是欠拟合也正是因为如此才有了优化的空间,我们通过不断优化调整算法来使得模型的表达能力更强。

    解决办法:
    (1)添加其他特征项:因为特征项不够而导致欠拟合,可以添加其他特征项来很好的解决。
    (2)添加多项式特征,如图(3)我们可以在线性模型中通过添加二次或三次项使得模型的泛化能力更强。
    (3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,需要减少正则化参数。

    4、过拟合

    这里写图片描述

    图四是模型过拟合的情况:即模型在训练集上表现的很好,但是在测试集上效果却很差。也就是说,在已知的数据集合中非常好,再添加一些新数据进来效果就会差很多。

    产生的原因:可能是模型太过于复杂、数据不纯、训练数据太少等造成。
    出现的场景:当模型优化到一定程度,就会出现过拟合的情况。

    解决办法:
    (1)重新清洗数据:导致过拟合一个原因可能是数据不纯导致的,
    (2)增大训练的数据量:导致过拟合的另一个原因是训练数据量太小,训练数据占总数据比例太低。
    (3)采用正则化方法对参数施加惩罚:导致过拟合的原因可能是模型太过于复杂,我们可以对比较重要的特征增加其权重,而不重要的特征降低其权重的方法。常用的有 L1 正则和 L2 正则,稍后会提到。
    (4)采用 dropout 方法,即采用随机采样的方法训练模型,常用于神经网络算法中。
    注意:模型的过拟合是无法彻底避免的,我们能做的只是缓解,或者说减小其风险,因为机器学习面临的是 NP 难问题(这列问题不存在有效精确解,必须寻求这类问题的有效近似算法求解),但是有效算法必然是在多项式时间内运行完成的,因此过拟合是不可避免的。

    在实际的任务中往往通过多种算法的选择,甚至对同一个算法,当使用不同参数配置时,也会产生不同的模型。那么,我们也就面临究竟选择哪一种算法,使用哪一种参数配置?这就是我们在机器学习中的“模型选择(model select)”问题,理想的解决方案当然是对候选模型的泛化误差进行评估,然后选择泛化误差最小的那个模型。

    喜欢就点赞评论+关注吧

    这里写图片描述

    感谢阅读,希望能帮助到大家,谢谢大家的支持!

    展开全文
  • 模型选择和交叉验证

    万次阅读 2018-05-16 13:10:06
    模型选择 holdout方法 在典型的机器学习应用中,为进一步提高模型在预测未知数据的性能,还要对不同的参数设置进行调优和比较,该过程称为模型选择。指的是针对某一特定问题,调整参数以寻求最优超参数的过程。 ...

    模型选择

    holdout方法

    在典型的机器学习应用中,为进一步提高模型在预测未知数据的性能,还要对不同的参数设置进行调优和比较,该过程称为模型选择。指的是针对某一特定问题,调整参数以寻求最优超参数的过程。
    假设要在10个不同次数的二项式模型之间进行选择:

    1.hθ(x)=θ0+θ1x2.hθ(x)=θ0+θ1x+θ2x23.hθ(x)=θ0+θ1x++θ2x310.hθ(x)=θ0+θ1x++θ10x10 1. h θ ( x ) = θ 0 + θ 1 x 2. h θ ( x ) = θ 0 + θ 1 x + θ 2 x 2 3. h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 2 x 3 ⋯ 10. h θ ( x ) = θ 0 + θ 1 x + ⋯ + θ 10 x 10

    显然越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集并不代表着能推广至一般情况。我们应该选择一个更能适应一般情况的模型。如果在模型选择过程中不断重复使用相同的测试数据,这样的话测试数据就变成了训练数据的一部分,模型更容易陷入过拟合。
    于是我们将数据集分为训练集,验证集和测试集。训练数据集用于不同模型的拟合,模型在验证集上的性能表现作为模型选择的标准,测试集作为最终的性能评估。使用 60%的数据作为训练集, 使用 20%的数据作为交叉验证集, 使用 20%的数据
    作为测试集.

    具体的模型选择方法为:
    1. 使用训练集训练出 10 个模型
    Train error:

    Jtrain(θ)=12mi=1m(hθ(x(i))y(i))2 J t r a i n ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2

    2. 用 10 个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值)
    Cross validation error:
    Jcv(θ)=12mcvi=1mcv(hθ(x(i)cv)y(i)cv)2 J c v ( θ ) = 1 2 m c v ∑ i = 1 m c v ( h θ ( x c v ( i ) ) − y c v ( i ) ) 2

    3. 选取代价函数值最小的模型: minθJcv(θ) min θ J c v ( θ )
    4. 用步骤 3 中选出的模型对测试集计算得出推广误差(代价函数的值)
    Test error:
    Jtest(θ)=12mtesti=1mtest(hθ(x(i)test)y(i)cv)2 J t e s t ( θ ) = 1 2 m t e s t ∑ i = 1 m t e s t ( h θ ( x t e s t ( i ) ) − y c v ( i ) ) 2

    缺点:模型性能的皮评估对训练数据划分为训练及验证子集的方法是敏感的;评价的结果是敏感的;评价的结果会随样本的不同而发生变化。

    k折交叉验证

    K折交叉验证中,不重复地随机将训练数据集划分为K个,其中k-1个用于模型的训练,剩余的1个用于测试。重复此过程k次,就得到了k个模型及对模型性能的评价。该种方法对数据划分的敏感性较低。
    下图展示了k折交叉验证,k=10,训练数据集被划分为10块,在10次迭代中,每次迭代中都将9块用于训练,剩余的1块用于模型的评估。10块数据集作用于某一分类器,分类器得到的性能评价指标为 Ei,i=1,2,,10 E i , i = 1 , 2 , ⋯ , 10 ,可用来计算模型的估计平均性能 11010i=1Ei 1 10 ∑ i = 1 10 E i

    这里写图片描述
    K折交叉验证中k的标准值为10,对大多数应用来说都时合理的。如果训练集相对较小,可以增大k值,这样将会有更多的数据用于进行训练,这样性能的评估结果也会得到较小的偏差。但是k值得增加会导致交叉验证算法的时间延长,并使得训练块高度相似,无法发挥交叉验证的效果。如果数据集较大,可以选择较小的k值,降低在不同数据块的重复计算成本,同时训练快比例小但是依然有大量的训练数据。

    sklearn实现交叉验证:找到KNN算法的最佳k值

    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.neighbors import KNeighborsClassifier  # K最近邻(kNN,k-NearestNeighbor)分类算法
    from sklearn.model_selection import cross_val_score
    import matplotlib.pyplot as plt
    
    # 加载iris数据集
    iris = load_iris()
    X = iris.data
    y = iris.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
    
    if __name__ == '__main__':
    
        k_scores = []
        # 由迭代的方式来计算不同k对模型的影响,并返回交叉验证后的平均准确率
        for k in range(1, 31):
            # 采用k个最近邻
            knn = KNeighborsClassifier(n_neighbors=k)
            '''
            n_jobs为将交叉验证过程分布到的CPU核心数量,若>1,需要放到"if __name__ == '__main__'"中
            '''
            scores = cross_val_score(knn, X_train, y_train, cv=10, n_jobs=1)
            k_scores.append(scores.mean())
    
        # 可视化数据
        plt.plot(range(1, 31), k_scores)
        plt.xlabel('Value of K for KNN')
        plt.ylabel('Cross-Validated Accuracy')
        plt.show()

    这里写图片描述

    分层k折交叉验证

    分层交叉验证中,类别比例在每个分块中保持一致,使得每个分块中的类别比例与训练数据集的整体比例一致,在sklearn中使用StratifiedKFold,其中cross_val_score默认也采用分层k折交叉验证

    from sklearn.model_selection import StratifiedKFold
    import numpy as np
    
    X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [2, 3], [4, 5]])
    y = np.array([0, 0, 0, 1, 1, 1])
    skf = StratifiedKFold(n_splits=3)
    skf.get_n_splits(X, y)
    for train_index, valid_index in skf.split(X, y):
        print('Train:', train_index, 'Valid:', valid_index)
    
    Train: [1 2 4 5] Valid: [0 3]
    Train: [0 2 3 5] Valid: [1 4]
    Train: [0 1 3 4] Valid: [2 5]
    
    展开全文
  • 作者:Sebastian Raschka翻译:reason_W编辑:周翔简介正确使用模型评估、模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要。本文将对这三个任务的相关技术进行回顾,并就每种技术的理论...


    作者:Sebastian Raschka

    翻译:reason_W

    编辑:周翔


    简介


    正确使用模型评估、模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要。本文将对这三个任务的相关技术进行回顾,并就每种技术的理论和实证研究的主要优缺点进行讨论。文章还将就机器学习算法中的超参数调优给出尽可能的建议,用以实现最佳的算法效果。文中内容涉及很多常用方法,比如模型评估和选择中的Holdout方法等;介绍了bootstrap技术的不同变体,通过正态逼近得到置信区间来衡量性能估计(performance estimates)的不确定性;在讨论偏差-方差(bias-variance)折中方案时,对比了留一交叉验证法(leave-one-out cross validation)和k-fold交叉验证法,并提供了在k-fold交叉验证中最优k值的选择技巧。

     

    1. 引言:基本模型评价术语和技术


    机器学习已经逐渐深入到了我们生活的中心。无论是学术研究还是商业应用,共同的出发点都是希望做出“好”的预测。把模型拟合到训练数据上是一方面,但怎么才能知道模型在未知数据上的泛化性能呢?如何针对手头的问题在不同算法间选择出最好的模型呢?模型评估当然不会是机器学习通向的终点。在处理任何数据之前,我们都希望可以提前计划并针对任务选择合适的技术。在这篇文章中,我们就将讨论这些技术的优劣,并通过一个典型的机器学习工作流程,展示其应用的方法。


    1.1 性能估计:泛化性能与模型选择


    机器学习模型的性能估计流程可以分为以下三步:

    1. 将训练数据输入到学习算法中,以学习模型;

    2. 用模型预测测试集标签;

    3. 计算模型在测试集上的错误率,推导出模型预测精度。

     

    然而,当要实现不同的目标时,模型性能估计就不像我们总结的那样简单了。也许我们应该从另一个角度来回答前面的问题:“我们为什么要关心性能估计?” 理想情况下,模型的估计性能说明了它在未知数据上的表现如何——在机器学习的应用或新算法的开发中,对未来数据进行预测通常是我们想要解决的主要问题。

     

    通常,机器学习需要大量的实验才能实现最好的算法效果,例如,学习算法的内部参数(所谓的超参数)的调优。由于我们要从这个模型集合中选择最好的模型,所以就需要找到一种方法来评估不同模型的性能,以便对它们进行排序。除了算法调优之外,通常我们还需要尝试多种可以在特定条件下实现最优的单一算法。在比较不同的算法时,我们主要关注预测和计算性能。

     

    总结来说,我们进行模型预测性能评估的主要原因有以下三点:

    1. 我们想要估计模型的泛化性能,即模型对未知数据的预测性能。

    2. 我们希望通过调整学习算法和从给定的假设空间中选择最佳的执行模型来提高预测性能。

    3. 我们想要确定最适合于手头问题的机器学习算法;因此,我们需要比较不同的算法,从算法的假设空间中选择最佳性能的算法和最佳的执行模型。

     

    尽管上面列出的这三个子任务都需要评估模型的性能,但是却需要不同的方法。我们将在本文中讨论处理这些子任务的不同方法。

     

    模型的绝对性能估计或许是机器学习中最具挑战性的任务之一。为了方便比较不同模型的性能,我们可以在选择估计它们的有偏性能(biased performance),当然前提是偏差对所有的模型造成的影响相同。对模型性能的估计偏差并不会影响其相对排名顺序。比如有三种模型,其准确率如下:


    M2: 75% > M1: 70% > M3: 65%,


    即使增加10%的悲观偏差,仍然不影响排序。


    M2: 65% > M1: 60% > M3: 55%。


    1.2 假设和术语


    模型评估是一个复杂的课题。为了确保不过多地偏离核心信息,我们会先做一些假设,并列举一些稍后会用到的技术术语。


    i.i.d.(independent and identically distributed): 独立同分布假设。即所有样本都是从相同的概率分布中抽取出来的,并且在统计上相互独立。但时态数据(temporal date)或时间序列(time-series data)数据不满足该假设。

     

    监督学习和分类:本文主要讨论监督学习,这是机器学习的一个子类。虽然许多概念也适用于回归分析,但我们将把重点放在分类上,即将类别目标标签分配给训练和测试样本。

     

    0-1损失和预测准确率:预测准确率可以用正确预测的数量除以样本总量n得到,其公式可以表达为:

    其中错误率ERR是数据集S中n 个样本0-1损失的期望值

    0-1损失定义为:

    其中是第i个实际的类标签,是第i个样本预测的类标签。我们的目标是学习到一个泛化性能良好的模型,使得其预测准确率最高,或者说作出错误预测的概率最低:

    其中D是生成的数据集服从的分布,x是训练样本特征向量,y是对应的标签。


    偏差:在本文中,偏差一词是指统计偏差(而不是机器学习系统中的偏差)。一般而言,估计值(estimator) 的偏差是期望值与真实值之差。

    所以,若偏差,则就是的无偏估计。再准确一点,预测偏差是模型的期望预测准确率和实际预测准确率的差。而我们在训练集上计算得到的准确率就是绝对准确率的乐观有偏估计,因为它过高估计了模型的准确率。


    方差:方差就是估计值与其期望值的统计方差:

    方差是一个模型预测性能变化程度的度量,如果我们多次重复学习过程,就会会发现模型在训练集上的表现存在小的波动。模型构建过程对这些波动的敏感性越高,方差就越大。

     

    最后,模型、假设、分类器、学习算法和参数的术语在本文中的定义如下:


    目标函数:f在预测建模时,我们需要对特定过程建模,然后去学习或逼近一个特定的未知函数。目标函数f(x)=y就是我们想要对其建模的真实函数f(·)。

     

    假设:假设实际上是一个确定的函数,我们相信(或希望)该函数与我们想要建模的真实函数非常相似。比如在对垃圾邮件进行分类时,我们提出的分类规则可以将垃圾邮件与非垃圾邮件区分开。

     

    模型:在机器学习领域中,假设和模型这两个术语常常可以互换使用。而在其他领域中,这些术语往往代表有不同的含义:一个假设可以认为是研究人员“有根据的猜测”,而模型则是用来检验这个假设的猜想的表现。

     

    学习算法:我们的目标是学习或逼近目标函数,学习算法则是一组试图用训练数据集对目标函数进行建模的指令。每个学习算法都会有一个假设空间,即一组可能的假设的集合,这个集合通过系统地描述最终假设(formulating the final hypotheses)对未知的目标函数进行建模。


    超参数:超参数是机器学习算法的调优参数(tuning parameters),例如,逻辑回归损失函数中L2惩罚的正则化强度(regularization strength),或决策树分类器最大深度的设置值。而模型参数则是学习算法拟合训练数据的参数——即模型本身的参数。例如,线性回归直线的加权系数(或斜率)及其偏差项(这里指y轴截距)都是模型参数。


    1.3 Resubstitution验证和Holdout方法


    Holdout 方法无疑是最简单的模型评估技术,它可以概括如下:首先,我们把标签数据集分割成两个部分:一个训练集和一个测试集。然后,我们把模型在训练数据上进行拟合,并预测测试集标签。正确预测所占的比例,可以通过比较预测的标签和测试集的真实标签计算出来,以此构成我们对模型预测准确率的评估。这里需要注意的是,我们不在同一个训练数据集上训练和评估一个模型(这称为Resubstitution验证或Resubstitution评估),因为它通常会带来由于过拟合而产生的非常乐观的偏差。换句话说,我们无法判断模型是仅仅简单地记住了训练数据,还是对新的、未知数据进行了泛化。(另一方面,我们可以把训练集和测试集准确率的差别看做这种所谓的乐观有偏估计。)

     

    通常,将数据集拆分为训练集和测试集是一个简单的随机抽样过程。我们假设每一类所有的数据点都是按照相同的概率分布得到的。我们随机选择三分之二的样本用作训练集,三分之一的样本用作测试集。但这一方法还有两个问题,我们会在下一节中讨论。


    1.4 层次化(Stratification)


    数据集是从某个概率分布中抽取的随机样本的代表,我们通常假设这个数据集是真实数据的代表。在没有替换的情况下,进一步的下采样会改变样本的统计量(平均值、比例和方差)。这种没有替换的下采样对样本统计量的影响程度与样本的大小成反比。让我们来看一个使用Iris数据集的例子,我们将其随机分为2/3的训练数据和1/3的测试数据,如图1所示。(生成此图形的源代码可在GitHub上找到)。


    图1:Iris的花类在随机抽样的训练集和测试集上的分布(三种颜色代表三种花的类别)


    当我们将一个标记的数据集随机分为训练和测试集时,我们就违反了统计独立的假设。Iris数据集包括50个Setosa, 50个Versicolor,,和50个Virginica;花的种类均匀分布:

    • 33.3% Setosa

    • 33.3% Versicolor

    • 33.3% Virginica

     

    如果一个随机的函数将2/3的花(100)分配给训练集,1/3的花(50)分配给测试集,它可能会产生以下结果(如图1所示):

    • 训练集:38Setosa, 28Versicolor, 34Virginica

    • 测试集:12Setosa, 22Versicolor, 16Virginica

     

    假设Iris数据集是真实种群的代表(比如假设Iris flower在自然界是均匀分布的),我们就创建了两个非均匀类分布的不平衡数据集。学习算法用于学习模型的类别比例为“38% / 28% / 34%”。用于评估模型的测试数据集也不平衡,更糟的是,它在“相反的”方向上是平衡的:“24% / 44% / 32%”。除非学习算法对这些干扰完全不敏感,否则结果会很不理想。如果一个数据集在随机抽样之前有很高的类别不平衡,那么问题就更严重了。在最坏的情况下,测试集甚至不包含任何少数类的样本。因此,推荐的做法是用层次化的方式划分数据集。在这里,层次化仅仅意味着我们随机地划分一个数据集使得其子集(训练集和测试集)可以正确地表示每个类——换句话说,层次化是一种保持类别在所得子集中的原始比例的方法。

     

    需要指出的是,以非层次化的方式下随机抽样,在使用相对较大和类别较平衡的数据集时通常不是一个大问题。然而,在我看来,层次化重采样在机器学习应用中通常是有益的。此外,层次化抽样非常容易实现,Ron Kohavi为此提供了经验性的证据[Kohavi, 1995],层次化也有助于k-fold交叉验证中方差和偏差的估计。


    1.5 Holdout验证

     

    图2 Holdout验证方法的可视化总结


    图2提供了Holdout验证方法的可视化总结。下面我们将详细讨论这个方法的优点和缺点。

     

    步骤1 :首先,我们将可用的数据随机分为两个子集:一个训练集和一个测试集。对模型来说,测试集代表未知数据;还有一点是,当我们估计泛化性能时,为了避免引入偏差,测试集只能使用一次。通常情况下,我们将2/3的数据分配给训练集,1/3的数据分配给测试集。其他常见的训练/测试分割是60/ 40,70 /30,或80/20 ——如果数据集比较大的话,甚至能到90/10。

     

    步骤2 :在获得测试样本之后,我们需要选择一个适合给定问题的学习算法。从图2可以看到超参数值,超参数是我们学习算法的参数。我们必须手动指定这些超参数值——和实际模型参数不同,学习算法不会自动从训练数据学习这些参数。由于在模型拟合过程中没有学习超参数,所以我们需要针对任务进行一些“额外的过程”或“外部循环”来分别优化这些参数——这种Holdout方法是病态的。因此,目前我们必须使用一些固定的超参数值——如果是用现有的机器学习库,我们可以使用现成的默认参数或根据直觉设置参数值。

     

    步骤3:学习算法在前面的步骤中拟合一个模型后,下一个问题是:生成模型的性能到底有多“好”?这就是独立测试集发挥作用的地方。由于学习算法还没有“见过”这个测试集,所以它应该对未知数据给出一个相对公正的估计。现在,我们使用模型来对这个测试集进行类标签预测。然后,我们将预测的类标签与“ground truth”(真实的类标签)进行比较,以估计模型的泛化准确率或者错误率。

     

    步骤4:最后,我们得到了我们的模型对未知数据的准确率的估计。所以,我们没有理由再在算法中保留测试集了。因为我们假设我们的样本是i.i.d.。没有理由假定模型在提供所有可用数据之后会表现得更糟。根据经验,如果算法使用更多的信息数据——假设它还没有达到性能上限,那么模型将具有更好的泛化性能。


    1.6 悲观偏差


    第1.3节(Resubstitution验证和Holdout方法)介绍了当数据集被分割为单独的训练和测试集时会遇到的两种问题。其中第一个问题是破坏了数据独立性和在下采样(在第1.4节中讨论)中改变了类比例。在Holdout验证方法(第1.5节)部分,我们讨论了在对数据集进行下采样时遇到的第二个问题:步骤4提到了模型的容量,以及额外的数据是否有用。首先说容量问题:如果一个模型还没有达到它的容量,性能估计将偏向悲观。这假设算法如果得到了更多的数据,可以学习到一个更好的模型——通过分离数据集的一部分进行测试,我们就会保留有价值的数据(例如,测试数据集)来估计泛化性能。

     

    为了解决这个问题,在估计泛化性能(参见图2步骤4)之后,可以将模型与整个数据集相匹配(参见图2步骤4)。但是,使用这种方法,我们无法估计其对自拟合模型的泛化性能,因为我们现在已经“消耗”了测试数据集。在现实的应用程序中,我们无法避免这种进退两难的境地,但我们应该意识到如果只有部分数据集,也就是训练数据集,用于模型拟合(尤其是影响模型适合相对较小的数据集),我们的估计泛化性能可能表现的偏向悲观。


    1.7 正态逼近置信区间


    利用第1.5节中描述的Holdout方法,我们计算了模型泛化性能的一个点估计结果(point estimate)。当然,这一估计的置信区间不仅在某些应用中具有更丰富的信息和可取性,而且也可能对特定的训练集/测试集划分相当敏感(比如方差很大时)。计算模型预测精度或计算误差置信区间的一种简单方法是通过所谓的正态逼近。在这里,我们假设预测结果会遵循一个正态分布,然后根据中心极限定理计算单次训练-测试划分的平均值的置信区间。我们计算预测精度如下:

    其中L(·)为0-1损失函数(式3),n表示测试数据集中的样本个数。表示对第i个样本的预测类别,表示第i个样本的真实类别。因此,我们现在可以把每次预测都看成伯努利实验,正确预测的次数X服从一个实验样本数为n∈N,实验次数为 k=0,1,2,...,n,成功概率为p∈[0,1]的二项分布X~(n,p):

    其中

    现在,预期的成功次数为μ=np,或者更具体地说,如果模型有50%的成功率,那么40次预测的期望成功次数为20次。估计方差为:

    标准差为: 

    因为我们更感兴趣的是成功的平均次数,而不是其绝对值,所以可以计算其准确率估计值的方差:

    相应的标准差为:

    通过正态逼近,我们可以得到预测的置信区间:

    其中是误差分位数和z是标准正态分布的分位数。置信区间为95%(α=0.05)时,z = 1.96。

     

    然而,在实际操作中,最好还是通过多次划分训练-测试集,计算置信区间的平均估计。还一个有趣的结论是,测试集中样本较少时,方差会变大(参见分母中的n),从而扩大置信区间。

     

    总结


    本节我们介绍了在监督机器学习中模型评估的一般概念。其中Holdout方法可以用于评估模型在未知数据上的泛化性能。Holdout方法需要首先将数据集分成训练集和测试集两部分。算法首先在训练集数据上进行学习构建模型,然后对所得模型在测试集数据上的预测性能进行评估。在测试集上的性能就可以用于估计模型对未知数据的泛化性能。此外,我们还简要介绍了正态逼近,在一定假设的前提下,可以通过正态逼近计算出基于单个测试集的性能估计的不确定性。下一节中我们将详细讨论置信区间和估计不确定性。


    2 Bootstrapping 和不确定性


    2.1 概述


    本节将向大家介绍一些先进的模型评估技术。我们将首先讨论模型性能估计的不确定性以及模型的方差和稳定性。之后将讨论模型选择的交叉验证技术。


    2.2 重采样


    模型估计有偏差也有方差。而Resubtitution 评估(用同样的训练集对模型进行评估)有很高的乐观偏差。反之,将数据集的很大部分数据作为测试集很容易为评估带来悲观偏差。随着测试集样本数量的减少,悲观偏差会降低,但性能估计方差却会增加。图3展示了方差和偏差直接的关系。 



    为了寻找在模型评估和选择中的偏差-方差折中方案,本节我们将介绍重采样方法。


    之前说测试集数据比例太大会使得模型评估偏向悲观可能是因为模型的性能尚未达到最优。当算法训练数据可以继续增多时,模型的泛化性能也会相应的更好。图4就是一个softmax分类器在MNIST数据集上的学习曲线。 



    MNIST数据集样本均为0-9的数字,其中每一类共有500个随机样本,数据集共5000个样本。实验时我们将其按比例分为3500个训练样本和1500个测试样本。然后再按照随机,层次化分割的方法将训练集分为更小的子集,使用这些子集拟合softmax分类器。用于评估性能的测试集则依然是1500个样本。从图中可以看出,随着训练样本增加,resubstitution精度下降,同时模型泛化性能提高。这可以归因于过拟合的缓解。当训练集小的时候,算法更容易受训练数据噪声影响,从而难以得到很好的泛化。训练数据越多,算法越受益的现象也可以解释用Holdout方法进行模型评估为何偏向悲观:该方法从数据中选出了相当一部分用于测试集,而这些数据本可以用于模型训练。所以一般评估完一个模型之后,最好还要在完整数据集上再运行一遍算法,得到效果更好的模型。


    那么,是不是说测试集数据越少越好呢?其实对数据集来说,每次对其进行重采样都会改变训练集和测试集各自样本分布的统计信息。测试集越小,这个改变越明显。自然而然地,测试集数据的减少会带来另一个问题:模型性能估计方差的增大。这也是为什么大多数监督学习算法都要加上数据集符合真实数据分布,以及为什么要采用层次化数据集分割(就是为了保持样本比例不变)。但是基于特征的底层样本统计数据变化依然是一个问题,特别是在小数据集上(图5)。

     


    2.3 重复Holdout 验证


    我们可以通过多次随机划分训练集和测试集,重复Holdout方法估计模型性能然后取平均值的方法获得更具鲁棒性的评估。这种重复Holdout的方法也称为蒙特卡洛交叉验证。同标准方法相比,这种方法可以更好地衡量模型在随机测试集上的性能,从中还能了解模型在不同数据集上的稳定性。图6是在多次随机划分的Iris数据集上运行knn分类器(k=3),重复Holdout验证的结果。



    左图中数据集每次划分训练集与测试集均有75个样本,比例为1:1,而右图每次划分训练集135个样本,测试集15个样本,比例为1:1。左图平均准确率95%,右图平均96%。从中可以验证上文的发现,测试集样本数减少会使模型性能估计方差增大,同时训练集样本减少会使得模型估计偏向悲观。


    2.4 Bootstrap方法和经验置信区间


    如何才能获得性能估计的置信区间呢?尤其是在其分布未知的时候,我们如何才获得性能估计均值的方差和置信区间?对现实世界来说,多次独立实验统计数据特性是比较昂贵的实验方式。为了避免这种极端的方法,我们可以用bootstrap方法。Bootstrap背后的思想就是从经验分布中采样生成新样本。它是一种用于估计样本分布的重采样技术,本文中我们用其来衡量性能估计的不确定性。如果把Holdout方法理解为不放回采样,那么bootstrap就可以理解为通过有放回重采样产生新数据。

     

    步骤如下:

    1. 给定n个样本的数据集

    2. 对b次bootstrap循环:从数据集中抽取一个样本,令其为第j个bootstrap样本。重复该步骤,直至bootstrap样本的大小为n。每次循环均通过有放回抽样,生成一个与原数据集大小相同的数据。有些样本可能在新数据集中出现多次,有些则可能从不出现。

    3. 在每个bootstrap数据集上运行算法,并计算resubstitution准确率。

    4. 计算b次准确率估计的平均值。

    但正如前面所说,resubstitution准确率可能偏向乐观,因为模型对数据集中的噪声可能过于敏感。bootstrap一开始是用于数据潜在分布未知且没有额外样本时确定估计器统计特性。现在,为了更好地对模型预测进行评估,我们更喜欢使用Leave-one-out Bootstrap(LOOB)方法。

     

    这种方法测试集数据和训练集数据没有重叠。图7对该方法进行了说明。

     


    若假设样本付出正态分布,则其均值估计为

    方差估计为:

    标准误差SE为标准差(SD=α)除以。根据公式可得均值的95%置信区间(z=1.96)为:

    其中t与样本数量n(或精确度)有关,可以通过查表法获得。如n=100时,。又已知平均准确率

    则标准误差为:

    所以平均估计的置信区间为:

     

    但上述方法的前提是数据服从正态分布。当数据不服从正态分布时,一种更鲁棒的方法是百分位方法。首先设定置信上下界:

    其中

    α满足“置信区间 = 100 × (1 - 2 × α)”。如置信区间为95%时,α=0.025,b次bootstrap采样分布上下界分别是第2.5个百分位和第97.5个百分位。图8是留一法bootstrap采样标准置信区间计算和百分位置信区间计算的对比。A图是在Iris数据集使用knn(k=3)的模型估计结果,B图是在MNIST数据集上进行softamx回归的模型估计结果。

    在经典bootstrap方法中,估计结果更偏向悲观,这是因为bootstrap采样样本中大约只涉及原始数据的63.2%的不重复样本。在n个样本的数据集中,进行bootstrap采样,则单个样本无法被抽中的概率为:

    当时,上式约等于。所以样本被抽中的概率就为P(chosen)=1 - P(not chosen) = 0.632 。对于大数据集,我们就可以在每次迭代中选择0.632 × n个样本作为bootstrap训练集,剩余0.368 × n个样本留作测试集。图9显示了随着n的增大,样本在bootstrap采样中被抽中的概率。


    为了解决这种放回抽样带来的估计悲观偏差,Bradley提出了“.632估计”,估计准确率可通过下面的方法计算:

    其中是resubstitution准确率,是模型在测试集上的准确率。虽然是为了解决悲观偏差,但却可能导致乐观偏差,所以后来Bradley又提出了“.632 + Bootstrap方法”:

    该方法不再使用ω = 0.632的固定权重,而是通过下式计算ω

    其中R是相关过拟合率:

    为了计算R,我们需要知道非信息率γ。我们可以通过在包含样本和标签所有可能组合的数据集上拟合模型计算γ,其中先假设样本和标签彼此独立:

    或者,通过

    估计非信息率。其中为在数据集中观察到的k类样本的比例,而q_k是分类器在数据集中所预测的k类样本的比例。


    总结


    本节我们继续讨论了机器学习模型评估的偏差和方差,此外还介绍了重复Holdout方法,该方法可以获得关于模型稳定性的信息。然后我们讨论了bootstrap方法——一种来自统计学的方法——及其分支在衡量模型性能不确定性中的作用。下一节我们将讨论模型选择和超参数调优。


    3 交叉验证和超参数优化


    3.1 概述


    几乎每种机器学习算法都有大量的设置,而超参数可以帮助我们在优化机器学习算法性能时控制算法,在偏差和方差折中方案之间找到一个好的平衡。超参数调优本身就是一门艺术,而且没有既准有快的方法可以保证在给定数据集上实现最佳性能。本节将重点讨论模型评估和模型选择交叉验证的不同方法。交叉验证技术会对多个超参数配置对模型进行排序,并估计模型对独立数据集的泛化性能。


    3.2 超参数和模型选择


    在第一节中我们已经介绍过超参数和模型参数的区别。超参数需要在算法运行之前就手动给定,如knn中的k,而模型参数可以由算法自动学习到。Logistic回归模型中,模型参数就是数据集中每个特征变量的权重系数,该系数可以最大化对数似然函数或最小化损失函数自动更新,而超参数则比如是迭代次数,或基于梯度的优化中传递训练集(epochs)的次数。另一个超参数是正则化参数估计的值。

     

    在训练集上运行算法时更改超参数的值可能会产生不同的模型。从一组由不同的超参数值产生的模型中寻找最佳模型的过程称为模型选择。下一小节将介绍一个Holdout方法的拓展,该方法可用于模型选择。


    3.3 超参数调优的three-way Holdout方法


    在第一节中为了估计模型的泛化性能,我们使用Holdout方法将数据划分为训练集和测试集。那Holdout方法可以用于超参数调优吗?答案是肯定的,但我们必须对初始方法进行一些修改,将数据集划分为训练、验证和测试集三部分(three-way)。

     

    超参数优化的目的通常是优化某个性能指标,如分类精度或ROC(Receiving Operating Characteristic)曲线下的面积,调优之后再根据模型在测试集上的性能进行选择。然而多次重复使用测试集会带来偏差,最终的性能评估可能偏向过度乐观。将数据集分为训练、验证和测试集之后,超参数调优和模型选择中的训练集-验证集对可以让测试集在模型评估中保持独立。

     

    图12对这种方法进行了说明。 



    Step 1. 将数据集划分为三部分:训练集用于模型拟合,验证集用于模型选择,测试集用于最终评估选定模型。

    Step 2. 超参数优化:使用不用超参数设置的算法在训练数据上拟合模型。

    Step 3. 对模型在验证集上的性能进行评估。在比较性能评估之后选择最佳性能模型对应的超参数设置。实际操作中常常合并步骤2和步骤3。

    Step 4. 为了避免训练集太小造成的性能估计偏向悲观,我们可以在模型选择之后将训练集和验证集合并,并使用第3步的最佳超参数模型设置将模型在合并后的数据集上进行拟合。

    Step 5.  使用独立测试集估计模型泛化性能。测试集目的是估计模型在未知数据上的泛化能力,重复使用该数据集或导致模型泛化性能的乐观估计。

    Step 6. 最后可以将训练集、验证集和测试集合并,将模型在全部数据上进行拟合,以供实际使用。

     

    理论上使用全部数据拟合出的模型性能只会提高,这会和第5步中得到的模型稍有不同。在此假设下,第5步的性能评估可能会略微低估第6步得到的模型性能。


    3.4 K-Fold交叉验证


    在机器学习中,模型评估和模型选择最常用的方法是k-fold交叉验证。有人可能会将训练/测试holdout方法称为交叉验证技术,但是将交叉验证看做训练-验证阶段的交叉可能会更有意义。这里交叉验证的主要思想是数据集中的每个样本都有被测试的机会。作为交叉验证的一种特殊情况,在k-fold每次迭代中,数据被分为k部分,其中第1部分用于验证集,剩下的k-1部分用于训练集,该流程总共迭代k次。图13展示了一个5-fold交叉验证的流程。这一过程会产生5种不同的模型,这些模型在不同但部分重叠的训练集上进行拟合,在不重叠的验证集上进行评估。最终,交叉验证性能就是k次模型在验证集上性能估计的算术平均值。

    和two-way holdout方法每个样本最终只有0.632的概率被抽中进行训练或测试不同,k-fold交叉验证所有的数据都将用于训练和测试。与重复holdout方法相比,k-fold交叉验证的测试数据没有重叠,而重复holdout是重复使用样本进行测试。


    3.5 特殊情况:2-fold和留一法(Leave-One-Out)交叉验证


    K-fold交叉验证有两种特殊情况:k=2和k=n。大多数文献都说2-fold交叉验证等于holdout方法。然而这种方法只有在训练集和验证集不重新随机划分,而是直接交换的情况(训练集数据和验证集数据各占50%)下才对。本文中将holdout方法和2-fold交叉验证描述为两个不同的过程,见图14。

    而在另一种特殊情况下,k=n时,k-fold等价于留一交叉验证法。图15显示了这一过程,每次迭代中,模型都在其中n-1个样本上进行拟合,然后在剩余的一个样本上进行评估。这种方法对小数据集特别有用。

     

    很多研究都在比较k-fold交叉验证中k值选择如何影响模型性能估计的方差和估计偏差。不过,天下没有免费的午餐。尽管Benigo和Grandvalet的研究显示,在所有分布情况下均不存在K-fold交叉验证方差的无偏估计量。然而我们仍比较希望可以找到一个k值,使得方差和偏差之间取得一个很好的折中。

     

    在计算可行的情况下,同Holdout方法相比,留一法交叉验证更值得推荐。表1展示了Ridge回归模型一个469样本的数据集上的实验评估对比。第1行是留一法交叉验证用于回归模型在100个样本训练子集上拟合结果的评估。第2-4行是holdout方法用于模型在100个样本训练子集上拟合结果的评估,依次是holdout样本数量为10/20/50的结果。我们发现留一法交叉验证的平均估计最接近真实的。

     

    而当数据集很大的时候,出于计算效率的考虑我们就会更倾向于holdout方法。经验上,数据集大的时候,悲观偏差和方差大的问题都会出现的较少。此外,重复使用不同随机种子的k-fold交叉验证过程有助于得到一个更“鲁棒”的估计,比如重复一个5-fold交叉验证100次,就可以得到500个测试的性能估计,交叉验证性能就可以取这500个的算术平均值。但是,重复留一法交叉验证确实没有意义的,因为留一法交叉验证每次都是产生相同的分割。


    3.6 K-fold交叉验证和偏差-方差平衡


    在小数据集和中等数据集上,留一法交叉验证比holdout更好。另外,我们可以认为留一法交叉验证近似无偏:因为几乎所有样本都可用于模型拟合,所以其悲观倾向显著低于k<n-fold 交叉验证。尽管没有偏差,但该方法一个很明显的缺点就是方差大。每次训练集的n-1个样本都和其他迭代中的训练集非常相似,而测试集因为只有一个样本变化就特别大,所以在使用比如0-1损失函数之类的不连续损失函数时,缺陷是很明显的。

     

    既然我们已经确定留一法交叉验证的估计值通常都伴随着大方差和小偏差,那么这个方法与k取其他值时的k-fold交叉验证以及bootstrap方法相比如何呢?第2小节中,我们曾讨论标准bootstrap方法的悲观偏差,其训练集大约包含了原始数据集样本的63.2%;2-fold或3-fold交叉验证也存在类似的悲观偏差。实验还发现,与k-fold交叉验证相比,bootstrap在某些真实数据集上的偏差更明显(偏向乐观)。最终,各种真实数据集上的实验发现,10-fold交叉验证在偏差和方差之间取得了最佳的平衡。此外,还有研究发现重复k-fold交叉验证可以提高评估的精确度同时保持较小的偏差。

     

    在k-fold交叉验证中,随着k的增加有如下趋势:

    • 性能估计偏差减小(更准确)

    • 性能估计方差增大(更大的变化性)

    • 计算成本增加(在拟合过程中训练集更大,需要的迭代次数更多)

    • 在k-fold交叉验证中将k的值降到最小(如2或3)也会增加小数据集上模型估计的方差,因为随机抽样变化较大


    3.7 通过K-fold交叉验证进行模型选择


    和前面一样,这其中很关键的一点是保持独立的测试数据集。要从训练和模型选择阶段保留出来,以避免在训练阶段泄露测试数据。图16展示了该流程的具体步骤。



    Step 1. 将数据集分为一个训练集和独立的测试集(测试集仅在最终模型评估时用)。

    Step 2. 尝试各种超参数设置,如贝叶斯优化,随机搜索或网格搜索。对每个超参数配置,在训练集上应用k-fold交叉验证可以得到多个模型和性能估计。

    Step 3. 使用k-fold交叉验证过程中结果最好的超参数设置,使用完整的训练集来进行这些设置。

    Step 4. 使用之前保留的独立测试集评估第3步获得的模型。

    Step 5. 将模型在所有数据(训练集和测试集合并)上进行拟合,得到最终部署模型。


    3.8 关于模型选择和大型数据集的说明


    由于计算成本较低,许多深度学习文献在模型评估时,常常选择three-way holdout方法;很多早期的文献也常常使用这种方法。除了计算效率方面的问题,当处理的数据相当大时,我们一般只使用深度学习算法,也不用担心会出现高方差。所以当数据集相对较大时,在模型选择中使用holdout方法进行训练、验证和测试,而不是使用k-fold方法。


    3.9 关于模型选择过程中特征选择的说明


    注意,如果我们对数据归一化或进行特征选择,我们通常会在k-fold交叉验证循环中执行这些操作,而不是在划分数据之前就将这些步骤应用到整个数据集。在交叉验证循环内部,特征选择避免了在训练阶段测试数据信息的峰值,通过过度拟合减少了偏差。然而,因为训练的数据较少,交叉验证循环中的特征选择可能导致过度悲观的估计。


    3.10奥卡姆剃刀原则(The Law of Parsimony)


    机器学习领域一个非常经典的节俭原则,也就是奥卡姆剃刀原则是:在相互冲突的假设中,选择假设最少的一个。在模型选择中,奥卡姆剃刀也是一个很有用的工具,如“一个标准误差法”(one-standard error method):

    • 考虑数值最优估计及其标准误差

    • 选择模型,其性能需在步骤1中得到的值的一个标准误差以内的

     

    虽然我们很多人可能更喜欢简单的模型,但Pedro Domingos却在文章中表达了他对“复杂”模型的支持。他在他的文章“关于机器学习的十个误区”中说:


    更简单的模型更准确。这种信念有时等同于奥卡姆剃刀,但剃刀只说了更简单的解释更可取,却没有说为什么。它们更可取,因为它们更容易理解、记忆和推理。有时候,与数据相一致的最简单的假设,比复杂的假设更不准确。一些最强大的学习算法输出的模型似乎是没有必要的,有时甚至在它们完全拟合数据之后还会继续拟合?但那样的话他们甚至还不如弱一些的算法。

     

    当然,只要性能在一定的可接受范围内(例如使用“一个标准误差法”(one-standard error method)),我们仍倾向于选择最简单的模型。虽然一个简单的模型可能不是最“精确”的模型,但是它可能比其他复杂的方法更有效,更容易实现,更容易理解和推理。

     

    为了搞清楚“一个标准误差法”是怎么操作的,我们举一个例子:现在有300个训练样本,150个第1类样本,150个第2类样本,服从同心圆均匀分布。将同心圆数据集分为两部分:70%的训练数据和30%的测试数据,使用层次化方法保持类别比例。图17显示了210个训练数据集中的样本。



    假设我们的目标是优化一个非线性RBF核SVM的超参数γ,γ是高斯RBF核的自由参数。

    直观上,我们认为参数γ控制单个训练样本在决策边界处的影响。

     

    首先在训练数据集上运行使用不同γ值的RBF核SVM,然后进行10-fold交叉验证。图18显示了性能估计的结果。



    其中误差带(error bars)是交叉验证估计的标准误差。正如图8所示,在0.1和100之间选择γ值可以得到80%以上的预测准确率。γ=10会得到一个相当复杂的决策边界,γ=0.001得到的决策边界就非常简单。而γ=0.1则看起来在这两个模型(γ=0.001γ=10.0)之间取得了一个很好的平衡。当γ=0γ=10时,对应的模型性能落在最佳模型的一个标准误差内。


    3.11总结


    预测模型泛化性能的评价方法还有很多。到目前为止,本文介绍了holdout方法、bootstrap方法的不同变体以及k-fold交叉验证。当处理的样本量较大时,使用holdout方法进行模型评价非常合适。对于超参数优化,我们更推荐10折交叉验证。而在小样本的情况下,留一法交叉验证则是一个不错的选择。当涉及到模型选择时,如果数据集很大,并且计算效率也是一个问题,则最好选择three-way handout 方法;模型选择的另一个不错的方法是,在一个独立的测试集上使用k-fold交叉验证。

     

    完整文章请见:https://sebastianraschka.com/pdf/manuscripts/model-eval.pdf


    招聘

    新一年,AI科技大本营的目标更加明确,有更多的想法需要落地,不过目前对于营长来说是“现实跟不上灵魂的脚步”,因为缺人~~


    所以,AI科技大本营要壮大队伍了,现招聘AI记者和资深编译,有意者请将简历投至:gulei@csdn.net,期待你的加入!


    如果你暂时不能加入营长的队伍,也欢迎与营长分享你的精彩文章,投稿邮箱:suiling@csdn.net


    如果以上两者你都参与不了,那就加入AI科技大本营的读者群,成为营长的真爱粉儿吧!后台回复:读者群,加入营长的大家庭,添加营长请备注自己的姓名,研究方向,营长邀请你入群。




    ☟☟☟点击 | 阅读原文 | 查看更多精彩内容

    展开全文
  • 模型选择与特征选择

    千次阅读 2017-04-24 23:36:42
     模型选择问题:对于一个学习问题,可以有多种模型选择。比如要拟合一组样本点,可以使用线性回归,也可以用多项式回归。那么使用哪种模型好呢(能够在偏差和方差之间达到平衡最优)?  还有一类参数选择问题:...

    1 问题

         模型选择问题:对于一个学习问题,可以有多种模型选择。比如要拟合一组样本点,可以使用线性回归clip_image002,也可以用多项式回归clip_image004。那么使用哪种模型好呢(能够在偏差和方差之间达到平衡最优)?

         还有一类参数选择问题:如果我们想使用带权值的回归模型,那么怎么选择权重w公式里的参数clip_image006

    形式化定义:假设可选的模型集合是clip_image008,比如我们想分类,那么SVM、logistic回归、神经网络等模型都包含在M中。

    2 交叉验证(Cross validation)

         我们的第一个任务就是要从M中选择最好的模型。

         假设训练集使用S来表示

         如果我们想使用经验风险最小化来度量模型的好坏,那么我们可以这样来选择模型:

    1、 使用S来训练每一个clip_image010,训练出参数后,也就可以得到假设函数clip_image012。(比如,线性模型中得到clip_image014后,也就得到了假设函数clip_image016

    2、 选择错误率最小的假设函数。

         遗憾的是这个算法不可行,比如我们需要拟合一些样本点,使用高阶的多项式回归肯定比线性回归错误率要小,偏差小,但是方差却很大,会过度拟合。因此,我们改进算法如下:

    1、 从全部的训练数据S中随机选择70%的样例作为训练集clip_image018,剩余的30%作为测试集clip_image020

    2、 在clip_image018[1]上训练每一个clip_image010[1],得到假设函数clip_image012[1]

    3、 在clip_image020[1]上测试每一个clip_image012[2],得到相应的经验错误clip_image022

    4、 选择具有最小经验错误clip_image022[1]clip_image012[3]作为最佳模型。

         这种方法称为hold-out cross validation或者称为简单交叉验证。

         由于测试集是和训练集中是两个世界的,因此我们可以认为这里的经验错误clip_image022[2]接近于泛化错误(generalization error)。这里测试集的比例一般占全部数据的1/4-1/3。30%是典型值。

         还可以对模型作改进,当选出最佳的模型clip_image010[2]后,再在全部数据S上做一次训练,显然训练数据越多,模型参数越准确。

         简单交叉验证方法的弱点在于得到的最佳模型是在70%的训练数据上选出来的,不代表在全部训练数据上是最佳的。还有当训练数据本来就很少时,再分出测试集后,训练数据就太少了。

         我们对简单交叉验证方法再做一次改进,如下:

    1、 将全部训练集S分成k个不相交的子集,假设S中的训练样例个数为m,那么每一个子集有m/k个训练样例,相应的子集称作{clip_image024}。

    2、 每次从模型集合M中拿出来一个clip_image010[3],然后在训练子集中选择出k-1个

    {clip_image026}(也就是每次只留下一个clip_image028),使用这k-1个子集训练clip_image010[4]后,得到假设函数clip_image030。最后使用剩下的一份clip_image028[1]作测试,得到经验错误clip_image032

    3、 由于我们每次留下一个clip_image028[2](j从1到k),因此会得到k个经验错误,那么对于一个clip_image010[5],它的经验错误是这k个经验错误的平均。

    4、 选出平均经验错误率最小的clip_image010[6],然后使用全部的S再做一次训练,得到最后的clip_image012[4]

         这个方法称为k-fold cross validation(k-折叠交叉验证)。说白了,这个方法就是将简单交叉验证的测试集改为1/k,每个模型训练k次,测试k次,错误率为k次的平均。一般讲k取值为10。这样数据稀疏时基本上也能进行。显然,缺点就是训练和测试次数过多。

         极端情况下,k可以取值为m,意味着每次留一个样例做测试,这个称为leave-one-out cross validation。

    如果我们发明了一种新的学习模型或者算法,那么可以使用交叉验证来对模型进行评价。比如在NLP中,我们将训练集中分出一部分训练,一部分做测试。

    3 特征选择(Feature selection)

         特征选择严格来说也是模型选择中的一种。这里不去辨析他们的关系,重点说明问题。假设我们想对维度为n的样本点进行回归,然而,n可能大多以至于远远大于训练样例数m。但是我们感觉很多特征对于结果是无用的,想剔除n中的无用特征。n个特征就有clip_image034种去除情况(每个特征去或者保留),如果我们枚举这些情况,然后利用交叉验证逐一考察在该情况下模型的错误率,太不现实。因此需要一些启发式搜索方法。

    第一种,前向搜索:

    1、 初始化特征集F为空。

    2、 扫描i从1到n,

    如果第i个特征不在F中,那么将特征i和F放在一起作为clip_image036(即clip_image038

    在只使用clip_image036[1]中特征的情况下,利用交叉验证来得到clip_image036[2]的错误率。

    3、 从上步中得到的n个clip_image036[3]中选出错误率最小的clip_image036[4],更新F为clip_image036[5]

    如果F中的特征数达到了n或者预设定的阈值(如果有的话),那么输出整个搜索过程中最好的F,没达到转到2

         前向搜索属于wrapper model feature selection。Wrapper这里指不断地使用不同的特征集来测试学习算法。前向搜索说白了就是每次增量地从剩余未选中的特征选出一个加入特征集中,待达到阈值或者n时,从所有的F中选出错误率最小的。

         既然有增量加,那么也会有增量减,后者称为后向搜索。先将F设置为{1,2,..,n},然后每次删除一个特征,并评价,直到达到阈值或者为空,然后选择最佳的F。

         这两种算法都可以工作,但是计算复杂度比较大。时间复杂度为clip_image040

    第二种,过滤特征选择(Filter feature selection):

         过滤特征选择方法的想法是针对每一个特征clip_image042,i从1到n,计算clip_image042[1]相对于类别标签clip_image044的信息量clip_image046,得到n个结果,然后将n个clip_image046[1]按照从大到小排名,输出前k个特征。显然,这样复杂度大大降低,为O(n)。

         那么关键问题就是使用什么样的方法来度量clip_image046[2],我们的目标是选取与y关联最密切的一些clip_image042[2]。而y和clip_image042[3]都是有概率分布的。因此我们想到使用互信息来度量clip_image046[3],对于clip_image042[4]是离散值的情况更适用,不是离散值,将其转变为离散值,方法在第一篇《回归认识》中已经提到。

         互信息(Mutual information)公式:

    clip_image047

         当clip_image042[5]是0/1离散值的时候,这个公式如上。很容易推广到clip_image042[6]是多个离散值的情况。

         这里的clip_image049clip_image051clip_image053都是从训练集上得到的。

         若问这个MI公式如何得来,请看它的KL距离(Kullback-Leibler)表述:

    clip_image054

         也就是说,MI衡量的是clip_image042[7]和y的独立性。如果它俩独立(clip_image056),那么KL距离值为0,也就是说clip_image042[8]和y不相关了,可以去除clip_image042[9]。相反,如果两者密切相关,那么MI值会很大。在对MI进行排名后,最后剩余的问题就是如何选择k值(前k个clip_image042[10])。我们继续使用交叉验证的方法,将k从1扫描到n,取最大的F。不过这次复杂度是线性的了。比如,在使用朴素贝叶斯分类文本的时候,词表长度n很大。使用filter特征选择方法,能够增加分类器的精度。

    4 贝叶斯统计和规则化(Bayesian statistics and regularization)

         题目有点绕,说白了就是要找更好的估计方法来减少过度拟合情况的发生。

         回顾一下,线性回归中使用的估计方法是最小二乘法,logistic回归是条件概率的最大似然估计,朴素贝叶斯是联合概率的最大似然估计,SVM是二次规划。

         以前我们使用的估计方法是最大似然估计(比如在logistic回归中使用的):

         clip_image057

         注意这里的最大似然估计与维基百科中的表述

           http://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E5%90%8E%E9%AA%8C%E6%A6%82%E7%8E%87

         有些出入,是因为维基百科只是将样本(观察数据)记为X,然后求P(X)的最大概率。然而,对于我们这里的样本而言,分为特征x和类标签y。我们需要具体计算P(X)。在判别模型(如logistic回归)中,我们看待P(X)=P(x,y)=P(y|x)P(x),而P(x)与clip_image059独立无关,因此最后的argmax P(X)由argmaxP(y|x)决定,也就是上式clip_image061。严格来讲clip_image061[1]并不等于样本X的概率,只是P(X)决定于clip_image061[2]clip_image061[3]最大化时P(X)也最大化。在生成模型,如朴素贝叶斯中,我们看待P(X)=P(y)P(x|y),也就是在某个类标签y下出现特征x的概率与先验概率之积。而P(x|y)在x各个分量是条件独立情况下可以以概率相乘方式计算出,这里根本没有参数clip_image059[1]。因此最大似然估计直接估计P(x,y)即可,变成了联合分布概率。

         在该上式中,我们视参数clip_image059[2]为未知的常数向量。我们的任务就是估计出未知的clip_image059[3]

         从大范围上说,最大似然估计看待clip_image059[4]的视角称为频率学派(frequentist statistics),认为clip_image059[5]不是随机变量,只是一个未知的常量,因此我们没有把clip_image063写成clip_image065

         另一种视角称为贝叶斯学派(Bayesian),他们看待clip_image059[6]为随机变量,值未知。既然clip_image059[7]为随机变量,那么clip_image059[8]不同的值就有了不同的概率clip_image067(称为先验概率),代表我们对特定的clip_image059[9]的相信度。我们将训练集表示成clip_image069,i从1到m。我们首先需要求出clip_image059[10]的后验概率:

    clip_image070

         这个公式的推导其实比较蹊跷。第一步无可厚非,第二步中先看分子,分子中clip_image072最完整的表达方式是clip_image074。由于在分母中也会出现clip_image076,所以clip_image076[1]会被约掉。当然作者压根就没有考虑clip_image076[2],因为他看待P(S)的观点就是x->y,而不是(x,y)。再来看分母,分母写成这种形式后,意思是对所有的clip_image078可能值做积分。括号里面的意思是clip_image080,然后将其展开成分母的模样,从宏观上理解,就是在求每个样例的概率时,先以一定的概率确定clip_image078[1],然后在clip_image082clip_image078[2]的作用下再确定clip_image084的概率。而如果让我推导这个公式,我可能会这样写分母clip_image086,这样推导出的结果是clip_image088。我不知道自己的想法对不对,分歧在于如何看待clip_image078[3],作者是为每个样例都重新选定clip_image078[4],而我是对总体样本选择一个clip_image078[5]

     

         clip_image065[1]在不同的模型下计算方式不同。比如在贝叶斯logistic回归中,

         clip_image089

         其中clip_image090,p的表现形式也就是伯努利分布了。

         在clip_image059[11]是随机变量的情况下,如果新来一个样例特征为x,那么为了预测y。我们可以使用下面的公式:

         clip_image091

         clip_image002[4]由前面的公式得到。假若我们要求期望值的话,那么套用求期望的公式即可:

         clip_image094

         大多数时候我们只需求得clip_image002[6]中最大的y即可(在y是离散值的情况下)。

         这次求解clip_image098与之前的方式不同,以前是先求clip_image059[12],然后直接预测,这次是对所有可能的clip_image059[13]作积分。

         再总结一下两者的区别,最大似然估计没有将clip_image059[14]视作y的估计参数,认为clip_image059[15]是一个常数,只是未知其值而已,比如我们经常使用常数c作为y=2x+c的后缀一样。但是clip_image063[1]的计算公式中含有未知数clip_image059[16]。所以再对极大似然估计求导后,可以求出clip_image059[17]

         而贝叶斯估计将clip_image059[18]视为随机变量,clip_image059[19]的值满足一定的分布,不是固定值,我们无法通过计算获得其值,只能在预测时计算积分。

         然而在上述贝叶斯估计方法中,虽然公式合理优美,但后验概率clip_image100很难计算,看其公式知道计算分母时需要在所有的clip_image059[20]上作积分,然而对于一个高维的clip_image059[21]来说,枚举其所有的可能性太难了。

    为了解决这个问题,我们需要改变思路。看clip_image100[1]公式中的分母,分母其实就是P(S),而我们就是要让P(S)在各种参数的影响下能够最大(这里只有参数clip_image059[22])。因此我们只需求出随机变量clip_image059[23]中最可能的取值,这样求出clip_image059[24]后,可将clip_image059[25]视为固定值,那么预测时就不用积分了,而是直接像最大似然估计中求出clip_image059[26]后一样进行预测,这样就变成了点估计。这种方法称为最大后验概率估计(Maximum a posteriori)方法

         clip_image102估计公式为

         clip_image103

         clip_image105clip_image107一样表示的是P(S),意义是在从随机变量分布中以一定概率clip_image067[1]选定好clip_image059[27]后,在给定样本特征clip_image082[1]clip_image084[1]出现的概率积。

         但是如果让我推导这个公式的时候,我会这么做,考虑后验概率clip_image100[2],我们的目标是求出最有可能的clip_image059[28]。而对于clip_image059[29]的所有值来说,分母是一样的,只有分子是不同的。因此clip_image109。也就是clip_image105[1]的推导式。但这个公式与上面的有些不同,同样还是看待每个样本一个clip_image059[30],还是总体样本一个clip_image059[31]的问题。

         与最大似然估计对比发现,MAP只是将clip_image059[32]移进了条件概率中,并且多了一项clip_image067[2]。一般情况下我们认为clip_image111,实际上,贝叶斯最大后验概率估计相对于最大似然估计来说更容易克服过度拟合问题。我想原因是这样的,过度拟合一般是极大化clip_image063[2]造成的。而在此公式中多了一个参数clip_image059[33],整个公式由两项组成,极大化clip_image065[2]时,不代表此时clip_image067[3]也能最大化。相反,clip_image059[34]是多值高斯分布,极大化clip_image065[3]时,clip_image067[4]概率反而可能比较小。因此,要达到最大化clip_image105[2]需要在两者之间达到平衡,也就靠近了偏差和方差线的交叉点。这个跟机器翻译里的噪声信道模型比较类似,由两个概率决定比有一个概率决定更靠谱。作者声称利用贝叶斯logistic回归(使用clip_image105[3]的logistic回归)应用于文本分类时,即使特征个数n远远大于样例个数m,也很有效。

    展开全文
  • 模型选择的一些基本思想和方法

    千次阅读 2017-05-20 11:51:47
    有监督学习是日常使用最多的建模范式,它有许多更具体的名字,比如预测模型、回归模型、分类模型或者分类器。这些名字或来源统计,或来源于机器学习。关于统计学习与机器学习的区别已经有不少讨论,不少人认为机器...
  • 模型选择准则AIC和BIC

    千次阅读 2020-02-23 17:50:53
    所以,模型选择问题在模型复杂度与模型对数据集描述能力(即似然函数)之间寻求最佳平衡。 人们提出许多信息准则,通过加入模型复杂度的惩罚项来避免过拟合问题,此处我们介绍一下常用的两个模型选择方法——赤池...
  • 交叉验证如何用于选择调节参数、选择模型选择特征 改善交叉验证 1. 模型验证回顾进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要...
  • 统计分析:模型评估和模型选择

    千次阅读 2016-01-22 10:22:01
    机器学习算法 原理、实现与实战——模型评估与模型选择原文地址:http://www.cnblogs.com/ronny/p/4062792.html1. 训练误差与测试误差机器学习的目的是使学习到的模型不仅对已知数据而且对未知数据都能有很好的预测...
  • 最近在撰写笔记 【Sklearn源码学习笔记】(含官网样例解读)无监督学习之高斯混合模型 的过程中,官方Sklearn源码中有用BIC来估计高斯混合模型不同协方差矩阵和分量数下的得分,遂将BIC和AIC相关知识进行总结记录。...
  • 模型选择准则

    千次阅读 2015-12-14 19:15:28
    对一堆数据进行建模的时候,特别是分类和回归模型,我们有很多的变量可供使用,选择不同的变量组合可以得到不同的模型,例如我们有5个变量,2的5次方,我们将有32个变量组合,可以训练出32个模型。但是哪个模型更加...
  • 经常地,对一堆数据进行建模的时候,特别是分类和回归模型,我们有很多的变量可供使用,选择不同的变量组合可以得到不同的模型,例如我们有5个变量,2的5次方,我们将有32个变量组合,可以训练出32个模型。...
  • 模型选择和特征选择经验总结

    千次阅读 2016-11-10 17:27:02
    模型选择 常见的分类模型有:SVM,LR,Navie Bayesian,CART以及由CART演化而来的树类模型,Random Forest,GBDT,最近详细研究了GBDT,RF发现它的拟合能力近乎完美,而且在调整了参数之后可以降低过拟合的影响,...
  • 引言 机器学习已经成为我们生活中的一部分,对购买者、消费者或是希望进行研究和实践者都很重要!无论我们应用预测建模技术来进行我们的研究还是解决业务问题,我...我们如何优先选择一个好的模型?也许一个不同的学
  • 模型选择之交叉验证

    千次阅读 2014-11-11 15:28:42
    比如说,在正则化后的logistic regression中,正则项和损失函数之间的参数t就是一个超参数,不同的t取值对应了不同的模型,我们对于t的选取实际上也就是对模型选择,我们试图找到一个t,使得t对应的模型最优。...
  • 机器学习模型选择:调参参数选择

    万次阅读 2016-10-23 16:49:22
    http://blog.csdn.net/pipisorry/article/details/52902797调参经验好的实验环境是成功的一半由于深度学习实验超参众多,代码风格良好的实验环境,可以让你的...可以输出模型的损失函数值以及训练集和验证集上的准确
  • 模型选择和训练、验证、测试集

    千次阅读 2019-04-06 10:46:13
    我们是根据测试集的数据来选择模型和评估检测的,但是这是一个不过你公平的过程,因为我们用来进行模型选择和评估的数据是一组相同的数据,拟合的情况肯定很好,但是对于那些没有出现在测试集中的数据没有泛化作用。...
  • 机器学习之模型选择(交叉验证)

    千次阅读 2015-08-23 10:39:25
    模型选择问题:对于一个学习问题,可以有多种模型选择。比如要拟合一组样本点,可以使用线性回归,也可以用多项式回归。那么使用哪种模型好呢(能够在偏差和方差之间达到平衡最优)? 还有一类参数选择问题:如果...
  • 模型选择问题是在模型复杂度与模型对数据集描述能力(即似然函数)之间寻求最佳平衡。  对于过拟合问题,可加入模型复杂度的惩罚项来避免,这里通过ML库代码介绍两个模型选择方法:赤池信息准则(Akaike
  • 对于解决同一个问题,如怎么选择模型去拟合线性回归中只有一个特征时房价预测问题,如可能有不同的模型去解决,如: 1、d = 1,h(θ) = θ0+θ1x 2、d = 2,h(θ) = θ0+θ1x+θ2x^2 3、d = 3,h(θ) = θ0...
  • 训练集/测试集分割用于模型验证的缺点K折交叉验证是如何克服之前的不足交叉验证如何用于选择调节参数、选择模型选择特征改善交叉验证 1. 模型验证回顾¶ 进行模型验证的一个重要目的是要选出一个最合适...
  • 模型评估与模型选择

    千次阅读 多人点赞 2021-04-03 20:42:40
    我们的模型选择可以有很多,比如:线性回归(n 元一次函数)、多项式回归(一元 n 次函数)等。即便是使用线性回归模型,在设置不同的超参数(如学习率、迭代次数)进行训练时,得到的模型参数也会有差异。(模型...
  • 机器学习:交叉验证和模型选择与Python代码实现

    万次阅读 多人点赞 2017-09-23 14:28:43
    前言:本篇博文主要介绍交叉验证(cross validation)和模型选择,首先介绍相关的基础概念和原理,然后通过Python代码实现交叉验证和模型评估以及选择。特别强调,其中大多理论知识来源于《统计学习方法_李航》和...
  • 最优模型选择的准则:AIC、BIC准则

    万次阅读 多人点赞 2018-07-30 16:34:46
    选择最优模型的指导思想是从两个方面去考察:一个是似然函数最大化,另一个是模型中的未知参数个数最小化。似然函数值越大说明模型拟合的效果越好,但是我们不能单纯地以拟合精度来衡量模型的优劣,这样回导致模型中...
  • 机器学习的基本分类模型: KNN,决策树,naive bayes,逻辑回归,SVM,adaboostKNN:一种直接的学习方法,通过相似的近邻投票分类。模型不确定性有三:距离度量(相似性度量),特征权重分配,投票权重。不确定性...
  • 当我们使用正则化的线性回归方法预测房价时,发现得到的...【一、回归模型选择】我们引入一类数据集,叫做cross validation set,即交叉验证数据集。将所有数据按6:2:2 分为training set , cross validation set , t
  • 模型选择之AIC与BIC

    万次阅读 2014-11-05 15:04:09
    此处模型选择wo'm
  • Task4 模型选择与精度评价 AIC/BIC选择变量 AIC(glm1.a)  #AIC AIC(glm1.a,k=log(length(a[,1])))  #BIC logit.aic=step(glm1.a,trace=0) summary(logit.aic)  #经过AIC选择后的变量系数输出表 n=...
  • 机器学习之模型评估与选择

    千次阅读 2018-10-06 19:34:16
    模型评估与选择 目录 模型评估与选择 一、经验误差与过拟合 二、评估方法 三、性能度量 四、比较检验   一、经验误差与过拟合 误差:模型实际预测输出与样本的真实输出之间的差异 错误率:分类错误的样本...
  • 机器学习---过拟合和模型选择

    千次阅读 2016-04-22 23:19:05
    以下内容主要在讲:我们怎样选取一个好的模型,判断模型好坏的指标或者选取策略是神马 到目前为止我觉得下边说了这么多 分割线前边有用的就一句——我们选取模型的时候需要考虑两个条件,1、error(基于约束条件)...
  • 模型选择准则之AIC和BIC

    万次阅读 2015-08-24 10:57:27
    此处模型选择我们只考虑模型参数数量,不涉及模型结构的选择。 很多参数估计问题均采用似然函数作为目标函数,当训练数据足够多时,可以不断提高模型精度,但是以提高模型复杂度为代价的,同时带来一个机器学习中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,185,568
精华内容 474,227
关键字:

模型选择