折交叉验证_k折交叉验证 - CSDN
精华内容
参与话题
  • K-折交叉验证算法

    千次阅读 2017-12-09 16:55:42
    当给定数据集D对于简单的训练/测试或训练/验证分割而言太小难以产生泛化误差的准确性时(因为在小的测试集上L可能具有过高的方差),K-折交叉验证算法可以用于估计学习算法A的泛化误差。数据集D包含的元素是抽象的...

    当给定数据集D对于简单的训练/测试或训练/验证分割而言太小难以产生泛化误差的准确性时(因为在小的测试集上L可能具有过高的方差),K-折交叉验证算法可以用于估计学习算法A的泛化误差。数据集D包含的元素是抽象的样本z(i)(对于第i个样本),在监督学习的情况代表(输入,目标)对z(i)=(x(i),y(i)),或者无监督学习的情况下仅用于输入z(i)=x(i)。该算法返回D中每个示例的误差向量e,其均值是估计的泛化误差。单个样本上的误差可用于计算平均值周围的置信区间。虽然这些置信区间在使用交叉验证之后不能很好地证明,但是通常的做法是只有当算法A误差的置信区间低于并且不与算法B的置信区间相交时,我们才声明算法A比算法B更好。


    /*************************************************************************************************************************************************************************************/

    Define KFoldxv(D,A,L,k);

    Require:D为给定数据集,其中元素为z(i)

    Require:A为学习算法,可视为一个函数(使用数据集作为输入,输出一个学好的函数)

    Require:L为损失函数,可视为来自学好的函数f,将样本z(i)∈D映射到R中标量的函数

    Require:k为折数

    将D分为k个互斥子集Di,它们的并集为D(互斥:A∩B为空)

    for i from 1 to k do

    fi=A(D\Di)      (差集,元素包含于D但不包含于Di)

    for z(i) in Dido

    ej=L(fi,z(j))

    end for

    end for

    Return e

    /*************************************************************************************************************************************************************************************/

    展开全文
  • 折交叉验证

    千次阅读 2019-06-22 16:27:21
    交叉验证主要分成以下几类:1)k-folder cross-validation:k个子集,每个子集均做一次测试集,其余的作为训练集。交叉验证重复k次,每次选择一个子集作为测试集,并将k次的平均交叉验证识别正确率作为结果。优点:...

    交叉验证主要分成以下几类:
    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折交叉验证(例如10次10折交叉验证),再求其均值,作为对算法准确性的估计。
    之所以选择将数据集分为10份,是因为通过利用大量数据集、使用不同学习技术进行的大量试验,表明10折是获得最好误差估计的恰当选择,而且也有一些理论根据可以证明这一点。但这并非最终诊断,争议仍然存在。而且似乎5折或者20折与10折所得出的结果也相差无几。

    展开全文
  • 深度学习--十折交叉验证

    万次阅读 2019-03-22 07:02:34
    用scikit-learn来评价模型质量,为了更好地挑拣出结果的差异,采用了十折交叉验证(10-fold cross validation)方法。 本程序在输入层和第一个隐含层之间加入20%Dropout 采用十折交叉验证的方法进行测试。 # ...

    用scikit-learn来评价模型质量,为了更好地挑拣出结果的差异,采用了十折交叉验证(10-fold cross validation)方法。

    本程序在输入层和第一个隐含层之间加入20%Dropout

    采用十折交叉验证的方法进行测试。

    
        # dropout in the input layer with weight constraint
        def create_model1():
            # create model
            model = Sequential()
            model.add(Dropout(0.2, input_shape=(60,)))
            model.add(Dense(60, init='normal', activation='relu', W_constraint=maxnorm(3)))
            model.add(Dense(30, init='normal', activation='relu', W_constraint=maxnorm(3)))
            model.add(Dense(1, init='normal', activation='sigmoid'))
            # Compile model
            sgd = SGD(lr=0.1, momentum=0.9, decay=0.0, nesterov=False)
            model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['accuracy'])
            return model
     
        numpy.random.seed(seed)
        estimators = []
        estimators.append(('standardize', StandardScaler()))
        estimators.append(('mlp', KerasClassifier(build_fn=create_model1, nb_epoch=300, batch_size=16, verbose=0)))
        pipeline = Pipeline(estimators)
        kfold = StratifiedKFold(y=encoded_Y, n_folds=10, shuffle=True, random_state=seed)
        results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
        print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

    Pineline

    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import StandardScaler
    num_pipeline = Pipeline([
    	('imputer', Imputer(strategy="median")),
    	('attribs_adder', CombinedAttributesAdder()),
    	('std_scaler', StandardScaler()),
    ])
    housing_num_tr = num_pipeline.fit_transform(housing_num)

    Pipeline构造器接受(name, transform) tuple的列表作为参数。按顺序执行列表中的transform,完成数据预处理

    StratifiedKFold

    StratifiedKFold用法类似Kfold,但是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同

    sklearn.model_selection.StratifiedKFold(n_splits=3, shuffle=False, random_state=None) 
    

    
    import numpy as np 
    from sklearn.model_selection import KFold,StratifiedKFold
     
    X=np.array([
        [1,2,3,4],
        [11,12,13,14],
        [21,22,23,24],
        [31,32,33,34],
        [41,42,43,44],
        [51,52,53,54],
        [61,62,63,64],
        [71,72,73,74]
    ])
     
    y=np.array([1,1,0,0,1,1,0,0])
    floder = KFold(n_splits=4,random_state=0,shuffle=False)
    sfolder = StratifiedKFold(n_splits=4,random_state=0,shuffle=False)
     
    for train, test in sfolder.split(X,y):
        print('Train: %s | test: %s' % (train, test))
        print(" ")
     
    for train, test in floder.split(X,y):
        print('Train: %s | test: %s' % (train, test))
    
    #RESULT
    Train: [1 3 4 5 6 7] | test: [0 2]
     
    Train: [0 2 4 5 6 7] | test: [1 3]
     
    Train: [0 1 2 3 5 7] | test: [4 6]
     
    Train: [0 1 2 3 4 6] | test: [5 7]
     
    Train: [2 3 4 5 6 7] | test: [0 1]
     
    Train: [0 1 4 5 6 7] | test: [2 3]
     
    Train: [0 1 2 3 6 7] | test: [4 5]
     
    Train: [0 1 2 3 4 5] | test: [6 7]
    
    

    cross_val_score:

    不同的训练集、测试集分割的方法导致其准确率不同
    交叉验证的基本思想是:将数据集进行一系列分割,生成一组不同的训练测试集,然后分别训练模型并计算测试准确率,最后对结果进行平均处理。这样来有效降低测试准确率的差异。
    

    使用交叉验证的建议

    1. K=10是一个一般的建议

    2. 如果对于分类问题,应该使用分层抽样(stratified sampling)来生成数据,保证正负例的比例在训练集和测试集中的比例相同

    
    from sklearn.cross_validation import cross_val_score
    
    knn = KNeighborsClassifier(n_neighbors=5)
    # 这里的cross_val_score将交叉验证的整个过程连接起来,不用再进行手动的分割数据
    # cv参数用于规定将原始数据分成多少份
    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
    print(scores)
    print(scores.mean())#输出结果平均值
    

    参考网页:

    https://blog.csdn.net/u010159842/article/details/54138157

    cross_val_score交叉验证及其用于参数选择、模型选择、特征选择

    https://blog.csdn.net/u012735708/article/details/82258615

    展开全文
  • 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%的数据来训练分类器。
     



    展开全文
  • K-折交叉验证(k-fold crossValidation)

    万次阅读 2017-12-25 18:41:57
    k-重交叉验证(k-fold crossValidation): 定义:  在机器学习中,将数据集A分为训练集B(training set)和测试集C(test set),在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,...
  • 10折交叉验证深入理解

    万次阅读 2018-12-25 15:22:08
    交叉验证(Cross Validation),有的时候也称作循环估计(Rotation Estimation),是一种统计学上将数据样本切割成较小子集的实用方法,该理论是由Seymour Geisser提出的。 在给定的建模样本中,拿出大部分样本进行...
  • K折交叉验证解释

    千次阅读 2019-08-01 09:08:55
    所谓K折交叉验证,就是将数据集等比例划分成K份,以其中的一份作为测试数据,其他的K-1份数据作为训练数据。然后,这样算是一次实验,而K折交叉验证只有实验K次才算完成完整的一次,也就是说交叉验证实际是把实验...
  • k折交叉验证

    万次阅读 2018-06-14 19:21:04
    一般情况将K折交叉验证用于模型调优,找到使得模型泛化性能最优的超参值。,找到后,在全部训练集上重新训练模型,并使用独立测试集对模型性能做出最终评价。 K折交叉验证使用了无重复抽样技术的好处:每次迭代过程...
  • 交叉验证(简单交叉验证、k折交叉验证、留一法)

    万次阅读 多人点赞 2016-05-11 11:57:50
    文章介绍了三种交叉验证的方法,在做分类时很常用。
  • 之前使用train_test_split函数将数据集随机划分为训练集和测试集,然后使用score方法评估...标准k折交叉检验:回归问题默认使用。根据用户指定的k划分数据,经历k次训练测试,每次一折当测试集其它的是训练集。 分层
  • K折交叉验证的要点:(文字版)如何实现K折交叉验证(图片版)如何实现K折交叉验证(matlab版)为啥我们需要分层K折交叉验证?如何实现分层k折交叉验证如何实现分层k折交叉验证(文字版)如何实现分层k折交叉验证(图片...
  • K折交叉验证R语言实现

    万次阅读 热门讨论 2018-01-23 17:09:47
    k-折交叉验证k-折交叉验证(K-fold cross-validation)是交叉验证方法里一种。它是指将样本集分为k份,其中k-1份作为训练数据集,而另外的1份作为验证数据集。用验证集来验证所得分类器或者模型的错误率。一般需要...
  • K折交叉验证原理及其python实现

    千次阅读 2019-07-17 15:15:54
    K折交叉验证用于模型调优,所有的数据都被用来训练,会导致过拟合,K折交叉验证可以缓解过拟合。 将数据分为k组,每次从训练集中,抽取出k份中的一份数据作为验证集,剩余数据作为测试集。测试结果采用k组数据的...
  • pytorch - K折交叉验证过程说明及实现

    千次阅读 热门讨论 2020-02-22 19:09:48
    以200条数据,十折交叉验证为例子,十折也就是将数据分成10组,进行10组训练,每组用于测试的数据为:数据总条数/组数,即每组20条用于valid,180条用于train,每次valid的都是不同的。 (1)将200条数据,分成按照...
  • R语言k折交叉验证

    千次阅读 2019-06-18 15:57:33
    “机器学习中需要把数据分为训练集和测试集,因此如何划分训练集和测试集就成为...K折交叉验证(k-fold cross-validation)首先将所有数据分割成K个子样本,不重复的选取其中一个子样本作为测试集,其他K-1个样本...
  • R语言逻辑回归、ROC曲线和十折交叉验证

    万次阅读 多人点赞 2017-02-27 15:49:35
    自己整理编写的逻辑回归模板,作为学习笔记记录分享。数据集用的是14个自变量Xi,一个因变量Y的australian数据集。 1. 测试集和训练集3、7分组 australian ("australian.csv",as.is = T,sep=",",header=TRUE) ...
  • K折交叉验证代码示例

    千次阅读 2018-11-20 17:26:59
    Stratified k-fold 按照百分比划分数据。 import pandas as pd import numpy as np import jieba from util import * from sklearn.feature_extraction.text import CountVectorizer, HashingVectorizer, ...
  • 折交叉验证程序

    2018-12-06 19:57:23
    用贝叶斯公式进行具体计算验证在已有条件下是否去打球。 (Calculate average decision accurate for Table 1 using Ten-fold-cross validation.)
  • 主要介绍了Python实现K折交叉验证法的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • K折交叉验证

    千次阅读 2018-11-29 10:57:25
    写在开头:最近参加了DF的数据竞赛,发现了交叉验证的强大之处。计算时间会长很多但是真的可以把准确率提高很多!这里有对交叉验证很好的解释:知乎专栏:Cross-Validation详解 总结 :为什么要使用交叉验证? ...
1 2 3 4 5 ... 20
收藏数 13,703
精华内容 5,481
关键字:

折交叉验证