精华内容
下载资源
问答
  • R语言选模型/用AIC BIC adjustRsq 十折交叉验证 LOOCV等验证/择参 以fama三因子模型和CAMP模型为例@理科班的习习同学 引入包与数据预处理 install.packages("leaps") install.packages("car") install.packages(...

    R语言选模型/用AIC BIC adjustRsq 十折交叉验证 LOOCV等验证/择参 以fama三因子模型和CAMP模型为例@理科班的习习同学

    引入包与数据预处理

    install.packages("leaps") 
    install.packages("car") 
    install.packages("caret") 
    library("car")
    library("leaps") 
    library("heavy") 
    library("caret")
    mt=read.csv("XIXI-Data.csv")
    mt$X=as.Date(mt$X,"%Y/%m/%d") #修改日期格式并赋值给X列
    ff=read.csv("F-F_Research_Data_Factors_daily.csv",header=T,skip=4
    + )#引入三因子信息
    dat=merge(mt,ff,by= "X") #和另一个数据集按照日期进行拼接,如果本来就是一整个数据集,这两部可以忽略
    attach(dat)#方便后面写语句
    

    回归

    fama三因子模型的公式是
    下面是基本介绍:
    Here, Rt, RM,t and µt are the net returns of the asset, the market portfolio and the risk-free asset from t−1 to t, respectively. The market excess return is the first risk factor, while the second and the third ones are SMB (small minus big) and HML (high minus low). To be more specific, SMB is the difference in returns on a portfolio of small stocks and a portfolio of large stocks. “Small” and “big” refer to the size of the market value of a stock. HML is the difference in returns on a portfolio of high book-to-market value stocks and a portfolio of low book-tomarket value stocks. SMBt and HMLt are the differences in returns in the t-th period given by (t−1,t].

    > n=dim(dat)[1] #计算一列有多少数
    > R_g=Adj.Close[-1]/Adj.Close[-n] #后一项除以前一项算回报率
    > R_n=R_g-1 #净回报率
    > lef_term=(R_n-RF[-1]) #三因子模型的左边
    > reg1=lm(lef_term~Mkt.RF[-1]+SMB[-1]+HML[-1])#回归
    > vif(reg1)#计算vif 
    > #下面跟一段VIF的解释
    > # The VIF for Mkt.RF is 1.056693. It means its squared standard error is 1.056693 times larger than it would be if the other predictors are deleted or were not correlated with it. The same as the other 2 elements. The VIF of these 3 elements proved that they estimate their coefficient doesn’t have large errors which means there is not a collinearity problem.
    > summary(reg1)
    Call:
    lm(formula = lef_term ~ Mkt.RF[-1] + SMB[-1] + HML[-1])
    
    Residuals:
          Min        1Q    Median        3Q       Max 
    -0.049696 -0.005057  0.000259  0.005244  0.042138 
    
    Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
    (Intercept)  0.0003031  0.0003389   0.894    0.371    
    Mkt.RF[-1]   0.7387009  0.0417026  17.714  < 2e-16 ***
    SMB[-1]     -0.4195117  0.0697805  -6.012 2.87e-09 ***
    HML[-1]      0.0645699  0.0617378   1.046    0.296    
    ---
    Signif. codes:  0***0.001**0.01*0.05.0.1 ‘ ’ 1
    
    Residual standard error: 0.009249 on 748 degrees of freedom
    Multiple R-squared:  0.3052,    Adjusted R-squared:  0.3024 
    F-statistic: 109.5 on 3 and 748 DF,  p-value: < 2.2e-16
    

    CAMP模型拟合与比较

    > CAPM_reg1=lm(lef_term~Mkt.RF[-1])
    > summary(CAPM_reg1)
    
    Call:
    lm(formula = lef_term ~ Mkt.RF[-1])
    
    Residuals:
          Min        1Q    Median        3Q       Max 
    -0.049022 -0.004929  0.000278  0.005352  0.045007 
    
    Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
    (Intercept) 0.0003638  0.0003458   1.052    0.293    
    Mkt.RF[-1]  0.6924356  0.0415120  16.680   <2e-16 ***
    ---
    Signif. codes:  0***0.001**0.01*0.05.0.1 ‘ ’ 1
    
    Residual standard error: 0.009464 on 750 degrees of freedom
    Multiple R-squared:  0.2706,    Adjusted R-squared:  0.2696 
    F-statistic: 278.2 on 1 and 750 DF,  p-value: < 2.2e-16
    > BIC(reg1)
    [1] -4880.385
    > BIC(CAPM_reg1)
    [1] -4857.045
    #BIC越小越好,summary里有调整的R方信息,R方越接近1越好
    #十折交叉验证
    > reg_dif =data.frame(lef_term,Mkt.RF[-1],SMB[-1],HML[-1])
    > CAPM_dif=data.frame(lef_term,Mkt.RF[-1])
    > train.control=trainControl(method="cv",number=10)
    > set.seed(1)
    > reg_cv=train(lef_term~.,data=reg_dif,method="lm", trControl=train.control)
    > set.seed(1)
    > CAPM_reg_cv=train(lef_term~., data = CAPM_dif,method="lm", trControl=train.control)
    > TestMSE_FF=as.numeric(reg_cv$results[2])^2
    > TestMSE_CAPM=as.numeric(CAPM_reg_cv$results[2])^2
    > TestMSE_FF
    [1] 8.486705e-05
    > TestMSE_CAPM
    [1] 8.867714e-05
    #test error 越小越好
    #LOOCV交叉验证
    > train.control=trainControl(method="LOOCV")
    > set.seed(1)
    > reg_cv2=train(lef_term~.,data=reg_dif,method="lm", trControl=train.control) 
    > set.seed(1)
    > CAPM_reg_cv2=train(lef_term~., data = CAPM_dif,method="lm", trControl=train.control)
    > TestMSE_FF2=as.numeric(reg_cv2$results[2])^2
    > TestMSE_CAPM2=as.numeric(CAPM_reg_cv2$results[2])^2
    > TestMSE_FF2
    [1] 8.617911e-05
    > TestMSE_CAPM2
    [1] 8.984655e-05
    #test error 越小越好
    #上面都证明了要选fama三因子,拟合好
    

    择参

    
    > regsub=regsubsets(lef_term~.,data=reg_dif) #择参函数
    > regsub_sum=summary(regsub)
    > regsub_sum$which #可以看出穷举的留多少参数时选哪个参
      (Intercept) Mkt.RF..1. SMB..1. HML..1.
    1        TRUE       TRUE   FALSE   FALSE
    2        TRUE       TRUE    TRUE   FALSE
    3        TRUE       TRUE    TRUE    TRUE
    > plot(regsub_sum$adjr2,xlab="Number of Variables",ylab="Adjusted RSq",type = "l")#看参数数量如何影响调节R方
    > plot(regsub_sum$cp,xlab="Number of Variables",ylab="Cp",type = "l")
    > plot(regsub_sum$bic,xlab="Number of Variables",ylab="BIC",type = "l")
    > #十折交叉验证和LOOCV验证
    > train.control=trainControl(method="cv",number=10)
    > set.seed(1)
    > dif1=data.frame(lef_term,Mkt.RF[-1])
    > sub_reg_cv1=train(lef_term~., data = dif1,method="lm", trControl=train.control)
    > M1=as.numeric(sub_reg_cv1$results[2])^2
    > set.seed(1)
    > dif2=data.frame(lef_term,Mkt.RF[-1],SMB[-1])
    > sub_reg_cv2=train(lef_term~., data = dif2,method="lm", trControl=train.control)
    > M2=as.numeric(sub_reg_cv2$results[2])^2
    > set.seed(1)
    > dif3=data.frame(lef_term,Mkt.RF[-1],SMB[-1],HML[-1])
    > sub_reg_cv3=train(lef_term~., data = dif3,method="lm", trControl=train.control)
    > M3=as.numeric(sub_reg_cv3$results[2])^2
    > M1
    [1] 8.867714e-05
    > M2
    [1] 8.451847e-05
    > M3
    [1] 8.486705e-05
    
    
    展开全文
  • LOOCV交叉验证

    2019-05-31 00:25:33
    mlr=cv.glm(data=d,glmfit=ml,K=100) #k=n=100 #广义线性模型的交叉验证:估算K折交叉验证的预计误差 mlr$delta ml2=glm(y~poly(x,2),data=d) mlr2=cv.glm(data=d,glmfit=ml2,K=100) mlr2$delta ml3=glm(y~...

    #p是多少个变量x,p=1;n是100,记录了n行数据
    set.seed(1)
    y=rnorm(100)
    x=rnorm(100)
    y=x-2x^2+rnorm(100)
    plot(x,y)
    ##############
    set.seed(1)
    y=rnorm(100)
    x=rnorm(100)
    y=x-2
    x^2+rnorm(100)

    error=c() #因为循环里出现了error[i]
    d=cbind(x,y) #c是竖着合并 r是横着合并
    d=as.data.frame(d)
    #前两步可合并为 d= data.frame(x,y)

    for(i in 1:100)
    {
    m1=glm(y~x,data = d[-i,]) #去掉第i行的线性方程,此时一横行就是一个x+y了
    pred_m1=predict(m1,newdata=d[i,])
    error[i]=d[i,2]-pred_m1 #第i行第二列即y:真实值-预测值
    }
    sum(error^2)/dim(d)[1] #MSE LOOCV 1代表行,2代表列,即100

    ###################
    library(boot)
    ml=glm(y~x,data=d)
    mlr=cv.glm(data=d,glmfit=ml,K=100) #k=n=100 #广义线性模型的交叉验证:估算K折交叉验证的预计误差
    mlr$delta

    ml2=glm(y~poly(x,2),data=d)
    mlr2=cv.glm(data=d,glmfit=ml2,K=100)
    mlr2$delta

    ml3=glm(y~poly(x,3),data=d)
    mlr3=cv.glm(data=d,glmfit=ml3,K=100)
    mlr3$delta

    ml4=glm(y~poly(x,4),data=d)
    mlr4=cv.glm(data=d,glmfit=ml4,K=100)
    mlr4$delta

    ##########这样可以找最小的MSE
    error=c()
    E = c()
    d=data.frame(x,y)
    for (j in 1:4) {
    for (i in 1:100){
    m1=glm(y~poly(x,j),data=d[-i,])
    pred_m1=predict(m1,newdata=d[i,])
    error[i]=d[i,2]-pred_m1
    E[j]=sum(error^2)/dim(d)[1]
    }
    }
    which.min(E)

    展开全文
  • LOOCV - Leave-One-Out-Cross-Validation 留一交叉验证

    万次阅读 多人点赞 2018-12-10 10:10:33
    什么是留一交叉验证 正常训练都会划分训练集和验证集,训练集用来训练模型,而验证集用来评估模型的泛化能力。留一交叉验证是一个极端的例子,如果数据集D的大小为N,那么用N-1条数据进行训练,用剩下的一条数据作为...

    什么是留一交叉验证

    正常训练都会划分训练集和验证集,训练集用来训练模型,而验证集用来评估模型的泛化能力。留一交叉验证是一个极端的例子,如果数据集D的大小为N,那么用N-1条数据进行训练,用剩下的一条数据作为验证,用一条数据作为验证的坏处就是可能EvalE_{val}EoutE_{out}相差很大,所以在留一交叉验证里,每次从D中取一组作为验证集,直到所有样本都作过验证集,共计算N次,最后对验证误差求平均,得到Eloocv(H,A),这种方法称之为留一法交叉验证。
    1Nn=1Nen=1Nn=1Nerr(gn(xn),yn) \frac{1}{N}\sum_{n=1}^{N} e_{n} = \frac{1}{N}\sum_{n=1}^{N} err(g_{n}^{-}(x_{n}),y_{n})

    为什么使用LOOCV

    至于为什么,其原因和为什么使用交叉验证是一样的,主要是为了防止过拟合,评估模型的泛化能力

    什么时候使用LOOCV

    当数据集D的数量较少时使用留一交叉验证,其原因主要如下

    • 数据集少,如果像正常一样划分训练集和验证集进行训练,那么可以用于训练的数据本来就少,还被划分出去一部分,这样可以用来训练的数据就更少了。loocv可以充分的利用数据。
    • 因为loocv需要划分N次,产生N批数据,所以在一轮训练中,要训练出N个模型,这样训练时间就大大增加。所以loocv比较适合训练集较少的场景

    LOOCV理论证明

    为什么可以使用LOOCV来近似估计泛化误差,即EloocvEoutE_{loocv}\approx E_{out}
    证明如下
    在这里插入图片描述

    解释如下:

    • εD\varepsilon_{D}表示在不同数据集上的期望 ,ε\varepsilon 是表示期望的符号,这里不同的数据D,我的理解是对原始数据的N次划分得到的不同数据集
    • εDen\varepsilon_{D}e_{n}=>εDnε(xn,yn)en\varepsilon_{D_{n}}\varepsilon_{{(x_{n},y_{n})}}e_{n}是因为DnD_{n}(xn,yn)(x_{n},y_{n})服从iid分布
    • ε(xn,yn)err(gn(xn),yn)\varepsilon_{{(x_{n},y_{n})}}err(g_{n}^{-}(x_{n}),y_{n})转化为Eout(gn)E_{out}(g_{n}^{-})是期望的定义和EoutE_{out}的定义,虽然是对剩下的一个求误差,但是求的是对剩下单个数据的期望,单个数据的的期望相当于对所有未知数据上求概率平均(因为训练数据和位置数据是iid,所以对训练数据求期望相当终于对未知数据求期望),也就是gng_{n}^{-}在未知数据上的E即EoutE_{out}

    LOOCV的优点

    • 充分利用数据
    • 因为采样是确定的,所以最终误差也是确定的,不需要重复LOOCV

    LOOCV的缺点

    • 训练起来耗时
    • 由于每次只采一个样本作为验证,导致无法分层抽样,影响验证集上的误差。举个例子,数据集中有数量相等的两个类,对于一条随机数据,他的预测结果是被预测为多数的结果,如果每次划出一条数据作为验证,则其对应的训练集中则会少一条,导致训练集中该条数据占少数从而被预测为相反的类,这样原来的误差率为50%,在LOOCV中为100%

    LOOCV模型选择问题

    之前有个疑问就是,在留一交叉验证过后,到底选择哪一个模型作为最终的模型呢?比如一百条数据在LOOCV中训练了一百个模型,选择其中最好的一个吗,其实不是这样的。
    考虑一般的划分训练,train_data七三划分为训练集和验证集,然后每一轮训练都会得到一个EvalE_{val},训练到EvalE_{val}最低为止,此时的模型就是最终的模型。
    LOOCV也是这样的,只不过原来每一轮的训练对应于LOOCV中划分N次训练N个模型,原来的EvalE_{val}对应于LOOCV每一轮N个误差的平均,这样一轮轮下来直到验证集上的误差最小,此时的模型就是最终需要的模型(这个模型内部有N个小模型)

    展开全文
  • K折交叉验证 使用 train/test split 进行模型评估的缺点 ①最终模型与参数的选取将极大程度依赖于你对训练集和测试集的划分方法 ②该方法只用了部分数据进行模型的训练 为了消除这一变化因素,我们可以...

    K折交叉验证

     

    使用 train/test split 进行模型评估的缺点

    ①最终模型与参数的选取将极大程度依赖于你对训练集和测试集的划分方法

    ②该方法只用了部分数据进行模型的训练

     

     

    为了消除这一变化因素,我们可以创建一系列训练集/测试集,计算模型在每个测试集上的准确率,然后计算平均值。

    这就是 K-fold cross-validation 的本质

     

    LOOCV

          首先,我们先介绍LOOCV方法,即(Leave-one-out cross-validation)。像Test set approach一样,LOOCV方法也包含将数据集分为训练集和测试集这一步骤。但是不同的是,我们现在只用一个数据作为测试集,其他的数据都作为训练集,并将此步骤重复N次(N为数据集的数据数量)。

          如图所示,假设我们现在有n个数据组成的数据集,那么LOOCV的方法就是每次取出一个数据作为测试集的唯一元素,而其他n-1个数据都作为训练集用于训练模型和调参。结果就是我们最终训练了n个模型,每次都能得到一个MSE。而计算最终test MSE则就是将这n个MSE取平均。

         但是LOOCV的缺点也很明显,那就是计算量过于大,是train/test split耗时的n-1倍。

     

    所以提出了一种折中的方法

    K-fold Cross Validation

          K折交叉验证,和LOOCV的不同在于,我们每次的测试集将不再只包含一个数据,而是多个,具体数目将根据K的选取决定。比如,如果K=5,那么我们利用五折交叉验证的步骤就是:

    1.将所有数据集分成5份

    2.不重复地每次取其中一份做测试集,用其他四份做训练集训练模型,之后计算该模型在测试集上的MSE

    3.将5次的MSE取平均得到最后的MSE

     

    不难理解,其实LOOCV是一种特殊的K-fold Cross Validation(K=N)。

     

     

          每一幅图种蓝色表示的真实的test MSE,而黑色虚线和橙线则分贝表示的是LOOCV方法和10-fold CV方法得到的test MSE。我们可以看到事实上LOOCV和10-fold CV对test MSE的估计是很相似的,但是相比LOOCV,10-fold CV的计算成本却小了很多,耗时更少。

     

     

    展开全文
  • AI 在时间序列数据集上使用什么交叉验证技术?是用k倍或LOOCV? 答:都不是。对于时间序列问题,k倍可能会很麻烦,因为第4年或第5年的一些模式有可能跟第3年的不同,而对数据集的重复采样会将分离这些趋势,我们可能...
  • 介绍模型表现差异很大的...交叉验证的几种常用方法验证集方法留一法交叉验证(LOOCV)k折交叉验证分层k折交叉验证对抗验证时间序列的交叉验证自定义交叉验证技术如何测量模型的偏差方差?为什么模型会失去稳定性?让...
  • 换句话说,为什么在别人评估我们的模型时会失去稳定性?在本文中,我们将探讨可能的原因。...交叉验证的几种常用方法验证集方法留一法交叉验证(LOOCV)k折交叉验证分层k折交叉验证对抗验证时间序列的交叉验证自定义交...
  • 对于时间序列问题,k倍可能会很麻烦,因为第4年或第5年的一些模式有可能跟第3年的不同,而对数据集的重复采样会将分离这些趋势,我们可能最终是对过去几年的验证,这就不对了。相反,我们可以采用如下所示的5倍正向...
  • 交叉验证

    2017-08-02 10:25:39
    交叉验证交叉验证 原理 1k-cv 2k2-cv 3loocv 410-cv原理交叉验证(Cross validation),有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做...
  • 总结1: 留一法其实就是样本量较小时使用的...=N)进行交叉验证,k = N 即留一(LOOCV)。 留一法交叉验证:假设有N个样本,将每一个样本作为测试样本,其它N-1个样本作为训练样本。这样得到N个分类器,N个...
  • K折交叉验证

    千次阅读 2018-11-29 10:57:25
    写在开头:最近参加了DF的数据竞赛,发现了交叉验证的强大之处。计算时间会长很多但是真的可以把准确率提高很多!这里有对交叉验证很好的解释:知乎专栏:Cross...普通的交叉验证方法LOOCV(Leave-one-out cross-val...
  • 不同的重抽样方法比较:重复K折交叉验证、K交叉验证LOOCV留一交叉验证、重复训练/测试集划分 (留多交叉验证、蒙特卡洛交叉验证)、Bootstrap自助法、632法(为消除估计偏差,Bootstrap自助法改进) 支持向量机与...
  • R 交叉验证

    2018-01-30 18:46:00
    什么是交叉验证?在机器学习中,交叉验证是一种重新采样的方法,用于模型评估,以避免在同一数据集上测试模型。交叉验证的概念实际上很简单:我们...交叉验证方法有几种类型LOOCV - leave -one- out交叉验证,holdout...
  • 《ISLR》交叉验证与自助法

    千次阅读 2017-07-12 19:51:13
    注意 本来是用r markdown写的所有代码放到Rstudio里面都可以运行,无奈csdn不支持这种东西理论所谓理论不过简单理解,并没有什么强力的证明验证集方法验证集方法...留-交叉验证(LOOCV)这种方法用伪代码描述就是for i =
  • 机器学习和数据挖掘:回归[线性(选择和收缩,降维,超出线性范围)和非线性回归(逻辑,K-NN,树)],交叉验证LOOCV,K折,偏差与方差) ,分类(LDA,QDA,K-NN,物流,树,SVM),聚类(PCA,K-Means,分层)本...
  • 在机器学习里,通常来说我们不能将全部数据用于训练模型,否则我们将没有数据集对该模型进行测试,从而评估我们的模型的准确率。而如果我们随机的去选择一个划分点,...1.交叉验证方法一:LOOCV LOOCV方法只用一个...
  • 文章目录1、传统方法1.1 直接划分1.2 LOOCV1.3 k折交叉验证2 对抗验证2.1 样本分布不均匀2.2 何时样本分布均匀?2.3 什么是对抗验证(Adversarial Validation)?2.4 步骤2.5 实战 1、传统方法 在机器学习里,通常来...
  • k-fold与交叉验证

    2018-12-05 11:34:03
    常用的是对标注数据集做7:3划分训练集和验证集,只用了一部分数据,且结果很大程度上依赖于选取的数据。 LOOCV(Leave-one-out cross-validation):每次用一个样本测试,其他数据训练。计算量太大。 k_fold cv (k-...
  • 留一法交叉验证LOOCV) 留一法即Leave-One-Out Cross Validation。这种方法比较简单易懂,就是把一个大的数据集分为k个小数据集,其中k-1个作为训练集,剩下的一个作为测试集,然后选择下一个作为测试集,剩下的k-...
  • 机器学习基本问题

    2016-02-22 23:01:19
    交叉验证交叉验证(Cross-validation,CV) 目的:检测和预防过拟合 LOOCV (Leave-one-out Cross Validation) 交叉验证方法 优点 缺点 Test-set 计算开销小 无法评估模型泛化能力 K-fold交叉验证
  • 交叉验证法验证集方法留一交叉验证法(leave-one-out cross-validation, LOOCV)k折交叉验证法(k-fold CV)k折交叉验证的偏差—方差权衡交叉验证法在分类问题中应用 验证集方法 验证集方法是一种非常简单的方法: ...
  • 2.留一交叉验证LOOCV ①将一个单独的观测(x1,y1)作为验证集,剩下的观测 {(x2,y2), (x3,y3), … , (xn, yn)}组成训练集。然后在n-1个训练观测上拟合统计学习方法,再对余下的观测根据它的值x1来做yih。MSE1 = (y1 ...
  • ML100天-源码

    2021-02-13 21:39:21
    机器学习百日马拉松作业和笔记 √D1:资料介绍与评估资料 √D2:机器学习概论 √D3:机器学习-流程与步骤 ...◇LOOCV(留一法交叉验证) ◇K折交叉验证 √D8:EDA资料分布 √D9:EDA:离群值(Outliner)及其处理
  • 第五章:重抽样方法

    2019-11-27 13:34:59
    重抽样方法第五章:重抽样方法5.1 交叉验证法(cross-validation)5.1.1验证集方法(validation set approach)5.1.2 留一交叉验证法(leave-one-out cross-validation,LOOCV)5.1.3 K折交叉验证(k-fold CV) ...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
热门标签
关键字:

交叉验证loocv