k重交叉验证机器学习_机器学习分类模型的交叉验证学习曲线 - CSDN
  • k-重交叉验证(k-fold crossValidation): 在机器学习中,将数据集A 分为训练集(training set)B和测试集(testset)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包...
    转载出处:http://blog.csdn.net/kylinxu70/article/details/23065651

    k-重交叉验证(k-fold crossValidation):

    机器学习中,将数据集A 分为训练集(training set)B和测试集(testset)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,每次将其中一个包作为测试集,剩下k-1个包作为训练集进行训练。
    在matlab中,可以利用:
    indices=crossvalind('Kfold',x,k);
    来实现随机分包的操作,其中x为一个N维列向量(N为数据集A的元素个数,与x具体内容无关,只需要能够表示数据集的规模),k为要分成的包的总个数,输出的结果indices是一个N维列向量,每个元素对应的值为该单元所属的包的编号(即该列向量中元素是1~k的整随机数),利用这个向量即可通过循环控制来对数据集进行划分。例:

    [M,N]=size(data);//数据集为一个M*N的矩阵,其中每一行代表一个样本
    indices=crossvalind('Kfold',data(1:M,N),10);//进行随机分包
    fork=1:10//交叉验证k=10,10个包轮流作为测试集
    test = (indices == k); //获得test集元素在数据集中对应的单元编号
    train = ~test;//train集元素的编号为非test元素的编号
    train_data=data(train,:);//从数据集中划分出train样本的数据
    train_target=target(:,train);//获得样本集的测试目标,在本例中是实际分类情况
    test_data=data(test,:);//test样本集
    test_target=target(:,test);


    今天用到crossvalind. 这个适用于Cross validation。中文应该叫做交叉验证。我主要想说说这个函数怎么用的。举个简单的例子;

    P_train=[1 2 3 4 5 6 7 8 ]'
    P_train =

         1
         2
         3
         4
         5
         6
         7
         8
    Indices=crossvalind('Kfold',8,4)
    Indices =
         2
         3
         4
         1
         4
         1
         3
         2
    看到Incides了吗,这个是问题的关键,他把所有的点分成4类。数字一样的是一类,Indices=crossvalind('Kfold',8,4)中‘8’代表元素的个数,‘4’代表分成几类,因为有四类,每类应该有8/4两个元素,看indices中,每个相同的数字有两个元素,这样就能完成分类了。
    正常都是需要循环4次,这里的‘4’和crossvalind中的参数‘4’是一样的。比如第一次循环令i=1;
    得到indicies中是‘1’的,把其中的相应的设置为‘1’,其余的为零。
    val_set_index=(Indices==1)
    这个是对于test的(validation)验证
    val_set_index =
         0
         0
         0
         1
         0
         1
         0
         0
     train_set_index=~val_set_index
    这个是train的(训练分类器)
    train_set_index =
         1
         1
         1
         0
         1
         0
         1
         1
    这两个结果加在一起是一个全为1的向量。
    若果我想提取其中的test,用下面语句:
    >>val_ma=P_train(val_set_index,:);%val_set_index=[0 0 0 1 0 1 0 0]'
    >> val_ma
    val_ma =

         4
         6
    看见没,得到相应的测试元素

    十折交叉验证

    (1)英文名叫做10-fold cross-validation,用来测试算法准确性,是常用的测试方法。

    (2)将数据集分成十份,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率(或差错率)。

    (3)10次的结果的正确率(或差错率)的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计。

     

    例子:利用十折交叉验证计算错误分类率

    (Matlab内置了由Fisher在1936年发布的关于iris的数据集,鸠尾花的分类,详见UCI链接;载入该数据集,包括means和species,分别是四维的150个样本和对应的类别)

     

    load fisheriris
    indices = crossvalind('Kfold',species,10); 
    cp = classperf(species); 
    for i = 1:10
          test = (indices == i); train = ~test;    %分别取第1、2、...、10份为测试集,其余为训练集
          class = classify(meas(test,:),meas(train,:),species(train,:));
          classperf(cp,class,test);
    end
    cp.ErrorRate     %查询错误分类率

     

     相关函数解释:

    Indices = crossvalind('Kfold', N, K)

    1)参数'Kfold'表明为了K折十字交叉验证,把数据集N随机分成平均的(或近似评价的)K份,Indices中为每个样本所属部分的索引(从1到K)
    2)因为是随机分,因此重复调用会产生不同分法。
    3)在K折十字交叉验证中,K-1份被用做训练,剩下的1份用来测试,这个过程被重复K次。

     

    cp = classperf(truelabels)

    1)classperf是评估分类器性能(Evaluate performance of classifie)函数。

    2)truelabels中为每个样本对应的真实类别,创建并初始化一个空的分类器性能对象CP。

    3)classperf provides an interface to keep track of the performance during the validation of classifiers. classperf creates and, optionally, updates a classifier performance object, CP, which accumulates the results of the classifier.

     

    class = classify(sample,training,group)

    1)classify是判别分析(Discriminant Analysis)函数。

    2)若事先已经建立类别,则使用判别分析;若事先没有建立类别,则使用聚类分析。一般地,若已有给定的若干总体的(即若干类别)的观测资料,希望构造一个或多个判别函数,能由此函数对新的位置其所属总体的样品作出判断,从而决定其应属于哪个总体,这就是判别分析问题。

    3)判别分析是利用原有的分类信息,得到判别函数(判别函数关系式,一般是与分类相关的若干个指标的线性关系式),然后利用 该函数去判断未知样品属于哪一类。因此,这是一个学习与预测的过程。常用的判别分析法有距离判别法、费歇尔判别法、贝叶斯判别法等。

    4)matlab中语法:class = classify(sample,training,group) ,默认线性判别分析,将sample的每个样本进行判别,分到trainning指定的类中,返回该类表作为分类结果。还可以用参数type指定判别分析法。

     

    classperf(cp, classout, testidx)

    1)根据分类结果,更新分类器性能对象CP。

    2)在十折交叉验证法中,就是重复10次,可累积得到总的错误分类率。


    10折交叉验证的例子

    第1步,将数据等分到10个桶中。
     

    我们会将50名篮球运动员和50名非篮球运动员分到每个桶中。每个桶当中放入了100人的信息。

    第2步,下列步骤重复10次。

    (1)每一次迭代中留存其中一个桶。第一次迭代中留存桶1,第二次留存桶2,其余依此类推。

    (2)用其他9个桶的信息训练分类器(第一次迭代中利用从桶2到桶10的信息训练分类器)。

    (3)利用留存的数据来测试分类器并保存测试结果。在上例中,这些结果可能如下:

    35个篮球运动员被正确分类;

    29个非篮球运动员被正确分类。

    第3步,对上述结果汇总。

    通常情况下我们会将结果放到与下表类似的表格中:
     

     

    分成篮球运动员

    分成非篮球运动员

    实际为篮球运动员

    372

    128

    实际为非篮球运动员

    220

    280

    在所有500名篮球运动员中,有372人被正确分类。可能需要做的一件事是将右下角的数字也加上去,也就是说1000人当中有652(372+280)人被正确分类。因此得到的精确率为65.2%。与2折或3折交叉验证相比,基于10折交叉验证得到的结果可能更接近于分类器的真实性能。之所以这样,是因为每次采用90%而不是2折交叉验证中仅仅50%的数据来训练分类器。
     



    展开全文
  • 机器学习中的交叉验证(cross-validation)

    万次阅读 多人点赞 2016-08-16 19:08:36
    交叉验证(Cross validation),交叉验证用于防止模型过于复杂而引起的过拟合.有时亦称循环估计, 是一种统计学上将数据...交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力(generalize

    交叉验证(Cross validation),交叉验证用于防止模型过于复杂而引起的过拟合.有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力(generalize)。

    交叉验证一般要尽量满足:

    1)训练集的比例要足够多,一般大于一半
    2)训练集和测试集要均匀抽样

    交叉验证主要分成以下几类:
    1)k-folder cross-validation:
    k个子集,每个子集均做一次测试集,其余的作为训练集。交叉验证重复k次,每次选择一个子集作为测试集,并将k次的平均交叉验证识别正确率作为结果。
    优点:所有的样本都被作为了训练集和测试集,每个样本都被验证一次。10-folder通常被使用。
    2)K * 2 folder cross-validation
    是k-folder cross-validation的一个变体,对每一个folder,都平均分成两个集合s0,s1,我们先在集合s0训练用s1测试,然后用s1训练s0测试。
    优点是:测试和训练集都足够大,每一个个样本都被作为训练集和测试集。一般使用k=10
    3)least-one-out cross-validation(loocv)
    假设dataset中有n个样本,那LOOCV也就是n-CV,意思是每个样本单独作为一次测试集,剩余n-1个样本则做为训练集。
    优点:
    1)每一回合中几乎所有的样本皆用于训练model,因此最接近母体样本的分布,估测所得的generalization error比较可靠。
    2)实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。
    但LOOCV的缺点则是计算成本高,为需要建立的models数量与总样本数量相同,当总样本数量相当多时,LOOCV在实作上便有困难,除非每次训练model的速度很快,或是可以用平行化计算减少计算所需的时间。

    ——-十折交叉验证:10-fold cross validation——-

    英文名叫做10-fold cross-validation,用来测试算法准确性。是常用的测试方法。将数据集分成十分,轮流将其中9份作为训练数据,1份作为测试数据,进行试验。每次试验都会得出相应的正确率(或差错率)。10次的结果的正确率(或差错率)的平均值作为对算法精度的估计,一般还需要进行多次10折交叉验证(例如1010折交叉验证),再求其均值,作为对算法准确性的估计。

    之所以选择将数据集分为10份,是因为通过利用大量数据集、使用不同学习技术进行的大量试验,表明10折是获得最好误差估计的恰当选择,而且也有一些理论根据可以证明这一点。但这并非最终诊断,争议仍然存在。而且似乎5折或者20折与10折所得出的结果也相差无几。

    举例如下:


    问题描述:
    如何在一些模型中选择一个最好的模型;避免数据浪费;
    举例说明
    1 多项式回归模型中 y = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + \cdots + a_m x^m + \varepsilon. \, 我们知道模型越复杂即m越高,拟合效果越好。但是未必是一个好的分类模型,因为模型过拟合了。那么如何确定m的值呢。
    2 locally weighted regression中,τ值得确定。
    3 SVM中参数C的确定。
    交叉验证就是很好的用于这些问题,这些模型中参数寻优的问题。

    如何交叉验证:
    我这里主要介绍K交叉验证
    1 将数据集分成K份(网上有说是将数据集分成测试训练两部分,然后将训练部分再分K份,我觉得这样仍然有大部分数据没用于模型训练造成数据浪费。)
    2 对于每一个模型(拿多项式回归举例, m=2为一个模型,m=3为一个模型。。。我们主要就是寻找最好的m)
      for j=1,2,...,k
          将除第j份的所有数据作为训练集用于训练,得到训练参数。
          将训练参数在第j份数据上进行测试,得到测试错误E(j);
    3 经过第二步就得到了K个模型,和K个测试错误,将这K个错误求平均,就是该模型的estimated generalization error。
    estimated generalization error最小的模型即为我们最优的模型,(例如发现m=3时平均错误最小)我们取这个模型再对所有数据进行训练,得到一个模型参数即为所求。
    这样就避免了数据浪费,所有数据都有用于过训练。


    展开全文
  • 交叉验证的目的:在实际训练中,模型通常对训练数据好,但是对训练数据之外的数据拟合程度差。用于评价模型的泛化能力,从而进行模型选择。 交叉验证的基本思想:把在某种意义下将原始数据(dataset)进行分组,一部分...

    交叉验证的目的:在实际训练中,模型通常对训练数据好,但是对训练数据之外的数据拟合程度差。用于评价模型的泛化能力,从而进行模型选择

    交叉验证的基本思想:把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对模型进行训练,再利用验证集来测试模型的泛化误差。另外,现实中数据总是有限的,为了对数据形成重用,从而提出k-折叠交叉验证。

    对于个分类或回归问题,假设可选的模型为clip_image008k-折叠交叉验证就是将训练集的1/k作为测试集,每个模型训练k次,测试k次,错误率为k次的平均,最终选择平均率最小的模型Mi。

     

    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]

    展开全文
  • holdout交叉验证机器学习模型泛化性能的一个经典且常用的方法。 holdout交叉验证能将最初的数据集分为训练集和测试集   模型选择:对模型的的不同参数设置进行调优和比较的过程,也就是针对给定分类问题,调整...

    holdout交叉验证K折交叉验证可以得到模型的泛化误差的可靠估计(模型在新数据集是的性能表现)。


    holdout交叉验证

    holdout交叉验证是机器学习模型泛化性能的一个经典且常用的方法

    holdout交叉验证能将最初的数据集分为训练集和测试集

     

    模型选择:对模型的的不同参数设置进行调优和比较的过程,也就是针对给定分类问题,调整参数以寻找最优值(超参)的过程。

     

    使用holdout进行模型选择更好的方法:将数据划分为三个部分,训练集,测试集,验证集。

    训练集:用于不同模型的拟合,模型在验证集上的性能表现作为模型选择的标准

     

    不使用测试集用于模型训练以及模型选择的优势:

           评估模型应用于新数据上能够获得较小偏差



    holdout过程:



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



    K折交叉验证

    K折交叉验证将k个训练子集重复holdout方法k次。

    K折交叉验证不重复的随机将训练集划分为k个,k-1个用于训练,剩余一个用于测试,重复该过程k次,得到k个模型对模型性能的评价。

     

    基于评价结果可以计算平均性能。

    与holdput相比,这样得到的结果对数据划分方法敏感度相对较低

     

    一般情况将K折交叉验证用于模型调优找到使得模型泛化性能最优的超参值。,找到后,在全部训练集上重新训练模型,并使用独立测试集对模型性能做出最终评价。

     

    K折交叉验证使用了无重复抽样技术的好处:每次迭代过程中每个样本点只有一次被划入训练集或测试集的机会



    K折交叉验证图:




    如果训练数据集相对较小,则增大k值。

    增大k值,在每次迭代过程中将会有更多的数据用于模型训练,能够得到最小偏差,同时算法时间延长。且训练块间高度相似,导致评价结果方差较高。

     

    如果训练集相对较大,则减小k值。

    减小k值,降低模型在不同的数据块上进行重复拟合的性能评估的计算成本,在平均性能的基础上获得模型的准确评估。



    K折交叉验证的一个特例:

     留一(LOO)交叉验证法:将数据子集划分的数量等于样本数(k=n),每次只有一个样本用于测试,数据集非常小时,建议用此方法。

     

    K折交叉验证改进成的 分层K折交叉验证:

           获得偏差和方差都低的评估结果,特别是类别比例相差较大时。

     

    实现K折交叉验证:

    使用数据集中的类标y_train初始化sklearn.cross_validation模块下的StratifiedKFold迭代器,通过n_folds参数设置块的数量。

    使用kfold在k个块中迭代时,使用train中返回的索引去拟合流水线,通过pipe_lr流水线保证样本都得到适当的缩放。

    使用test索引计算模型的准确率,存在score中。



    # 使用k-fold交叉验证来评估模型性能。
    import numpy as np
    from sklearn.cross_validation import StratifiedKFold
    
    kfold = StratifiedKFold(y=y_train, 
                            n_folds=10,
                            random_state=1)
    
    scores = []
    for k, (train, test) in enumerate(kfold):
        pipe_lr.fit(X_train[train], y_train[train])
        score = pipe_lr.score(X_train[test], y_train[test])
        scores.append(score)
        print('Fold: %s, Class dist.: %s, Acc: %.3f' % (k+1, np.bincount(y_train[train]), score))
        
    print('\nCV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
    



    使用SKlearn实现分层K折交叉验证:


    from sklearn.cross_validation import cross_val_score
    
    scores = cross_val_score(estimator=pipe_lr, 
                             X=X_train, 
                             y=y_train, 
                             cv=10,
                             n_jobs=1)
    print('CV accuracy scores: %s' % scores)
    print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
    



    cross_val_score方法特点:将不同分块的性能评估分布到多个CPU上进行处理。

    n_jobs:CPU个数,-1为选择全部CPU







    展开全文
  • 斯坦福大学机器学习——交叉验证(Cross Validation)

    万次阅读 多人点赞 2015-03-07 16:25:12
    交叉验证是一种模型选择方法,其将样本的一部分用于训练,另一...而机器学习/数据挖掘则注重经验,如交叉验证,就是通过不同模型在同一样本上的误差表现好坏,来选择适合这一样本的模型,而不去纠结理论上是否严谨。
  • 机器学习好伙伴之scikit-learn的使用——K交叉验证什么是K交叉验证sklearn中K交叉验证的实现应用示例 在进行数学建模的时候就听过k交叉验证,要是我当时像现在一样强就好了! 什么是K交叉验证 K交叉...
  • 机器学习交叉验证

    千次阅读 2019-01-30 16:30:56
    交叉验证(Cross Validation) 是在机器学习建立模型和验证模型参数时常用的方法。顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集。用训练集来训练模型,测试集来评估模型的...
  • 机器学习 | 交叉验证

    2019-06-27 17:46:31
    3 Python实现交叉验证3.1 简单交叉验证3.2 S折交叉验证3.3 留一交叉验证4 参考 1 什么是交叉验证? 1.1 思想 基本思想: 将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价...
  • k-重交叉验证(k-fold crossValidation): 在机器学习中,将数据集A 分为训练集(training set)B和测试集(testset)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,...
  • 文章目录1 简单的交叉验证2 k交叉验证 k-fold cross validation3 留一法 leave-one-out cross validation 针对经验风险最小化算法的过拟合的问题,给出交叉验证的方法,这个方法在做分类问题时很常用: 1 简单的...
  • 假设将两种机器学习模型K Nearest Neighbours (KNN) or Support Vector Machine (SVM)应用于MNIST数据集上,为了比较两种模型的分类性能,可使用交叉验证方法,这可以帮助选择在MNIST数据集中表现较好的一种模型。...
  • 交叉验证 部分参考:模型选择中的交叉验证方法综述,山西大学,范永东(这是一篇硕士论文,原文内容有点啰嗦,存在一些错误。本文对其交叉验证部分校对整理) 交叉验证是一种通过估计模型的泛化误差,从而进行模型...
  • 机器学习】Stacking与K交叉验证

    千次阅读 2019-02-21 15:03:40
      Stacking并不是简单地对个体学习器的结果做简单逻辑处理,而是先从初始数据集训练出初级学习器,将初级学习器的输出当成特征,初始样本的标记仍被当作标记,由此生成一个新数据集用于训练学习器。 ...
  • k-重交叉验证

    2019-06-18 11:26:02
    k-重交叉验证(k-fold crossValidation): 在机器学习中,将数据集A 分为训练集(training set)B和测试集(testset)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,...
  • K交叉验证原理及其python实现

    千次阅读 2019-09-10 19:22:38
    K交叉验证用于模型调优,所有的数据都被用来训练,会导致过拟合,K交叉验证可以缓解过拟合。 将数据分为k组,每次从训练集中,抽取出k份中的一份数据作为验证集,剩余数据作为测试集。测试结果采用k组数据的...
  • 交叉验证(Cross validation),交叉验证用于防止模型过于复杂而引起的过拟合.有时亦称循环估计, 是一种统计学上将数据...交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力(generaliz...
  • 1. 交叉验证交叉验证(Cross-validation)主要用于建模应用中,例如PCR 、...2. k交叉验证就是将数据集A随机分为k个包,每次将其中一个包作为测试集,剩下k-1个包作为训练集进行训练。 纽约大学博士Seymour Geiss...
  • K交叉验证法原理及python实现

    万次阅读 多人点赞 2018-01-02 17:14:28
    在训练数据的过程或者参加数据比赛的时候,常常会遇到数据量不够大的情况,在一次比赛过程我学到一个小技巧—K交叉验证法(k-fold CrossValidation),下面和大家分享一下。1 变形前的K折在遇到K交叉验证之前,...
  • 想必做机器学习的,都不同程度的用过交叉验证(cross validation),通常使用交叉验证评估一个机器学习模型的表现。交叉验证有很长的历史,但交叉验证的研究有不少待解决的问题。就交叉验证K值选取来讲,可能一部分...
  • 感知器的K交叉验证K=5) 逻辑回归 逻辑回归的K交叉验证K=5) AUC模型评估 支持向量机(SVM) K交叉验证K=3) Kernel SVM(使用核方法的支持向量机) K交叉验证K=3) 参数网格搜索 使用三维...
1 2 3 4 5 ... 20
收藏数 19,005
精华内容 7,602
关键字:

k重交叉验证机器学习