R語言計量經(jīng)濟學(xué)與有時間序列模式的機器學(xué)習(xí)預(yù)測
原文鏈接:http://tecdat.cn/?p=17677
?
今天,我們正在與一位精算數(shù)據(jù)科學(xué)專業(yè)的學(xué)生討論,有關(guān)保險費率制定的與索賠頻率模型有關(guān)的觀點。由于目標是預(yù)測理賠頻率(以評估保險費水平),因此他建議使用舊數(shù)據(jù)來訓(xùn)練該模型,并使用最新數(shù)據(jù)對其進行測試。問題在于該模型沒有包含任何時間模式。
這里考慮一個簡單的數(shù)據(jù)集,
> set.seed(1)
> n=50000
> X1=runif(n)
> T=sample(2000:2015,size=n,replace=TRUE)
> L=exp(-3+X1-(T-2000)/20)
> E=rbeta(n,5,1)
> Y=rpois(n,L*E)
> B=data.frame(Y,X1,L,T,E)
頻率由泊松過程驅(qū)動,具有一個協(xié)變量X1,并且我們假設(shè)呈指數(shù)速率。在此考慮標準線性回歸,沒有任何時間因素影響
> reg=glm(Y~X1+offset(log(E)),data=B,
+ family=poisson)
我們還可以計算年度經(jīng)驗索賠頻率
> u=seq(0,1,by=.01)
> v=predict(re
> vp=Vectorize(p)(seq(.05,.95,by=.1))
并在同一張圖上繪制兩條曲線,
> plot(seq(.05,.95,by=.1),vp,type="b")
> lines(u,exp(v),lty=2,col="red")

?
這就是我們通常在計量經(jīng)濟學(xué)中所做的。在機器學(xué)習(xí)中,更具體地說,是評估模型的質(zhì)量以及進行模型選擇,通常將數(shù)據(jù)集分為兩部分。訓(xùn)練樣本和驗證樣本。考慮一些隨機的訓(xùn)練/驗證樣本,然后在訓(xùn)練樣本上擬合模型,最后使用它來進行預(yù)測,
> idx=sample(1:nrow(B
> reg=glm(Y~X1+offset(log(E)),data=B_a,
+ family=poisson)
> u=seq(0,1,by=.01)
> v=predict(reg,new
$E)
+ }
> vp_a=Vectorize(p)(seq(.05,.95,by=.1))
> plot(seq(.05,.95,by=.1),vp_a,col="blue")
> lines(u,exp(v),l
X1-x)<.1,]
+ ? sum(B$Y)/sum(B$E)
+ }
)(seq(.05,.95,by=.1))
> lines(seq(.05,.95,by=.1),vp_t,col="red")

?
藍色曲線是對訓(xùn)練樣本的預(yù)測(就像在計量經(jīng)濟學(xué)中所做的那樣),紅色曲線是對測試樣本的預(yù)測。
現(xiàn)在,如果我們使用年份作為劃分標準,我們將舊數(shù)據(jù)擬合為模型,并在最近幾年對其進行測試,
> B_a=subset(
T>=2014)
> reg=glm(Y~X1+offset(l
+ ? B=B_a[abs(B_a$X1-x)<.1,]
+ ? sum(B$Y)/sum(B$E)
+ }
> vp_a=Vectorize(p)(
y=.1),vp_a,col="blue")
> lines(u,exp(v),lty=2)
> p=function(x){
-x)<.1,]
+ ? sum(B$Y)/sum(B$E)
+ }
eq(.05,.95,by=.1))
> lines(seq(.05,.95,b=.1),vp_t,

?
顯然,結(jié)果不理想。
我花了一些時間來了解訓(xùn)練和驗證樣本的設(shè)計方式對結(jié)果產(chǎn)生的影響。
我使用回歸模型:
glm(Y~X1+T+offset(log(E)),data=B,
+ family=poisson)
> u=seq(1999,2016,by=

?
在這里,我們使用線性模型,但是通常沒有理由假設(shè)線性。所以我們可以考慮樣條
> reg=glm(Y~X1+bs(T)+offse
> u=seq(1999,2016,by=.
> v2=predict(reg,newdata=
> plot(2000:2015,exp(v2),ty

?
除了假設(shè)存在一個基本的平滑函數(shù),我們可以考慮因子的回歸
as.factor(T)+
+ data=B,family=p
g)
> u=seq(1999,2016,by=.1)
> v=exp(-(u-2000)/20
[2:17]),type="b")

?
另一種選擇是考慮一些更通用的模型,例如回歸樹
> reg=rpart(Y~X1+T+offset(log(E)),dat
> p=function(t){
+ ? B=B[B$T==t,]
+ ? mean(predict(reg,newdata=B))
+ }
2000:2015)
> u=seq(1999,2016,by=.1)
> plot(2000:2015,y_m,ylim=c(

?
在年化頻率上考慮與風(fēng)險敞口相關(guān)的權(quán)重?
> reg=rpart(Y/E~X1+T,data
weights=B$E,cp=1
+ ? B=B[B$T==t,]
+ ? B$E=1
+ }
> y_m=Vectorize(function(t) p(t))(
> v=exp(-(u-2000)/20-3+.5)
> plot(2000:2015,y_m,ylim=c(.02,.08

?
從機器學(xué)習(xí)的角度來看,考慮訓(xùn)練樣本(基于舊數(shù)據(jù))和驗證樣本(基于較新的樣本)
> B_a=subset(B,T<2014)
> B_t=subset(B,T>=2014)
如果我們考慮使用廣義線性模型,那么也很容易獲得近年來的預(yù)測,
> reg_a=glm(Y~X1+T+offset(l
> C=coefficients(reg_a)
> u=seq(1999,20
/20-3)
+C[3]*c(2000:2013,
+ NA,NA)),type="b")
)
> points(2014:2015,exp(C

?
但是,如果我們以年份為因子,我們需要對訓(xùn)練樣本中沒有的水平進行預(yù)測,結(jié)果更加復(fù)雜。
> reg_a=glm(Y~0+X1+as.factor(T)+offse
> C=coefficients(reg_a)
2014) + A[2]*(B_t$T==2015))
+ ? Y_t=L*B_t$E
> i=optim(c(.4,.4),RMSE)$par
> plot(2000:2015,c(exp(C[2:15]
> lines(u,v,lty=2,col="red")
lue")

我們將RMSE量化近年來的預(yù)測水平,輸出還不錯。
獲得舊數(shù)據(jù)的訓(xùn)練數(shù)據(jù)集,并在最近幾年對其進行測試應(yīng)該謹慎適當?shù)乜紤]時間模型。

最受歡迎的見解
1.在python中使用lstm和pytorch進行時間序列預(yù)測
2.python中利用長短期記憶模型lstm進行時間序列預(yù)測分析
3.使用r語言進行時間序列(arima,指數(shù)平滑)分析
4.r語言多元copula-garch-模型時間序列預(yù)測
5.r語言copulas和金融時間序列案例
6.使用r語言隨機波動模型sv處理時間序列中的隨機波動
7.r語言時間序列tar閾值自回歸模型
8.r語言k-shape時間序列聚類方法對股票價格時間序列聚類
9.python3用arima模型進行時間序列預(yù)測