You Jump, I Jump? (下)

接著上一篇鐡達尼的文章(link),上回我們利用已知的數據描繪出當時的情況,終於來到劇肉了,可以建立Classification Model去估計生存的機會了。原諒筆者中英夾雜的,始終有些專業名詞翻釋中文有點怪怪的。

Data Visualization
由於數據的維度已超過三維,很難用來一幅圖顯示每一位乘客的分佈,所以我先把所有Input Variables找出兩條Principle Components,然後把每一個乘客(data points)投影在這兩條PCs,而PCs包含了99.87%的Variablility,即是有很少的資訊留失,有一定可信性。從下圖可見,X-axis為PC1,Y-axis為PC2,可見有3點outlier右手邊,他們都買了最貴的船票,並存活下來的頭等乘客,至於需不需要剔走這些Outlier,那就要得看看你的模型因為它們會不會受到好大的影響。




Data Cleansing and Preparation
Cleansing的方法有很多,剛才提到AGE有數個缺失值,來到這部分,我們的目的不再是計算Correlation,而是準備Training Data去訓練我們的模型,所以估算的方法跟剛才的不同。其實最簡單的方法可以把AGE整個attribute忽略,不用作為模型的input,但由於發現年齡跟艙位,親友的數目,船票費用和生存機會,這幾個因素有顯住的正反比關係,即是說:如果我知道某人坐的艙位,陪同他的親友數目,船票費用和是否倖存下來,我便可以估計其年齡,所以在這個程況下我會選擇把沒有年齡的人估算出來,在這裡假設年齡的缺失是因為隨機且正態分怖的,以致我們能夠用Linear Regression Model去推算缺失的年齡,令我們可以把更多的training data去訓練用作分類的模型,同時,儘管一些testing data沒有age值,也能被分類為生存或否。

準備好Data後,終於來到戲肉,建立和訓練我們的模型,筆者一共建立了四個Classification Model,每一個模型的參數首先會先被調好,在Bias和Variance取得一個平衡,以發揮其最大功用,完成後這四個模型會用一些Metrics去評估它們的Performance,使我們能選擇一個最好的模型,然後預測乘客的存活機會。

1. Decision Tree
2. Logistic Regression
3. Support Vector Classifier
4. Naive Bayes Classifier


Decision Tree
無可否認,Decision Tree經常用作分類,因為它相對容易控制和較容易解釋結果,每一條分枝含有一條規則,所以對於最底的節點(Node)即是Leaf Node,要根據數條分枝及合乎相應的規則才可把乘客判斷為生存和死亡。經過一番的調整,Entropy用來計算每個節點的Impurity,決定分枝,樹的最大深度(Max Depth)設定為5,所以根據下圖,你只會看見5層的樹 (包括root node那一層)。
















(按圖放大)
Accuracy: 0.84
F1 score: 0.78


Actual / Predict10
124696
045504

Confusion Matrix可讓我們一目了然地知道有多少個倖存的乘客被分類存活或死亡;死亡的乘客分為存活或死亡。由於我們的目的非常簡單,只要追求最高的分類的準成度,我們無需理會True Positive Rate和False Positive Rate等等。




Logistic Regression
認識Linear Regression的讀者們,也知道這個模型的設定比較少,利用數據訓練每一個Input variable的最優化的(optimal)比重,除了可以觀察那一個Factor最影響Target variable,還可以估計存活的機會,得出的CV Score也有0.8,分數僅次於Decision Tree。唯一值得留意這個模型,很可能出現Underfitting (Bias)的情況,你發現紅色曲線並沒有隨住數據量提升,再多的Data也沒法讓這個模型增加準確度,因此需要增加模型的複雜性或者Input Variable的數量才能讓其Performance更上一層樓,但可惜的是已經沒有更多的Input Variable,所以只好停在這裡。另外,當一些Class variables變成了Dummy variables後,其實會出現變數和變數之間的Interactive effect,為了model這些effect,需要加上Interactive term,但別忘記我們有20個Dummy variables,這會令我們太多的配搭。根據上篇,Dummy variables與其餘的變數雖有但不強的Correlation,所以忽略這些Interactive term仍可接受。


$$y_{survival} = 0.89 + 1.48x_{class1} + 0.4x_{class2} - x_{class3} - 0.92x_{male} + 1.8x_{female} - 0.04x_{age} - 0.39x_{sipsp} - 0.08x_{parch} - 0.41x_{Aticket} + 1.1x_{Cticket} + 0.32x_{CAticket} + 0.3x_{FCticket} + 0.003x_{numticket} + 1.42x_{otherticket} - 0.58x_{PCticket} + 0.38x_{PPticket} - 0.24x_{SCticket} - 1.5x_{SOticket} - 0.02x_{SOTONticket} + 1.4x_{STONticket} - 1.3x_{ware} + 0.003x_{fare} + 0.29x_{embarkC} + 0.25x_{embarkQ} - 0.23x_{embarkS}$$


Accuracy: 0.82
F1 score: 0.76

Actual / Predict10
124597
058491




Support Vector Classifier
Support Vector Machine (SVM) 除了可以預測數字的變數,亦可以作為一個強大的分類器,比起其他模型,能更好的學習現有的數據,有著更佳的準確度,但往往容易遇到過度學習的問題,造成Overfitting,對沒有用作訓練的數據,準確度卻大大降低。幸好地,Regularization Term能控制模型的複雜性,從而解決Overfitting的問題。



從學習曲線中,使用RBF (Radial basis function)來做SVC的Kernel會令模型過度學習Training Data,令Training Score (準確度)很高,但CV Score (Generalization) 卻很低,只有大概只有0.72,所以可以看到兩條曲線之中間有一個較大的空隙,其中一個解決辦法是,把更多的Data放入模型中,令CV Score可以繼續上升下去,可惜已經沒有再多的數據了,不能應用這個方法。至於把Kernel換做Linear function,CV Score提升至0.78,依然較Decision Tree和Logistic Regression這兩個模型遜息。

Accuracy: 0.93
F1 score: 0.91

Actual / Predict10
130042
018531



Naive Bayes Classifier
這個分類器借用了Bayes Theorem,利用預測每一個類別(Class)的機率分佈,但使用Naive Bayes Classifier要多小心,因為這個模型有一個假設:每一個Input Variable均需要相互獨立。在上篇文章,我們看到每一個變數並不是獨立,所以如果所有Features直接放進模型,相信對它的表現會大打折扣,結果顯示,無論是Training或CV Score一樣都只有0.62左右,是四個模型中表現最差的。其實是還有辦法,可以先把所有Input Variable化成相互獨立的Princple Components (PCs),再倒入Bayes Classifier裡,這可滿足它的假設,但缺點是PCs雖然已經盡可能取得最大的Variability,但不是全部,所以或多或少也會失去一些資訊。






Accuracy: 0.77
F1 score: 0.73

Actual / Predict10
126973
0131418


值得留意的是,Bayes Classifier比其他的模型更容易誤把死亡的乘客認作倖存的。


ROC Curve (Receiver Operating Characteristic Curve)



ROC也是一個熱門和常用的工具去評估一個模型,ROC Curve正正用了Sensitivity和Specificity這二個指標,在不同的Cut-off點,這些Model會表現得如何(離左上角越近的點分類準確率越高),可進一步改善和選擇最佳的Cut-off point。從上圖可見,SVC的表現是最好的,其次是Classification Tree。

縱觀所有Model,Decision Tree表現出現較少的Generalization Error,而Cross-Validation的分數最高,能夠適用於大部分的Data,相信會有不錯的準成度,於是我把Testing Data (一共418位乘客) 倒入得出的模型進行預測,於是我把所有預測出來的結果提交上Kaggle,發現結果和預期是一致的:

Kaggle Score:
- Classification Tree: 0.78
- Logistic Regression: 0.76
- SVC (rbf kernel): 0.69
- Bayes Classifier: 0.69

而事實證明樹的預測的確是做得最好的,而SVC(RBF Kernel)雖然在Training Data中的表現最好的,但因為模型較高的Complexity導致過度學習Training Data的關係,未能出色地發揮,不過當數據量非常多的時候,應該會有不錯的結果,另外,Logistic Regression的成績僅次於CTree,不要忘記Logistic Regression的模型複雜性也較其他的來得低,可見較高的Complexity旳Model似乎沒有太大優勢。當然,這還有很多進步的空間,利用Ensemble或Bagging的模型(例如: Random Forest),體驗團結就是力量,把預測準確度提升另一個層次。

筆者在初學Machine Learning這門學科,以為只要有最複雜最強學習能力的模型,便天下無敵。但後來發現這個想法實在太天真,太理想了,每個模型都有其優勢,不足和存在價值,能夠在不同的情況下,如何善用那一個Model才是上上策。希望這一篇文章讓你了解如何由於最開始從原始數據,建模,評估,篩選適合的模型,到最後的預測,讓你有一個更清楚的概念。






Comments