R語言泰坦尼克號(hào)隨機(jī)森林模型案例數(shù)據(jù)分析
原文鏈接:http://tecdat.cn/?p=4281
?
如果我們對(duì)所有這些模型的結(jié)果進(jìn)行平均,我們有時(shí)可以從它們的組合中找到比任何單個(gè)部分更好的模型。這就是集成模型的工作方式。
讓我們構(gòu)建一個(gè)由三個(gè)簡單決策樹組成的非常小的集合來說明:

這些樹中的每一個(gè)都根據(jù)不同的變量做出分類決策。
隨機(jī)森林模型比上面的決策樹更深地生長樹木,實(shí)際上默認(rèn)是盡可能地將每棵樹生長出來。隨機(jī)森林以兩種方式做到這一點(diǎn)。
第一個(gè)技巧是使用套袋。Bagging會(huì)對(duì)您的訓(xùn)練集中的行進(jìn)行隨機(jī)抽樣。使用樣本函數(shù)很容易在R中進(jìn)行模擬。假設(shè)我們想在10行的訓(xùn)練集上進(jìn)行裝袋。
> sample(1:10, replace = TRUE)
[1] 3 1 9 1 7 10 10 2 2 9
在此模擬中,如果再次運(yùn)行此命令,則每次都會(huì)獲得不同的行樣本。平均而言,大約37%的行將被排除在自舉樣本之外。通過這些重復(fù)和省略的行,每個(gè)使用裝袋生長的決策樹將略有不同。
第二個(gè)隨機(jī)來源超越了這個(gè)限制。隨機(jī)森林不是查看整個(gè)可用變量池,而是僅采用它們的一部分,通常是可用數(shù)量的平方根。在我們的例子中,我們有10個(gè)變量,因此使用三個(gè)變量的子集是合理的。
通過這兩個(gè)隨機(jī)性來源,整體包含一系列完全獨(dú)特的樹木,這些樹木的分類都不同。與我們的簡單示例一樣,每個(gè)樹都被調(diào)用以對(duì)給定乘客進(jìn)行分類,對(duì)投票進(jìn)行統(tǒng)計(jì)(可能有數(shù)百或數(shù)千棵樹)并且選擇多數(shù)決策。
R的隨機(jī)森林算法對(duì)我們的決策樹沒有一些限制。我們必須清理數(shù)據(jù)集中的缺失值。rpart它有一個(gè)很大的優(yōu)點(diǎn),它可以在遇到一個(gè)NA值時(shí)使用替代變量。在我們的數(shù)據(jù)集中,缺少很多年齡值。如果我們的任何決策樹按年齡分割,那么樹將搜索另一個(gè)以與年齡相似的方式分割的變量,并使用它們代替。隨機(jī)森林無法做到這一點(diǎn),因此我們需要找到一種手動(dòng)替換這些值的方法。
看一下合并后的數(shù)據(jù)框的年齡變量:
> summary(combi$Age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.17 21.00 28.00 29.88 39.00 80.00 263
1309個(gè)中有263個(gè)值丟失了,這個(gè)數(shù)字高達(dá)20%!此子集是否缺少值。我們現(xiàn)在也想使用method="anova"決策樹的版本,因?yàn)槲覀儾皇且兕A(yù)測(cè)某個(gè)類別,而是連續(xù)變量。因此,讓我們使用可用的年齡值在數(shù)據(jù)子集上生成一個(gè)樹,然后替換缺少的那些樣本:
> combi$Age[is.na(combi$Age)] <- predict(Agefit, combi[is.na(combi$Age),])
您可以繼續(xù)檢查摘要,所有這些NA值都消失了。
現(xiàn)在讓我們看看整個(gè)數(shù)據(jù)集的摘要,看看是否還有其他我們以前沒有注意到的問題變量:
> summary(combi)
?
> summary(combi$Embarked)
C Q S
2 270 123 914
兩名乘客的空白。首先,我們需要找出他們是誰!我們可以which用于此:
> which(combi$Embarked == '')
[1] 62 830
然后我們簡單地替換這兩個(gè),并將其編碼為一個(gè)因素:
> combi$Embarked <- factor(combi$Embarked)
另一個(gè)變量是Fare,讓我們來看看:
> summary(combi$Fare)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.000 7.896 14.450 33.300 31.280 512.300 1
它只有一個(gè)乘客NA,所以讓我們找出它是哪一個(gè)并用中位數(shù)票價(jià)取而代之:
> which(is.na(combi$Fare))
[1] 1044
好的。我們的數(shù)據(jù)框現(xiàn)已被清理?,F(xiàn)在進(jìn)入第二個(gè)限制:R中的隨機(jī)森林只能消化多達(dá)32個(gè)等級(jí)的因子。我們的FamilyID變量幾乎翻了一倍。我們可以在這里采用兩條路徑,或者將這些級(jí)別更改為它們的基礎(chǔ)整數(shù)(使用unclass()函數(shù))并讓樹將它們視為連續(xù)變量,或者手動(dòng)減少級(jí)別數(shù)以使其保持在閾值之下。
我們采取第二種方法。然后我們將它轉(zhuǎn)換回一個(gè)因素:
> combi$FamilyID2 <- combi$FamilyID
> combi$FamilyID2 <- factor(combi$FamilyID2)
我們已經(jīng)降到了22級(jí),所以我們很好地將測(cè)試和訓(xùn)練集分開,安裝并加載包
randomForest:
> install.packages('randomForest')
設(shè)置隨機(jī)種子。
> set.seed(415)
內(nèi)部數(shù)字并不重要,您只需確保每次使用相同的種子編號(hào),以便在隨機(jī)森林函數(shù)內(nèi)生成相同的隨機(jī)數(shù)。
現(xiàn)在我們準(zhǔn)備運(yùn)行我們的模型了。語法類似于決策樹。
> fit <- randomForest( )
我們強(qiáng)制模型通過暫時(shí)將目標(biāo)變量更改為僅使用兩個(gè)級(jí)別的因子來預(yù)測(cè)我們的分類,而不是method="class"像使用那樣指定。
如果您正在使用更大的數(shù)據(jù)集,您可能希望減少樹的數(shù)量,至少在初始探索時(shí),使用限制每個(gè)樹的復(fù)雜性nodesize以及減少采樣的行數(shù)sampsize
那么讓我們來看看哪些變量很重要:
> varImpPlot(fit)

?
我們的Title變量在這兩個(gè)指標(biāo)中都處于領(lǐng)先地位。我們應(yīng)該非常高興地看到剩下的工程變量也做得非常好。
預(yù)測(cè)函數(shù)與決策樹的工作方式類似,我們可以完全相同的方式構(gòu)建提交文件。
> Prediction <- predict(fit, test)
> write.csv(submit, file = "firstforest.csv", row.names = FALSE)

讓我們嘗試一下條件推理樹的森林。
所以繼續(xù)安裝并加載party包。
> install.packages('party')
> library(party)
以與我們的隨機(jī)森林類似的方式構(gòu)建模型:
> set.seed(415)
> fit <- cforest( )
條件推理樹能夠處理比Random Forests更多級(jí)別的因子。讓我們做另一個(gè)預(yù)測(cè):
> Prediction <- predict(fit, test, OOB=TRUE, type = "response")
?

?
有問題歡迎下方留言!
?

最受歡迎的見解
1.從決策樹模型看員工為什么離職
2.R語言基于樹的方法:決策樹,隨機(jī)森林
3.python中使用scikit-learn和pandas決策樹
4.機(jī)器學(xué)習(xí):在SAS中運(yùn)行隨機(jī)森林?jǐn)?shù)據(jù)分析報(bào)告
5.R語言用隨機(jī)森林和文本挖掘提高航空公司客戶滿意度
6.機(jī)器學(xué)習(xí)助推快時(shí)尚精準(zhǔn)銷售時(shí)間序列
7.用機(jī)器學(xué)習(xí)識(shí)別不斷變化的股市狀況——隱馬爾可夫模型的應(yīng)用
8.python機(jī)器學(xué)習(xí):推薦系統(tǒng)實(shí)現(xiàn)(以矩陣分解來協(xié)同過濾)
9.python中用pytorch機(jī)器學(xué)習(xí)分類預(yù)測(cè)銀行客戶流失