The practical guide to Random Forests – Big Data Exploration Part I
(Using Kaggle’s Titanic Data with R code)


根據全球最大的Data Science競賽平台 Kaggle的數據統計(https://www.import.io/post/how-to-win-a-kaggle-competition/), Random Forests演算法是眾多競賽贏家的終極武器(2015年底後異軍突起的XGboost, 將另外專文介紹)(如果不清楚Kaggle這個網站, 可參考遠見雜誌的這篇報導http://www.gvm.com.tw/Boardcontent_23287.html )。這系列的3Posts, 將透過KaggleTitanic競賽資料(https://www.kaggle.com/c/titanic/data), 詳細介紹Random Forests演算法的原理, 以及建立Random Forests模型的程式撰寫與參數設定。程式範例的內容是參考Kaggle's Titanic Competition 4R tutorials (https://www.kaggle.com/c/titanic/details/new-getting-started-with-r )其中Trevor Stephens的文章整理而成。

首篇Post從所有Data Science競賽或專案的第一步 Data Exploration方法說起。Trevor Stephens原文使用R內建的基礎functionsdata.frame, 進行資料的整理與分析; 我改以R新開發, Big Data的分析運作與效能上大幅提升的package - data.table, 進行數據的探勘, 並透過此篇文章, 讓各位了解data.table的相關操作指令。相信讀完此篇之後, 各位將可以改用data.table進行數據分析工作, 而且隨著數據量的增加, 將越加感受到data.table所帶來的便利與效益。第二篇Post介紹Random Forests的基礎演算法 - CART模型(https://en.wikipedia.org/wiki/Decision_tree_learning ), 最後一篇討論本系列文章的核心技術Random Forests. 所有的內容都輔以R原始碼並附上執行結果畫面, 各位可以開啟R console介面一併操作驗證。





Data Read/Write

請先到KaggleTitanic競賽首頁(https://www.kaggle.com/c/titanic/data),下載競賽資料。如果你還沒註冊請先註冊後就可以登入下載。下載資料共有2csv, train.csv為用以模型訓練的資料, test.csv則是要進行預測的資料。下載完成, R介面開啟, 使用read.csv指令將資料匯入R環境。以下範例程式是假設檔案放置在D:\IDE\R\Titan\目錄下。
train <- read.csv("D:/IDE/R/Titan/train.csv")
str(train)


我們使用str指令檢視匯入後的資料結果; 從上圖結果我們可以取得相關資訊如:
1. read.csv指令匯入後的資料型態為data.frame
2. 共有891筆資料(obs), 12個欄位參數(variables)
3. 每個欄位參數的資料型態(int,Factor,num等)以及前幾筆資料內容

每個欄位參數的定義,各位可自行參考Kaggle的Titanic競賽頁面的說明。

我們先使用簡單的分析方法, 產生預測結果, Demo如何建立回覆/upload/submit至Kaggle比賽的檔案。首先,使用table和prop.table指令,檢視training set中,整體人員的存活率(1=Survived/生還),
table(train$Survived)
prop.table(table(train$Survived))








總共有342人生還, 存活比率大約為38%. 我們直接設定所有test set的人員都沒有生還,這樣預測命中率, 根據training set的數據應該會有62%.
test <- read.csv("D:/IDE/R/Titan/test.csv")
test$Survived <-0
接下來, 將預測結果產生csv檔。要注意的是, csv檔欄位需包含PassengerId, 但是不能有row numbers, 否則Kaggle會拒絕你的結果遞交。
submit <- data.frame(PassengerId = test$PassengerId, Survived = test$Survived)
write.csv(submit, file = "AllGone.csv",row.names = FALSE)

Introduction to data.table

上一章節提到, 使用read.csv匯入的資料結構為data.frame。data.frame是R內建的基本資料結構之一, data.frame是R一個非常powerful且重要的基礎Component,許多分析模型都是以data.frame做為輸入的參數或是運作的元件。現在, R出現了一個更powerful的資料結構 - data.table. data.table是以data.frame為基礎開發出來的新資料結構元件, 它和data.frame很像, 但卻提供一個更快速、更便利、且更直覺性(intuitive)的數據操作(data manipulation)介面。data.table在資料彙整(data aggregation)方面提供更強大的功能, 其在巨量數據的環境下更展現遠高於傳統data.frame所能提供之效能。假設今天要進行一個超過100GB的數據加總運算, 使用data.frame將耗費很多等待的時間; data.table不僅僅能降低數據運算的時間, 同時因為其便利的彙整functions, data.table亦能降低我們程式開發的時間(https://www.datacamp.com/community/tutorials/data-table-r-tutorial)

要使用data.table十分簡單, 首先,安裝data.table libraray; 然後,透過as.data.table指令將匯入之trainning set - train資料結構轉換成data.table. 我們將轉換成data.table之trainning set取名為dtTrain
install.packages("data.table")
library(data.table)
dtTrain = as.data.table(train)
dtTrain




直接鍵入dtTrain就可以檢視資料內容。與data.frame一次將全部的資料擷取不同的是, data.table只會show出前5筆和最後5筆的資料。這種方式是一種更為便捷的資料展現模式, 尤其是在資料數據非常繁多的情況下, 一個簡單的指令就可以快速地讓我們獲得整體資料集的概念; 如果各位和我一樣習慣使用Toad或Management Studio檢視Oracle/SQL Server資料庫數據,就會對於data.table這功能感到多麼的親切與方便了! 數據展現模式是data.table這個package所提供的第一個benefit.

Get a range of rows and grab multiple columns

data.table的資料選取指令與SQL邏輯是十分相似。data.table的標準操作指令為:

     DT[i,j,by]
n   i SQL指令中的WHERE邏輯, 用以進行數據篩選
n   jSQL指令中的SELECT邏輯, 用以決定哪些欄位(variable)資料要展現
n   bySQL指令中的SELECT邏輯, 用以進行數據彙整操作

使用此操作指令, 我們可以理解為, 針對DT此數據集, 篩選出i筆子數據集(subset),然後計算j欄位數據, 依照by設定之彙整邏輯。
    我們一個一個來看看上列的操作方式。


查看Titanic資料1-10筆的Age數據
dtTrain[1:10,Age]
查看Titanic資料1-10筆數據, 只看Name,Age,Sex三個欄位
dtTrain[1:10,list(Name,Age,Sex)]
Titanic資料中, Age欄位並非所有的數據都有值, 沒有數值的數據, R會以NA表示; 如果想看有哪些資料其Age是NA數據, 可以使用is.na這個指令.
dtTrain[is.na(Age),list(Name,Age,Sex)]
我習慣將上列程式碼理解為如下SQL:
SELECT Name,Age,Sex  
FROM dtTrain  
WHERE Age is NA  #一般SQL指令會是 IS NULL


上圖範例中, 我一併使用原data.frame資料結構的train變數進行資料展示操作, 以讓各位了解兩者之間的欄位選取的指令差異。summary指令可以看出Age欄位共有177筆NA資料。

Data Filtering and Sorting

接下來我們將進行資料的篩選與排序

選取Age > 30的資料(WHERE Age > 30)
dtTrain[Age>30,list(Name,Age,Sex,Pclass)]
選取Sexfemale 的資料(WHERE Sex = “female”)
dtTrain[Sex=="female",list(Name,Age,Sex,Pclass)]
多個篩選條件時,可以進行AND(使用 & )OR(使用 | )運算
dtTrain[Pclass==1 & Age==35,list(Name,Age,Sex,Pclass)]
dtTrain[Pclass==1 | Age==35,list(Name,Age,Sex,Pclass)]



依據Age欄位降冪排序(ORDER BY Age)
dtTrain[order(Age),list(Name,Age,Sex,Pclass)] 
依據Age欄位升冪排序,Sex欄位降冪排序(ORDER BY Age DESC, Sex)
dtTrain[order(-Age,Sex),list(Name,Age,Sex,Pclass)]



Data Exploration Part I 先在此做一個結束; 下一個Part會介紹data.table最為強大的data aggregation能力, 並且運用此功能進行Titanic 資料集做更進一步的分析。

by J.D.