拓端tecdat|R語言基于Bagging分類的邏輯回歸(Logistic Regression)、決策樹、森林分析
原文鏈接:http://tecdat.cn/?p=22448
原文出處:拓端數據部落公眾號
今天,我們將看下bagging 技術里面的啟發(fā)式算法。
通常,bagging 與樹有關,用于生成森林。但實際上,任何類型的模型都有可能使用bagging ?;仡櫼幌?,bagging意味著 "boostrap聚合"。因此,考慮一個模型m:X→Y。讓?

表示從樣本中得到的m的估計

現(xiàn)在考慮一些boostrap樣本,

,i是從{1,?,n}中隨機抽取的。 基于該樣本,估計

。然后抽出許多樣本,考慮獲得的估計值的一致性,使用多數規(guī)則,或使用概率的平均值(如果考慮概率主義模型)。因此

Bagging邏輯回歸?
考慮一下邏輯回歸的情況。為了產生一個bootstrap樣本,自然要使用上面描述的技術。即隨機抽取一對(yi,xi),均勻地(概率為

)替換。這里考慮一下小數據集。對于bagging部分,使用以下代碼
for(s in 1:1000){
df_s = df[sample(1:n,size=n,replace=TRUE)
logit[s]= glm(y~., df_s, family=binomial
然后,我們應該在這1000個模型上進行匯總,獲得bagging的部分。
unlist(lapply(1:1000,function(z) predict(logit[z],nnd))}
我們現(xiàn)在對任何新的觀察都有一個預測
vv = outer(vu,vu,(function(x,y) mean(pre(c(x,y)))
contour(vu,vu,vv,levels = .5,add=TRUE)

Bagging邏輯回歸?
另一種可用于生成bootstrap樣本的技術是保留所有的xi,但對其中的每一個,都(隨機地)抽取一個y的值,其中有

因此

因此,現(xiàn)在Bagging算法的代碼是
glm(y~x1+x2, df, family=binomial)
for(s in 1:100)
y = rbinom(size=1,prob=predict(reg,type="response")
L_logit[s] = glm(y~., df_s, family=binomial)
bagging算法的agg部分保持不變。在這里我們獲得
vv = outer(vu,vu,(function(x,y) mean(pre(c(x,y)))))
contour(vu,vu,vv,levels = .5,add=TRUE)

當然,我們可以使用該代碼,檢查預測獲得我們的樣本中的觀察。
在這里考慮心肌梗塞數據。
數據
我們使用心臟病數據,預測急診病人的心肌梗死,包含變量:
心臟指數
心搏量指數
舒張壓
肺動脈壓
心室壓力
肺阻力
是否存活

其中我們有急診室的觀察結果,對于心肌梗塞,我們想了解誰存活下來了,得到一個預測模型
reg = glm(as.factor(PRO)~., carde, family=binomial)
for(s in 1:1000){
L_logit[s] = glm(as.factor(PRO)~., my_s, family=binomial)
}
unlist(lapply(1:100,predict(L_logit[z],newdata=d,type="response")}
對于第一個觀察,通過我們的1000個模擬數據集,以及我們的1000個模型,我們得到了以下死亡概率的估計。
v_x = p(x)
hist(v_x,proba=TRUE,breaks=seq(,by.05),=",="",
segments(mean(v_x),0,mean(v_x,5="=2)
因此,對于第一個觀察,在78.8%的模型中,預測的概率高于50%,平均概率實際上接近75%。

或者,對于樣本22,預測與第一個非常接近。
histo(23)
histo(11)
我們在此觀察到

Bagging決策樹
Bagging是由Leo Breiman于1994年在Bagging Predictors中介紹的。如果說第一節(jié)描述了這個程序,那么第二節(jié)則介紹了 "Bagging分類樹"。樹對于解釋來說是不錯的,但大多數時候,它們是相當差的預測模型。Bagging的想法是為了提高分類樹的準確性。
bagging 的想法是為了生成大量的樹
for(i in 1:12)
set.seed(sed[i])
idx = sample(1:n, size=n, replace=TRUE)
cart = ?rpart(PR~., md[idx,])

這個策略其實和以前一樣。對于bootstrap部分,將樹存儲在一個列表中
for(s in 1:1000)
idx = sample(1:n, size=n, replace=TRUE)
L_tree[[s]] = rpart(as.(PR)~.)
而對于匯總部分,只需取預測概率的平均值即可
p = function(x){
unlist(lapply(1:1000,function(z) predict(L_tree[z],newdata,)[,2])
因為在這個例子中,我們無法實現(xiàn)預測的可視化,讓我們在較小的數據集上運行同樣的代碼。
for(s in 1:1000){
idx = sample(1:n, size=n, replace=TRUE)
L_tree[s] = rpart(y~x1+x2,
}
unlist(lapply(1:1000,function(z) predict(L_tree[[z]])
outer(vu,vu,Vectorize(function(x,y) mean(p(c(x,y)))

從bagging到森林
在這里,我們生成了很多樹,但它并不是嚴格意義上的隨機森林算法,正如1995年在《隨機決策森林》中介紹的那樣。實際上,區(qū)別在于決策樹的創(chuàng)建。當我們有一個節(jié)點時,看一下可能的分割:我們考慮所有可能的變量,以及所有可能的閾值。這里的策略是在p中隨機抽取k個變量(當然k<p,例如k=sqrt{p})。這在高維度上是有趣的,因為在每次分割時,我們應該尋找所有的變量和所有的閾值,而這可能需要相當長的時間(尤其是在bootstrap 程序中,目標是長出1000棵樹)。

最受歡迎的見解
1.用機器學習識別不斷變化的股市狀況—隱馬爾科夫模型(HMM)的應用
2.R語言GARCH-DCC模型和DCC(MVT)建模估計
3.R語言實現(xiàn) Copula 算法建模依賴性案例分析報告
4.R語言COPULAS和金融時間序列數據VaR分析
5.R語言多元COPULA GARCH 模型時間序列預測
6.用R語言實現(xiàn)神經網絡預測股票實例
7.r語言預測波動率的實現(xiàn):ARCH模型與HAR-RV模型
8.R語言如何做馬爾科夫轉換模型markov switching model
9.matlab使用Copula仿真優(yōu)化市場風險