資料分析指北 - 例項示範( 泰坦尼克沉船資料分析之二)

*歡迎關注公眾號 資料分析指北*
資料分析指北 - 例項示範( 泰坦尼克沉船資料分析之二)
決策樹瞭解下?也許它應該是你熟練掌握的第一個機器學習演算法。
前期回顧:
ofollow,noindex">泰坦尼克沉船資料分析之一)
*Engraving by Willy Stöwer: Der Untergang der Titanic*
微信公眾號:資料分析指北
好,我們已經對泰坦尼克沉船資料有了一個基本的瞭解,下一步我們將使用機器學習中的一個簡單演算法建立模型。看看能否通過模型預測一個人是否最終存活下來,並與事實進行對比。
機器學習模型
決策樹
Decision Tree,決策樹是一種機器學習中很常見的演算法。它的目的是從特徵中學習得到一個樹形規則,並根據最終規則來預測目標變數的值。
在維基百科決策樹的詞條中有這樣一個例子,小王是一個高爾夫球場的老闆,他被僱多少臨時工這件事搞的很心煩。如果來高爾夫球場的客戶多,他就會需要更多的員工來服務客戶;但是如果他僱傭了很多的員工,那天來的客戶卻不夠多,那麼他又得給這些人付工資。他觀察到來高爾夫球場的客戶和天氣關係很大,於是就記錄了天氣狀況與球場客戶的數量,並找了專業人員構建了一個決策樹模型,來幫助他決策今天要不要僱傭更多的臨時工。最終他得到的模型是這樣的:

*高爾夫球場決策樹模型*
在這個模型的指導下,小王就可以在很多客人要來時,多僱傭一些臨時工,反之亦然。
決策樹模型有一些明顯的優點和缺點,優點包括:
- 可解釋性。可以看出上面的模型非常容易觀察和解釋,這是一個很大的優勢,現今流行的深度學習模型在可解釋性上就要比一些傳統的模型差很多。
- 訓練需要的資料少,等等。
缺點有: - 模型很可能會過擬合,導致泛化效能差。當然現今有一些剪枝演算法已經可以在一定程度上解決這個問題了。
- 模型可能是不穩定的,原始資料稍微有變化就可能導致產生一棵完全不同的樹模型。一般通過決策樹的整合來緩解這個問題。
擬合、過擬合、以及泛化效能這些概念,是機器學習中重要而且基礎的概念。在這裡簡單舉例說明,假設我們有部分資料,想通過這些資料構建一個函式(模型),資料在下圖中以橘黃色點表示,那麼你可能會構造出多種多樣的模型,比如,構造出左邊的一次函式 \( y=ax+b \), 或是構造出中間的二次函式 \(y=ax^2+bx+c\) 或是構造出最右邊的三次函式 \(y=ax 3+bx 2+cx+d\)。

*擬合、過擬合舉例*
那麼究竟哪個函式更符合需求呢?這一般要看具體情況。在沒有其他資訊的情況下,單從上面的圖來看,我們簡單認為最左邊的圖是 underfitting(中文一般翻譯為欠擬合的),中間是正好的情況,最右邊的是 overfitting(過擬合)的情況。對比使用最左邊圖中的一次函式模型給所有的點建模的情況,中間的二次函式建立的模型誤差要更小。但對於最右邊的模型來說,雖然它的總體誤差要比中間的模型更小(因為它的曲線離所有點的距離都要比中間模型離所有點的距離近),但一般假設我們手頭只有一部分資料,且這部分資料可能含有噪聲,所以這個模型在所有資料的集合(包括我們沒有采集到的資料)上總體誤差要差一些,這個只通過了每一個現有的點的模型是一個過擬合的模型。對現有可見資料擬合程度較高,但擴充套件到未知資料時,擬合誤差較高,這種情況我們就稱這個模型泛化能力不夠。泛化能力的英文稱為 Generalization, 泛化效能強不強從英文意譯過來其實就是指這個模型的通用性強不強。
有可能聰明的你會問,為什麼不能認為中間和左邊的模型都是 underfitting, 而最右邊的模型是 Balanced 的呢?
如果能想到這個問題,那麼恭喜你,我覺得你有非常優秀的批判性思維。沒錯,上面本來就是一個糊里糊塗的解釋,因為如果你要了解一個模型究竟是過擬合、欠擬合還是剛剛好,你不僅需要知道一些具體的情況以及資料來源方面的專業知識(domain knowledge),你還要把所有資料分割成訓練集、測試集兩組(甚至還會有開發集,三組),然後分別在訓練集中構建模型,在測試集中驗證模型,最後選出剛剛好的模型。
如果你沒有問出這個問題,那麼也沒有關係,因為你經過學習、訓練,這些概念遲早會成為你日常工作生活中的一部分 =P。
上面是一個簡單擬合、過擬合舉例。對於我們上面所講的決策樹這個模型來說,它非常容易過擬合,例如:

*決策樹的過擬合舉例*
其中需要注意的點是,如果這天天氣預報是晴,溼度是62,那麼在前面的模型中,預測結果是有很多人會來玩;而在現在這個模型中,得到的預測結果是很少人來玩,後面這個模型在邏輯上可以認為是過擬合了。這個過擬合模型的產生有可能非常簡單,比如,小王收集的資料裡面,就有62,大家都沒人來玩的情況,而這個資料,有可能只是因為這一天是春節,大家都在家和家人團聚這種特殊情況。當然,這種問題也許可以通過收集更多的資料來解決--發現只有偶爾幾次溼度是62的情況沒什麼人來,在大多數情況下大家都是來的;有時這種問題是不能解決的--在某些情況下收集更多資料很困難。
在生活中,有時你會反思,對於一些事情,你想的過於複雜,這種情況就可以理解為 overfitting 了。孔子的學生子貢曾問孔子,子張和子夏哪個人更賢明?孔子回答,子張常常超過周禮的要求,而子夏常常達不到周禮的要求。子貢說,那是不是說超過周禮要求的子張更賢明一些呢?孔子答,過猶不及。其實也是同樣的意思,underfiting 與 overfitting 都是效果一樣,不合格的。
因為決策樹模型非常容易過擬合,所以對於初步構建好的決策樹來說,剪枝(意如其名)演算法對於它是非常重要的步驟。咦,不對,我們不是還沒說如何構建決策樹嗎?沒錯,主要原因是這部分知識相對比較簡單,只需要搞清楚 基尼不純度 或 information gain 資訊增益就基本可以了。
至於剪枝(Pruning),有前剪枝和後剪枝兩類。前剪枝就是在樹的構建時設定一個閾值,比如樹的深度,如果樹的深度超過了某一個值,我們就不再對此節點進行劃分;後剪枝中的MDL(minimum description length)是 KNIME 的 decision tree 模組中可以選擇的方法。
KNIME 中的決策樹模組
KNIME的機器學習模組一般都分為兩個部分,一部分是 XXXX Learner
,一部分是 XXXX Predictor
,Learner 學習到模型之後,把模型和測試資料再塞給 Predictor 就完成了一次學習與預測的過程。我們先來看 Decision Tree Learner。

*KNIME 中的Decision Tree相關節點*
在 Node Repository 中搜索 decision 之後,我們看到了一系列和 Decision Tree 相關的模組,有一些是一望可知的模組,比如 Decision Tree View(JavaScript),Decision Tree To Image用於輸出 Decision Tree 圖形,而帶 Regression 字樣的模組都是做迴歸的(上面演示的Decision Tree都是做分類的,也可以用它做迴歸);還有一些都是 Ensemble 型別的演算法,所謂 Ensemble(整合)就是訓練多個分類器,然後把這些分類器組合起來,達到更好的預測效能,簡單來說就是,三個臭皮匠,頂一個諸葛亮。各種 Boosting 以及 Random Forest 都屬於整合學習的範疇,整合學習因為是多個分類器的組合,不容易過擬合,所以泛化效能相對來說就強一些,但由於是多個分類器的組合,所以在模型的可解釋性方面要稍微弱一些。我們今天的主角 Decision Tree Learner 的配置如下:

*泰坦尼克號船難的Decision Tree配置*
通過其中 Class column
選出模型需要預測的列, Quality Measure
選擇 基尼不純度 或是 熵 都可以,這兩者可以近似替代,我傾向於使用度量資訊量的熵, Pruning method
選擇剪枝演算法,MDL或是No Pruning(不選剪枝,不推薦),其餘的,預設選項即可。
配置完成之後,即可對測試集資料進行訓練,右鍵節點選擇 View: Decision Tree View
獲得如下決策樹。

*泰坦尼克沉船資料的Decision Tree結果*
對於泰坦尼克沉船資料來說,在我們的簡單配置下,學習得到的 Decision Tree 結果和上面預測打高爾夫球的決策樹並沒有什麼不同,只是多了一些更詳細的說明。從第一個根節點往下,首先判斷的是 Sex,如果是 male 男性,那麼直接預測他死亡(0),如果是 female 女性,先預測她活著,然後根據 SibSp (同在船上的兄妹及配偶的數量)以及 Parch(同在船上的父母或子女的數量)來進一步預測這個人的生存情況。但從邏輯上來看,生存與否的確和性別以及親屬的數量相關,模組學習得到的結果是符合預期的,也沒有觀察到過擬合的 Decision Tree 節點,所以這個粗糙的模型我們是認可的,可以做為其他機器學習方法的一個基準。我們現在還沒有在另外的資料集上驗證這個模型,但卻已經認可了這個基準模型,這種情況是不多見的,這是可解釋性模型的一個優點。

*泰坦尼克沉船資料的Decision Tree View中的一個節點*
讓我們再仔細觀察Decision Tree中的一個具體節點,來了解節點中的資料。其中 0(320/397)
代表了這個節點預測結果為0(死亡),落入這個節點的資料一共有397人,其中320人符合我們的模型預期。節點中部的 Table 部分描述了符合節點預測以及不符合節點預測的具體資料以及比例,節點下部的 Chart部分,以視覺化的形式,描述了同樣的資料。值得注意的是,因為在整個 workflow 中,在上游節點我們使用了 Color Manager 對資料進行標記(生存1標記為綠色,死亡0標記為紅色),所以這裡的視覺化會非常的清晰明瞭。
我們接下來看一下這個模型在測試集上的效果。接入 Decision Tree Predictor 與 Scorer 模組,如下圖所示:

*預測測試集資料並進行評價*
在資料進入 Decision Tree Learner 和 Decision Tree Predictor 之前,有一個叫做 Partitioning 的模組,這個模組是用來分割原始資料集的,我們把其中的一部分資料(通常稱為訓練集,大約佔總資料百分之七十)送給 Learner 模組,把另外的一部分資料(通常稱為測試集,大約佔總資料百分之三十)送給 Predictor 模組,最後接入 Scorer 模組來考察模型在測試集上的表現。圖中最右邊是 Scorer 節點的模組配置。

*模型評價結果*
當執行完整個 Workflow 之後,我們右鍵 Scorer 模組,選擇 View: Confusion Matrix,得到上面的評價結果。因為這是一個分類問題的模型,所以有實際為1預測為1、實際為1預測為0、實際為0預測為1、實際為0預測為0,這四種情況,將四種情況的資料按照矩陣列寫就稱為 Confusion Matrix。對於泰坦尼克這個具體問題來說,1和0的地位是平等的,所以只看左下角的 Accuracy (準確率)結果就可以。但對於某些問題來說,1和0的地位是不平等的,比如在癌症預測時,預測為癌症(假設為1)與沒有癌症(假設為0)這兩種預測結果來說,人的承受能力是不一樣的,如果實際這個人沒有癌症,但預測為有癌症,那麼這個誤診不是那麼嚴重,但如果實際這個人有癌症,但預測為沒有癌症,耽誤了最佳診療時間,那麼這個誤診就比較嚴重了。在這種時候,看這個模型的準確率是沒有太大意義的,需要另外設計其他指標進行模型評價。
我們沒有做任何事情,只是把 Decision Tree 這麼一擺,在自己劃分的測試集上就獲得了 79.8% 的準確率,如果原始問題是一個值得深入的問題,那麼這個準確率就是我們接下來工作的 Baseline。要麼用更高階的演算法,要麼收集資料,要麼調整現有模型引數,這就是另外的話題了。
對於之前所說的 Kaggle 入門比賽來說,你需要把真正的測試集(而不是我們在這裡劃分的測試集)下載下來,然後將預測結果輸出成 CSV,並上傳到 Kaggle 網站上看你的最終結果。這部分作業,有興趣的話,自己做咯。
至此,我們通過泰坦尼克沉船資料,已經從分析到預測走了一整個流程,也希望你能夠靜下心來自己做做看。
另外,雖然我們在整個過程中用的機器學習演算法不是很 fancy, 也不夠 state-of-the-art,但決策樹這個模型,絕對值得成為你機器學習工具箱中的第一把有力工具。
如果想要實驗一下泰坦尼克沉船資料的決策樹例子,請關注公眾號"資料分析指北",回覆"作業"獲取下載連結。
回頭聊
給贊是支援,轉發是更大的支援
