精华内容
下载资源
问答
  • 技巧 | 交叉验证
    2021-10-25 01:19:13

    交叉验证(Cross Validation,CV)是一种常见的模型评估方法。简言之,就是将样本分为训练集(tranning set)和测试集(test set),训练集用来估计模型参数,测试集用来评价模型精度。交叉验证有多种类型,本篇主要介绍以下三种:

    • 留一法交叉验证

    • k折交叉验证

    • 重复k折交叉验证

    1 留一法交叉验证

    假设样本数为,留一法交叉验证(Least-One-Out Cross-Validation,LOOCV),就是每次只留下一个样本作为测试集,剩余个样本作为训练集,重复次。

    步骤如下:

    Step 1:从个样本中拿出个样本来估计模型参数,这些样本称为训练集,剩余一个样本为测试集;
    Step 2:使用上个步骤估计出的模型参数预测测试集样本的因变量取值;
    Step 3:重复上述两个步骤,直至所有样本都有且仅有一次为测试集样本;
    Step 4:记测试集的因变量预测值构成的向量为pred,对应的因变量真实值为obs
    Step 5:使用predobs两个向量计算R2、均方根误差(RMSE)等模型评价指标。

    以线性模型为例。

    以下模型的R2 = 0.8264:

    model <- lm(mpg ~ wt + qsec, data = mtcars)
    ## R2 = 0.8264

    使用留一法交叉验证计算模型的R2。

    • 生成向量pred

    n = dim(mtcars)[1]
    pred = 1:n
    
    for(i in c(1:n)) {
      
      mod <- lm(mpg ~ wt + qsec, data = mtcars[-i,])
      pred[i] = predict(mod, mtcars[i,])
    }
    • 计算R2

    前面的推文已经介绍了R2(线性回归(一)——模型表达式和输出结果

    R2_CV <- function(pred, obs) {
      
      err <- sum((pred - obs)^2)
      ctr <- sum((mean(obs) - obs)^2)
      R2_CV = 1 - err/ctr
      return(R2_CV)
    }
    
    R2_CV(pred, mtcars$mpg)
    ## [1] 0.7785627

    得到的R2 = 0.7785627。下面使用caret工具包中的R2()函数进行验证。

    R2()函数提供了两种计算R2的方法,一种是form = "corr"(默认值),即将R2视为预测值和真实值相关系数的平方,另一种是form = "traditional",即上面列出的计算公式。

    library(caret)
    R2(pred, mtcars$mpg)
    ## [1] 0.7800446
    cor(pred, mtcars$mpg)^2
    ## [1] 0.7800446
    
    R2(pred, mtcars$mpg, form = "traditional")
    ## [1] 0.7785627
    • 可以看出,使用form = "traditional"与自定义的R2_CV()函数计算的结果相同。

    2 k折交叉验证

    k折交叉验证(k-Folder Cross-Validation),是将个样本随机分为等份,将其中份作为训练集,剩余一份作为测试集,并不断重复,直至每份都有且仅有一次作为过测试集。当时,k折交叉验证等价于留一法交叉验证。最常用的是10折交叉验证。

    自定义将样本随机分为k等份的函数group_fun()

    group_fun <- function(data, seed, k = 10) {
      
      set.seed(seed)
      n = dim(data)[1]
      
      order_rand <- sample(1:n, n, replace = F)
      group_rand <- order_rand %% k + 1
      
      return(group_rand)
    }
    • data:包含样本变量的数据框;

    • seed:随机数种子;

    • k:等分的份数,默认值为10。

    检测自定义函数的效果:

    group_fun(mtcars, 123)
    ##  [1]  2  6 10  5  4  1  9  3  2  6  1 10  4  1 10  9  9  8  8  3  7  8  5  2  5
    ## [26]  2  6  4  7  3  3  7
    
    group_fun(mtcars, 1024, k = 5)
    ##  [1] 2 3 3 4 1 5 5 2 3 4 1 2 5 2 1 3 3 1 5 3 4 3 4 5 2 4 5 2 1 2 1 4
    • 返回的数字表示对应分组的编号。

    10折交叉验证:

    k = 10
    x <- group_fun(mtcars, 1024, k = k)
    pred <- NULL
    obs <- NULL
    
    for(i in 1:k) {
      
      mod <- lm(mpg ~ wt + qsec, data = mtcars[x != i,])
      pred = c(pred, predict(mod, mtcars[x == i,]))
      obs <- c(obs, mtcars[x == i,]$mpg)
    }
    
    R2_CV(pred, obs)
    ## [1] 0.7871856

    留一法交叉验证得到的R2是唯一的,而k折交叉验证由于分组过程存在随机性,因此计算的R2是不固定的。

    以下列举了上述代码不同随机数种子对应的计算结果:

    seedR2
    40.7837388
    160.7888558
    640.7782393
    1280.778737
    2560.7904926
    10240.7871856
    • 可以看出,虽然不同随机数种子对应的计算结果不同,但总体还是比较稳定的。

    3 重复k折交叉验证

    重复k折交叉验证(Repeated k-Fold Cross-Validation )是对样本进行多次随机分组,每次分组都进行一次k折交叉验证,再将多次计算的结果取平均值,以消除分组的偶然性对计算结果可能造成的偏差。

    set.seed(1024)
    rp = 10
    seeds = runif(rp, 0, 10000)
    r2 <- 1:rp
    • rp:重复次数;

    • seeds:储存随机数种子的向量,长度为rp;

    • r2:储存每次R2的计算结果,长度为rp。

    for(j in 1:rp) {
      
      k = 10
      x <- group_fun(mtcars, seeds[j], k = k)
      pred <- NULL
      obs <- NULL
      
      for(i in 1:k) {
        
        mod <- lm(mpg ~ wt + qsec, data = mtcars[x != i,])
        pred = c(pred, predict(mod, mtcars[x == i,]))
        obs <- c(obs, mtcars[x == i,]$mpg)
      }
      
      r2[j] = R2_CV(pred, obs)
    }
    
    mean(r2)
    # [1] 0.7802496
    seedR2
    40.7806959
    160.7791301
    640.7643035
    1280.7826845
    2560.7762842
    10240.7802496

    4 总结

    • 留一法只适用于样本数较小的情况;

    • k折交叉验证可用于样本量较大的情况。

    更多相关内容
  • 主要介绍了Python实现K折交叉验证法的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 交叉验证实战

    千次阅读 2022-04-02 16:02:36
    交叉验证将拆分与评价合并执行保证案例顺序的随机性同时使用多个评价指标使用交互验证后的模型进行预测 1.简单交叉验证 简单交叉验证方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集...

    1.简单交叉验证

    简单交叉验证方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集(例如,70%的数据为训练集,30%的数据为测试集);然后用训练集在各种条件下(例如,不同的参数个数)训练模型,从而得到不同的模型;在测试集上评价各个模型的测试误差,选出测试误差最小的模型。

    2.S折交叉验证

    应用最多的是S折交叉验证(S-fold cross validation),方法如下:首先随机地将已给数据切分为S个互不相交、大小相同的子集;然后利用S-1个子集的数据训练模型,利用余下的子集测试模型;将这一过程对可能的S种选择重复进行;最后选出S 次评测中平均测试误差最小的模型。

    3.留一交叉验证

    S折交叉验证的特殊情形是S = N,称为留一交叉验证(leave-one-out crossvalidation),往往在数据缺乏的情况下使用。这里,N是给定数据集的容量。

    在这里插入图片描述

    将拆分与评价合并执行

    sklearn.model_selection.cross_val_score(

    estimator :用于拟合数据的估计器对象名称 : array-like,用于拟合模型的数据阵

    y = None : array-like,有监督模型使用的因变量

    groups = None : array-like,形如(n_samples,),样本拆分时使用的分组标签scoring = None : string,callable or None,模型评分的计算方法

    cv = None : int,设定交互验证时的样本拆分策略

       None,使用默认的3组拆分
    
       integer,设定具体的拆分组数
    
       object / iterable 用于设定拆分
    
       n_jobs = 1,verbose = 0,fit _params = Nonepre_dispatch = '2*n_jobs '
    

    )返回:每轮模型对应评分的数组

    #导入波士顿房价数据集
    from sklearn.datasets import load_boston
    boston = load_boston()
    
    #导入线性回归模型
    from sklearn.linear_model import LinearRegression
    reg = LinearRegression()
    
    #将拆分与评价合并执行
    from sklearn.model_selection import cross_val_score
    scores = cross_val_score(reg,boston.data,boston.target,cv=10)
    scores
    
    array([ 0.73376082,  0.4730725 , -1.00631454,  0.64113984,  0.54766046,
            0.73640292,  0.37828386, -0.12922703, -0.76843243,  0.4189435 ])
    
    scores.mean(),scores.std()
    
    (0.20252899006056552, 0.5952960169512287)
    
    scores = cross_val_score(reg,boston.data,boston.target,
                            scoring = 'explained_variance',cv=10)
    scores
    
    array([ 0.74784412,  0.5381936 , -0.80757662,  0.66844779,  0.5586898 ,
            0.74128804,  0.41981565, -0.11666214, -0.44561819,  0.42197365])
    
    scores.mean()
    
    0.2726395697941396
    

    保证案例顺序的随机性

    样本中案例顺序如果非随机,将会对模型验证带来严重的影响。

    KFold等函数有一个内置的参数shuffle,可以要求在拆分数据前将数据索引随机排序(但该参数默认为False ) 。

    cross_val_score等函数无此参数,因此必要时应当先对数据进行随机排序。

    #对数据进行随机重排,保证拆分的均匀性
    import numpy as np
    X, y = boston.data,boston.target
    indices = np.arange(y.shape[0])
    np.random.shuffle(indices)
    X, y = X[indices],y[indices]
    
    from sklearn.linear_model import LinearRegression
    reg = LinearRegression()
    from sklearn.model_selection import cross_val_score
    scores = cross_val_score(reg,X,y,cv=10)
    scores
    
    array([0.52652498, 0.64479681, 0.71332622, 0.77957089, 0.72579498,
           0.72621903, 0.75031061, 0.82087958, 0.60974587, 0.69110699])
    
    scores.mean(),scores.std()
    
    (0.698827597597641, 0.08145985882932301)
    

    同时使用多个评价指标

    cross_validate函数使用的参数基本和cross_val_score相同,但是功能上有以下扩展:

    可以指定多个指标对模型进行评估。
    
    除测试集得分之外,还会返回一个包含训练得分,拟合次数,得分次数的字典。
    

    在这里插入图片描述

    #同时使用多个指标评价
    from sklearn.model_selection import cross_validate
    
    scoring = ['r2','explained_variance']
    scores = cross_validate(reg,X,y,cv=10,scoring = scoring,return_train_score = False)
    scores
    
    {'fit_time': array([0.0009985 , 0.00099707, 0.        , 0.00099754, 0.        ,
            0.00099707, 0.00099802, 0.00099802, 0.0009973 , 0.00099707]),
     'score_time': array([0.00199246, 0.00099778, 0.00099754, 0.00099707, 0.0009973 ,
            0.00099945, 0.00099349, 0.00099659, 0.00100994, 0.001019  ]),
     'test_r2': array([0.52652498, 0.64479681, 0.71332622, 0.77957089, 0.72579498,
            0.72621903, 0.75031061, 0.82087958, 0.60974587, 0.69110699]),
     'test_explained_variance': array([0.52675173, 0.64615136, 0.71723182, 0.78034103, 0.75457833,
            0.7437355 , 0.75721027, 0.83083647, 0.61009188, 0.69155294])}
    
    scores['test_r2'].mean()
    
    0.698827597597641
    

    使用交互验证后的模型进行预测

    sklearn.model_selection.cross_val_predict(

    estimator, x, y = None,groups = None, cv = Nonen_jobs = 1, verbose = 0, fit_params = None

    pre_dispatch = ‘2*n_jobs’

    method = ‘predict’ :指明估计器使用的预测命令

    method = 'predict _proba’时,各列按照升序对应各个类别

    )返回: ndarray,模型对应的各案例预测值

    from sklearn.model_selection import cross_val_predict
    pred = cross_val_predict(reg,X,y,cv=10)
    pred[:10]
    
    array([22.86797177, 19.21452593, 35.87564631, 15.69494715, 16.97841578,
           19.70808991, 24.73419866, 21.24975714, 20.34802558, 24.82573974])
    
    from sklearn.metrics import r2_score
    r2_score(y,pred)
    
    0.7143750140718722
    
    
    
    展开全文
  • Stata: 交叉验证简介

    千次阅读 2019-10-30 00:43:52
    作者:贺旭 (中央财经大学) Stata连享会   计量专题 || 精品课程 || 简书推文 || 公众号合集 ...本文介绍交叉验证方法,然后以 kfoldclass 命令和 crossfold 为范例使读者更深入的了解该方法。 ...

    作者:贺旭 (中央财经大学)

    Stata连享会   计量专题 || 精品课程 || 简书推文 || 公众号合集
    在这里插入图片描述

    连享会计量方法专题……

    本文介绍交叉验证方法,然后以 kfoldclass 命令和 crossfold 为范例使读者更深入的了解该方法。

    该方法在 RDD 分析中确定最优带宽时非常有用。

    1 交叉验证的介绍

    1.1 交叉验证的含义是什么?

    交叉验证,顾名思义,就是重复的使用数据。具体来说,就是把样本数据切成 K 份,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。

    1.2 交叉验证有什么作用?

    第一,交叉验证可以多次的使用数据,有助于解决数据补充足的问题;

    第二,交叉验证有助于防止过度拟合(模型样本内拟合的很好,样本外却很糟糕);

    第三,用交叉验证来来进行模型的评价与选择。

    1.3 常用的交叉验证有哪些方法?

    K 折叠交叉验证 (K-fold Cross Validation)

    将所有样本分割为大小相等的 K 组,每次取其中的一份为测试集,其他的为训练集,最后根据测试结果来评价模型。

    例如:将数据集粗略地分为比较均等不相交的 10 份,然后取其中的 1 份进行测试,另外的 9 份进行训练,然后求得预测误差的平均值作为最终的评价。如图:
    在这里插入图片描述

    留一法 (Leave One Out)

    如果 K 的值为样本的个数,也就是每次取 1 个样本作为测试集,剩下的为训练集来训练模型,最后根据测试结果来评价模型。

    留 P 法 (Leave P Out)

    它从完整的样本集中每次取 P 个样本作为测试集,剩下的作为训练集来训练模型,最后根据测试结果来评价模型。

    连享会计量方法专题……

    2. 范例:运用 crossfold 命令对线性回归模型等模型进行K折叠交叉验证

    命令 crossfold 可以对线性回归模型、分位数回归模型等多种模型进行交叉验证,,并且报告交叉验证的 MAERMSEpsuedo-R-squared(因变量预测值与实测值的相关系数的平方)等指标,用以评价模型。

    2.1 crossfold 命令的语法格式

    其语法格式为:

    crossfold model [model_if] [model_in] [model_weight], 
            [eif()] [ein()] [eweight(varname)] 
            [stub(string)] [k(value)] [loud]
            [mae] [r2]
            [model_options]
    

    其中:

    • model 为要估计的模型;
    • eweight 在计算模型的预测指标时,赋予各预测误差值得的权重;
    • stub() 将估计的结果保存并起一个名称,放入括号中;
    • k() 设置交叉验证的次数;
    • loud 将分为K组的每组估计结果显示在窗口中;
    • mae 显示交叉验证的 MAE,如果不选,默认显示RMSE;
    • r2 显示交叉验证的 psuedo-R-squared,如果不选,默认显示RMSE;

    2.2 实例演示

    导入数据后,做一个线性回归,并报告 MAE

    . sysuse nlsw88
    . crossfold reg wage union, mae
    

    报告的结果显示为

                 |       MAE 
    -------------+-----------
            est1 |  3.173351 
            est2 |  3.098101 
            est3 |  3.112503 
            est4 |  2.997055 
            est5 |  2.968615 
    

    该结果同时会以矩阵储存在 r(stub) 中,stub为命令stub中所起的名字,如果没有,默认储存在 r(est) 中。

    3. 范例:运用 kfoldclass 命令对二元结果模型进行交叉验证

    命令 kfoldclass 可以在 Stata 中对模型进行K折叠交叉验证 (K-fold Cross Validation),但是其使用有两个限制:其一,是该命令只适用于用于二结果模型(比如 Logit 模型等);其二,是在该命令中添加的模型选项前,需要确认该 Stata 已经安装有关模型模块。

    3.1 kfoldclass 命令的语法格式

    其语法格式为:

    kfoldclass depvar indepvars [if] [in] [weight] , model(str) [k(#) cutoff(#) save figure model_options]
    

    其中:

    • depvar 为被解释变量;
    • indepvars 为解释变量;
    • model 为被用来进行交叉验证的的模型,包括 logit, probit, randomforest, boost, -
    • svmachines(使用前需要确保这些模块都已经安装);
    • k 为将样本分为多少组进行交叉验证,默认值为5;
    • cutoff(#) 为在 classification tables(分类表)判断预测结果为正的概率的阈值,阈值默认值为0.5。比如:模型拟合值为0.7,若阈值设置为0.6,因为0.7 > 0.6则将预测结果为正。
    • save 意思是将模型拟合的值保存在数据表格中,包括两个结果,第一个是结果变量名为 full,其将所有样本数据来计算模型参数,然后再用所有样本数据计算拟合值;第二个结果变量名为 test,将用训练集来计算模型参数,用计算出的模型参数来在测试集中计算拟合值。
    • figure 选择该选项可画出全部数据和测试数据的 ROC 曲线,如果 ROC 曲线越凸向 (0,1) 点,则说明模型的 ACU 值越大,预测效果越好,关于 ROC 曲线和 ACU 值的一个通俗的介绍参考 《 简单梳理对AUC的理解 》《 AUC,ROC我看到的最透彻的讲解 》

    3.2 实例演示

    首先导入数据然后按照 kfoldclass 的语法格式 输入命令

     . webuse lbw, clear 
     . kfoldclass low age lwt i.race smoke ptl ht ui, model(logit) k(5) save fig
    

    其中,模型选择的是 logit 模型,将数据分为5组,保存拟合值,并画出 ROC 曲线。

    首先,呈现 ROC 曲线,如图:

    在这里插入图片描述

    如果 ROC 越偏向左上角,这说明模型预测效果越好,同时图片下方还计算了 AUC 的值(也就是横坐标从 0 到 1 曲线下方的面积),全部样本的AUC值为 0.7462,测试样本的 AUC 值为 0.6716。

    同时还会显示以下表格:

    表格 1

    Classification Table for Full Data:
                  -------- True --------
    Classified |         D            ~D  |      Total
    -----------+--------------------------+-----------
         +     |        21            12  |         33
         -     |        38           118  |        156
    -----------+--------------------------+-----------
       Total   |        59           130  |        189
    

    这个表格是用全部样本作为训练集,然后用全部样本作为测试集,最后的统计结果。其中:纵坐标 + 表示拟合值等于 1 的数目,- 表示拟合值等于 0 的数目;横坐标 D 代表真实等于 1 的数目 ,~D 代表真实值等于 0 的数目。

    表格 2

    Classification Table for Test Data:
                  -------- True --------
    Classified |         D            ~D  |      Total
    -----------+--------------------------+-----------
         +     |        19            19  |         38
         -     |        40           111  |        151
    -----------+--------------------------+-----------
       Total   |        59           130  |        189
    

    这个表格表示的是:将样本分为 5 组,分别用其中一组为测试集集,然后用剩下的所有组的样本作为训练集,然后根据设置的阈值判断拟合的结果,这样循环 5 次使每一组都做过一次测试集。其中:纵坐标 + 表示拟合值等于 1 的数目,- 表示拟合值等于 0 的数目;横坐标 D 代表真实等于 1 的数目 ,~D 代表真实值等于 0 的数目。

    表格 3

    Classified + if predicted Pr(D) >= .5
    True D defined as  != 0
                                                Full         Test
    ----------------------------------------------------------------
    Sensitivity                     Pr( +| D)   35.59%       32.20%
    Specificity                     Pr( -|~D)   90.77%       85.38%
    Positive predictive value       Pr( D| +)   63.64%       50.00%
    Negative predictive value       Pr(~D| -)   75.64%       73.51%
    ----------------------------------------------------------------
    False + rate for true ~D        Pr( +|~D)    9.23%       14.62%
    False - rate for true D         Pr( -| D)   64.41%       67.80%
    False + rate for classified +   Pr(~D| +)   36.36%       50.00%
    False - rate for classified -   Pr( D| -)   24.36%       26.49%
    ----------------------------------------------------------------
    Correctly classified                        73.54%       68.78%
    ----------------------------------------------------------------
    ROC area                                    0.7462       0.6716
    ----------------------------------------------------------------
    p-value for Full vs Test ROC areas                       0.0000
    ----------------------------------------------------------------
    

    具体说明如下:

    • 第一列为变量名;
    • 第二列为变量的含义:比如 Pr( +| D) 代表在真实值为 1 的集合中,预测也为 1 的样本数量占真实值为 1 集合的比率,Pr( -|~D) 代表真实值为 0 的集合中,预测为 0 的样本占真实值为 0 集合中样本数目的比率)
    • 第三列为用全部数据训练模型得到的变量值;
    • 第四列为用交叉验证法训练模型得到的变量值。

    Correctly classified 表示预测的准确率,也就是预测对的样本数占所有样本的数量。

    ROC area 表示 AUC 值,也就是 ROC 曲线下方的面积。

    对各种评价指标的计算及定义具体参考 [《 机器学习:准确率 (Precision)、召回率 (Recall)、F值(F-Measure)、ROC 曲线、PR 曲线 》]。

    4 文献推荐

    1. Efron B , Gong G . A Leisurely Look at the Bootstrap, the Jackknife, and Cross-Validation[J]. The American Statistician, 1983, 37(1):36-48. [PDF]
    2. Arlot S , Celisse A . A survey of cross-validation procedures for model selection[J]. Statistics Surveys, 2009, 4(2010):40-79. [PDF]
    3. Zhang Y , Yang Y . Cross-validation for selecting a model selection procedure[J]. Journal of Econometrics, 2015, 187(1):95-112. [PDF]

    参考资料

    关于我们

    • 「Stata 连享会」 由中山大学连玉君老师团队创办,定期分享实证分析经验, 公众号:StataChina
    • 公众号推文同步发布于 CSDN简书知乎Stata专栏。可在百度中搜索关键词 「Stata连享会」查看往期推文。
    • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。
    • 欢迎赐稿: 欢迎赐稿。录用稿件达 三篇 以上,即可 免费 获得一期 Stata 现场培训资格。
    • E-mail: StataChina@163.com
    • 往期推文:计量专题 || 精品课程 || 简书推文 || 公众号合集

    点击查看完整推文列表


    欢迎加入Stata连享会(公众号: StataChina)

    展开全文
  • [PearsonR, PearsonP, SpearmanR, SpearmanP, yhat, R2 ] = BenStuff_CrossValCorr( x,y, [MathMagic], [OmNullModel] ) 留一法交叉验证的简单线性回归输入变量: x, y:数据向量(x(n) 和 y(n) 对应一对观测值) ...
  • K折交叉验证法原理及python实现

    千次阅读 2021-03-03 15:40:56
    本文为原创文章,转载请注明出处!在训练数据的过程或者...1 变形前的K折在遇到K折交叉验证之前,往往使用的是简单交叉验证(hold -out cross validation),也就是从全部的训练数据 D中随机选择 d的样例作为训练集 t...

    本文为原创文章,转载请注明出处!

    在训练数据的过程或者参加数据比赛的时候,常常会遇到数据量不够大的情况,在一次比赛过程我学到一个小技巧—K折交叉验证法(k-fold CrossValidation),下面和大家分享一下。

    1 变形前的K折

    在遇到K折交叉验证之前,往往使用的是简单交叉验证(hold -out cross validation),也就是从全部的训练数据 D中随机选择 d的样例作为训练集 train,剩余的作为测试集 test(红色方框表示)。相信大家一定都非常熟悉,如果还不是很了解赶紧看看大牛Andrew Ng的课程吧。

    c99d34f278d26776f2c843e87199a367.png

    在这里,数据都只被所用了一次,没有被充分利用

    那么,怎样提高数据的利用率呢?

    2 K折就是讲数据集切分成K小块,验证集和测试集相互形成补集,循环交替

    纽约大学博士Seymour Geisser提出K折交叉验证法,具体步骤如下:

    将数据集D随机分为k个包(这里假定K=6)。

    9f26dea026f885d091d200159874b8f8.png

    每次将其中一个包作为测试集test,剩下k-1个包作为训练集train进行训练。

    1793eaf9d241f4feaa67d3d61d8597c4.png

    此时训练集train由D变成了K*D,

    最后计算k次求得的分类率的平均值,作为该模型或者假设函数的真实分类率。

    dd9599b3bfaaa49b464d30aaa8eb93e7.png

    它有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性

    你可能会问K选多少合适呢?

    根据情况和个人喜好调节,常用的K值有3,6,10等。

    3 python实现

    在scikit-learn中有CrossValidation的实现代码,地址:scikit-learn官网crossvalidation文档

    使用方法:

    >>>import numpy as np

    >>>from sklearn.model_selection import KFold

    >>>X = ["a", "b", "c", "d"]

    >>>kf = KFold(n_splits=2)

    >>>for train, test in kf.split(X):

    ... print("%s %s" % (train, test))

    [2 3] [0 1]

    [0 1] [2 3]

    展开全文
  • 10, random_state = 0) regressor.fit(x_train, y_train) y_pred = regressor.predict(x_test) print(y_pred) from sklearn.metrics import r2_score r2_score(y_test , y_pred) from sklearn.model_selection ...
  • 经常使用的是k-fold交叉验证,将数据划分k份,每次用一份做为验证集,其他的k-1份作为训练集来训练k个模型,然后对多个模型的结果取均值就是这个模型的输出。同时,我们还会看一下k的模型的具体输出值,看一下波动...
  • 1、机器学习算法对于整体的数据训练和拟合,以典型的多元线性回归的方式为例,通过设定拟合的最高次数,然后对比输出的曲线结果可以看出,随着拟合函数次数的增大,其拟合线性回归模型的R2的值在不断地增大,均方差...
  • 随机泊松分布矩阵 x 和向量 y 用泊松广义线性模型 [1] 拟合,估计拟合优度有两种情况: 1 没有交叉验证会导致高伪 R2 (pR2) 值2 交叉验证可提供正确的低 pR2 值 误导性的高 pR2 值和没有交叉验证的良好拟合是由于...
  • 交叉验证

    2020-01-19 20:48:50
    # scoring常用参数:r2,accuracy # 将数据分成不同的5组,分别计算他的得分(在这里是准确度) print ( scores ) # 选择参数 k_scores = [ ] k_loss = [ ] for k in range ( 1 , 31 ) : ...
  • sklearn中的交叉验证

    千次阅读 2018-12-14 10:55:19
    训练集、验证集和测试集这三个名词在机器学习领域极其常见,但很多人并不是特别清楚,尤其是后两个经常被人混用。 在有监督(supervise)的机器学习中,数据集常被分成2~3个,即:训练集(train set),验证集...
  • 交叉验证 方法思想:  CrossValidator将数据集划分为若干子集分别地进行训练和测试。如当k=3时,CrossValidator产生3个训练数据与测试数据对,每个数据对使用2/3的数据来训练,1/3的数据来测试。对于一组特定的...
  • 【机器学习】k-fold cross validation(k-折叠交叉验证

    万次阅读 多人点赞 2017-03-13 09:27:04
    k-折叠交叉验证就是将训练集的1/k作为测试集,每个模型训练k次,测试k次,错误率为k次的平均,然后平均率最小的模型Mi。
  • 交叉验证应用

    2022-04-03 13:32:41
    交叉验证 另一种常用的模型选择方法是交叉验证( cross validation)。 如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集(training set)、验证集(validation set)和...
  • 分类评估模型及优化之交叉验证 交叉验证的三种基本方法: **1、将拆分与评价合并执行** sklearn.model_selection.cross_val_score **2、同时使用多个评价指标** sklearn.model_selection.cross_validate **3、使用...
  • 摘要:本文讲述了如何用Python对训练集测试集进行分割与交叉验证。在上一篇关于Python中的线性回归的文章之后,我想再写一篇关于训练测试分割和交叉验证的文章。在数据科学和数据分析领域中,这两个概念经常被用作...
  • 错误的原因之一是此代码rfc.fit(train_data, test_data)。你应该把火车标签作为第二个参数,而不是测试数据。在至于绘图,你可以尝试做一些类似下面的代码。我假设您知道在这种情况下,k-folds CV只用于选择不同的...
  • 模型评估—交叉验证

    千次阅读 2021-02-16 13:06:21
    3. sklearn的交叉验证 3.1. 计算交叉验证的指标 3.1.1. cross_validate 函数和多度量评估 3.1.2. 通过交叉验证获取预测 3.2. 交叉验证迭代器 3.3. 交叉验证迭代器–循环遍历数据 3.3.1. K 折 3.1.3.2. 重复 K...
  • 看了网上的很多k-fold的程序,发现都是机器学习方面的数据操作,而非文件操作(一位不愿意透露姓名的资深大冤种本着“能花钱就不动脑”的原则还付费了几个程序,全是bug,我真的会谢)。 然后自己写了一个k-fold...
  • 交叉验证 部分参考:模型选择中的交叉验证方法综述,山西大学,范永东(这是一篇硕士论文,原文内容有点啰嗦,存在一些错误。本文对其交叉验证部分校对整理) 交叉验证是一种通过估计模型的泛化误差,从而进行模型...
  • 本文实现了R语言构建随机森林模型并且进行K-折交叉验证。K-折交叉验证即将原始数据分成K等分,每次选择1份作为测试集,另外k-1份为训练集进行建模,最终精度为k次建模精度的均值。本文以十折交叉验证为例。 首先...
  • 2、线性回归+k折交叉验证法与lasso+k折交叉验证法 (1)k=2时 #波士顿房价 #k折交叉验证法 from sklearn import datasets from sklearn.linear_model import LinearRegression from sklearn.metrics import ...
  • 我有大约1.3k的叶片温度样本,我试图用大气变量,如空气温度、太阳辐射、风和湿度来预测这个温度。在我从一个简单的多元线性...在据我所知,交叉验证有两个目的。第一个似乎是比较你的模型与其他模型的准确性,并在...
  • 留一法交叉验证

    千次阅读 2020-03-25 11:35:17
    https://blog.umu618.com/2018/05/26/leave-one-out-cross-validation/
  • K倍交叉验证配对t检验 比较两个模型性能的K倍配对t检验程序 from mlxtend.evaluate import paired_ttest_kfold_cv 概述 K-fold交叉验证配对t检验程序是比较两个模型(分类器或回归器)性能的常用方法,并解决了重...
  • 在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。 在第2部分中,我们看到使用随机森林和...
  • 这里介绍3种方法来选择特征:最优子集选择、向前或向后逐步选择、交叉验证法。最优子集选择这种方法的思想很简单,就是把所有的特征组合都尝试建模一遍,然后选择最优的模型。基本如下:对于p个特征,从k=1到k=p——...
  • 交叉验证概述 将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,406
精华内容 2,162
关键字:

交叉验证的r2