1. 程式人生 > >R語言泰坦尼克號隨機森林模型案例資料分析

R語言泰坦尼克號隨機森林模型案例資料分析

採取大量單獨不完美的模型,他們的一次性錯誤可能不會由其他人做出。如果我們對所有這些模型的結果進行平均,我們有時可以從它們的組合中找到比任何單個部分更好的模型。這就是整體模型的工作方式,他們培養了許多不同的模型,並讓他們的結果在整個團隊中得到平均或投票。

我們現在很清楚決策樹的過度擬合問題。但是如果我們發展了很多並讓他們對結果進行投票,我們就可以通過這個限制。讓我們構建一個由三個簡單決策樹組成的非常小的集合來說明:

這些樹中的每一個都根據不同的變數做出分類決策。因此,讓我們想象一下來自南安普敦的一名女乘客乘坐頭等艙。第一和第二樹投票表明她活了下來,但樹三票她死了。如果我們進行投票,則以2比1贊成她的生存,因此我們將這名乘客歸類為倖存者。

隨機森林模型比上面的決策樹樁更深地生長樹木,實際上預設行為是儘可能地將每棵樹生長出來,就像我們在第三課中製作的過度擬合樹一樣。但由於構建單個決策樹的公式每次都是相同的,因此需要一些隨機源來使這些樹彼此不同。隨機森林以兩種方式做到這一點。

第一個技巧是使用套袋,用於引導聚合。Bagging會對您的訓練集中的行進行隨機抽樣,並進行替換。使用樣本函式很容易在R中進行模擬。假設我們想在10行的訓練集上進行裝袋。

> sample(1:10, replace = TRUE)

[1] 3 1 9 1 7 10 10 2 2 9

在此模擬中,我們仍然有10行可以使用,但行1,2,9和10每次重複兩次,而行4,5,6和8被排除。如果再次執行此命令,則每次都會獲得不同的行樣本。平均而言,大約37%的行將被排除在自舉樣本之外。通過這些重複和省略的行,每個使用裝袋生長的決策樹將略有不同。如果你在我們的例子中有非常強大的功能,例如性別,那麼這個變數可能仍然會支配你大多數樹木的第一個決定。

第二個隨機來源雖然超越了這個限制。隨機森林不是檢視整個可用變數池,而是僅採用它們的一部分,通常是可用數量的平方根。在我們的例子中,我們有10個變數,因此使用三個變數的子集是合理的。為決策樹中的每個節點更改可用變數的選擇。這樣,許多樹在第一次拆分時甚至都沒有可用的性別變數,甚至可能在幾個節點深處都看不到它。

通過這兩個隨機性來源,整體包含一系列完全獨特的樹木,這些樹木的分類都不同。與我們的簡單示例一樣,每個樹都被呼叫以對給定乘客進行分類,對投票進行統計(可能有數百或數千棵樹)並且選擇多數決策。由於每棵樹都是完全長出來的,它們每個都過度配合,但方式不同。因此,所犯的錯誤將在所有錯誤中得到平均。

R的隨機森林演算法對我們的決策樹沒有一些限制。到目前為止,最大的一個是房間裡的大象,我們必須清理資料集中的缺失值。rpart它有一個很大的優點,它可以在遇到一個NA值時使用代理變數。在我們的資料集中,缺少很多年齡值。如果我們的任何決策樹按年齡分割,那麼樹將搜尋另一個以與年齡相似的方式分割的變數,並使用它們代替。隨機森林無法做到這一點,因此我們需要找到一種手動替換這些值的方法。

當我們定義成人/兒童年齡桶時,我們在第2部分中隱含使用的方法是假設所有缺失值都是剩餘資料的均值或中值。從那以後,我們學到了很多新技能,所以讓我們使用決策樹來填充這些值。讓我們從上一課的中斷處開始,看一下合併後的資料框的年齡變數,看看我們遇到了什麼:

> 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箇中有263個值丟失了,這個數字高達20%!一些新的語法要使用。我們可以使用R函式而不是布林邏輯的子集is.na(),而它是倒數!is.na()(爆炸符號表示“不是”)。此子集是否缺少值。我們現在也想使用method="anova"決策樹的版本,因為我們不是要再預測某個類別,而是連續變數。因此,讓我們使用可用的年齡值在資料子集上生成一個樹,然後替換缺少的那些:

> combi$Age[is.na(combi$Age)] <- predict(Agefit, combi[is.na(combi$Age),])

我在這裡留下了家庭人數和家庭身份證,因為我認為他們對預測年齡沒有多大影響。您可以繼續檢查摘要,所有這些NA值都消失了。

現在讓我們看看整個資料集的摘要,看看是否還有其他我們以前沒有注意到的問題變數:

> summary(combi)

兩個跳出來是一個問題,雖然沒有像Age,Embarked和Fare那樣差的兩個方面都缺乏價值。

> summary(combi$Embarked)

C Q S

2 270 123 914

登上了兩名乘客的空白。雖然空白不會像我們的模型那樣成為一個問題NA,因為我們無論如何都要清理,讓我們擺脫它。因為在南安普頓這麼少的觀察和如此大多數的登船,讓我們用“S”代替那兩個。首先,我們需要找出他們是誰!我們可以which用於此:

> which(combi$Embarked == '')

[1] 62 830

這為我們提供了空白欄位的索引。然後我們簡單地替換這兩個,並將其編碼為一個因素:

> combi$Embarked <- factor(combi$Embarked)

另一個頑皮的變數是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

它只有一個乘客NA,所以讓我們找出它是哪一個並用中位數票價取而代之:

> which(is.na(combi$Fare))

[1] 1044

好的。我們的資料框現已被清除。現在進入第二個限制:R中的隨機森林只能消化多達32個等級的因子。我們的FamilyID變數幾乎翻了一倍。我們可以在這裡採用兩條路徑,或者將這些級別更改為它們的基礎整數(使用unclass()函式)並讓樹將它們視為連續變數,或者手動減少級別數以使其保持在閾值之下。

我們採取第二種方法。為此,我們將FamilyID列複製到一個新變數FamilyID2,然後將其從一個因子轉換回一個字串as.character()。然後,我們可以將我們的截止點增加為2至3人的“小型”家庭。然後我們將它轉​​換回一個因素,我們就完成了:

> combi$FamilyID2 <- combi$FamilyID

> combi$FamilyID2 <- factor(combi$FamilyID2)

好吧,我們已經降到了22級,所以我們很好地將測試和訓練集分開,就像我們上一課並增長一個隨機森林一樣。安裝並載入包randomForest:

> install.packages('randomForest')

因為該過程具有我們之前討論過的兩個隨機源,所以在開始之前在R中設定隨機種子是個好主意。這使您的結果在下次載入程式碼時可重現,否則您可以為每次執行獲得不同的分類。

> set.seed(415)

內部數字並不重要,您只需確保每次使用相同的種子編號,以便在隨機森林函式內生成相同的隨機數。

現在我們準備執行我們的模型了。語法類似於決策樹,但還有一些額外的選項。

> fit <- randomForest( )

我們強制模型通過暫時將目標變數更改為僅使用兩個級別的因子來預測我們的分類,而不是method="class"像使用那樣指定。該引數允許我們檢查變數的重要性,我們將看到,引數指定了我們想要增長的樹數。rpartas.factor()importance=TRUEntree

如果您正在使用更大的資料集,您可能希望減少樹的數量,至少在初始探索時,或者使用限制每個樹的複雜性nodesize以及減少採樣的行數sampsize。您也可以覆蓋可供選擇的預設變數數mtry,但預設值是可用總數的平方根,應該可以正常工作。由於我們只有一個小的資料集可供使用,我們可以種植大量的樹而不用太擔心它們的複雜性,它仍然會執行得非常快。

那麼讓我們來看看哪些變數很重要:

> varImpPlot(fit)

請記住裝袋大約37%的行會被遺漏?Well Random Forests不僅浪費了那些“袋外”(OOB)觀察,它還使用它們來檢視每棵樹在看不見的資料上的表現。它幾乎就像一個獎勵測試集,可以動態確定您的模型的效能。

上面顯示了兩種型別的重要性度量。一個測試的準確性可以看出模型在沒有每個變數的情況下會有多差,因此對於非常預測的變數,預期準確度會大大降低。基尼可以深入研究決策樹背後的數學,但實質上是衡量節點在樹末端的純度。如果取出每個變數並且高分表示變數很重要,它再次測試結果。

不出所料,我們的Title變數在這兩個指標中都處於領先地位。我們應該非常高興地看到剩下的工程變數也做得非常好。無論如何,足夠的延遲,讓我們看看它是如何做到的!

預測函式與決策樹的工作方式類似,我們可以完全相同的方式構建提交檔案。但需要更長的時間,因為所有2000棵樹都需要進行分類,然後討論誰是對的:

> Prediction <- predict(fit, test)

> write.csv(submit, file = "firstforest.csv", row.names = FALSE)

嗯,這實際上與Kaggle的Python隨機森林教程完全相同。我不會把它當作任何森林的預期結果,但這可能只是純粹的巧合。相對較差的效能確實表明在較小的資料集上,有時候一個更高階的模型不會打敗一個簡單的模型。除此之外,還有私人排行榜,因為我們的公共分數只評估了50%的測試資料。

但是,我們不要放棄。有不止一個合奏模型。讓我們嘗試一下條件推理樹的森林。他們使用統計測試而不是純度測量以稍微不同的方式做出決定,但每棵樹的基本構造非常相似。

所以繼續安裝並載入party包。

> install.packages('party')

> library(party)

我們再次設定種子以獲得一致的結果,並以與我們的隨機森林類似的方式構建模型:

> set.seed(415)

> fit <- cforest( )

條件推理樹能夠處理比Random Forests更多級別的因子,所以讓我們回到FamilyID的原始版本。你可能也注意到了一些新的論點。現在我們必須在更復雜的命令中指定樹的數量,因為引數的傳遞方式cforest不同。我們還必須手動設定每個節點的樣本數量,因為我們的資料集的預設值為5。好的,讓我們做另一個預測:

> Prediction <- predict(fit, test, OOB=TRUE, type = "response")

如您所見,預測函式需要對條件推理森林進行一些額外的微調。讓我們寫一個提交併提交它!

恭喜!在撰寫本文時,您現在處於Kaggle競賽的前5%!

你已經走了很長的路,從Kaggle排行榜的底部到頂部!但是,從這個資料集中可能還有一些更多的見解。我們從來沒有看過機票或機艙號碼,因此請從他們那裡獲取一些見解,看看是否有更多的收益可能。也許提取客艙信件(甲板)或號碼(位置)並推斷其他乘客的9個家庭,如果他們失蹤可能值得一試?

▍關注我們

大資料部落 -中國專業的第三方資料服務提供商,提供定製化的一站式資料探勘和統計分析諮詢服務

統計分析和資料探勘諮詢服務:y0.cn/teradat(諮詢服務請聯絡官網客服

點選這裡給我發訊息QQ:3025393450

【服務場景】  

科研專案;   公司專案外包;線上線下一對一培訓;資料採集;學術研究;報告撰寫;市場調查。

【大資料部落】提供定製化的一站式資料探勘和統計分析諮詢服務

【大資料部落】大資料部落提供定製化的一站式資料探勘和統計分析諮詢服務

分享最新的大資料資訊,每天學習一點資料分析,讓我們一起做有態度的資料人【大資料部落】大資料部落提供定製化的一站式資料探勘和統計分析諮詢服務

微信客服號:lico_9e

QQ交流群:186388004 大資料部落

【大資料部落】[R語言電商網站爬蟲