在開始講解程式碼之前,先來看看我們今天的題目:
Mr. 如何從Titanic事故中倖存下來?
Titanic事故發生在 1912 年。皇家郵輪 Titanic在北大西洋與一座冰山相撞後沉沒,這艘船從南安普敦到紐約市的處女航進行了四天。不幸的是,船上沒有足夠的救生艇,導致估計 2224 名乘客中有 1502 人死亡。
現在有趣的事,是將 DiCE 應用於Titanic數據集,並驗證什麼樣的人更有可能從沉船中倖存下來。在這邊我只使用數據集的 train.csv。[1]
你可以註冊 Kaggle 來獲取 train.csv。
您可能已經知道,與 Mrs 和 Miss 等其他頭銜相比,Mr 頭銜的存活率相對較低。所以我的問題是什麼條件可以用假設的例子來拯救一位Mr.,特別是如果你是男人(如果你是數據中第一列的人Braud,Mr. Owen Harris ,22 歲男子,pclass 3,有 1 個兄弟姐妹。
在特徵工程下,我們可以處理缺失值並從兄弟姐妹和父母欄位中添加列family_size。
使用 Keras 訓練模型後,我們必須將訓練好的模型提供給 DiCE 模型對象,如下所示。 現在我們已準備好使用數據集d 和 模型 m 進行 DiCE,以實例化 DiCE 生成反事實解釋。
請注意,需要分別為模型庫類型、TensorFlow 1.x、TensorFlow 2.x 或 PyTorch 提供後端參數。
下面的 backend 表示我們要使用的 DiCE 的實現類型。 我們在 backend=’TF1' 代表使用 TensorFlow 1.x。 您可以將後端設置為“TF2”或“PYT”,以分別將 DiCE 與 TensorFlow 2.x 或 PyTorch 一起使用。
使用 DiCE 生成反事實非常簡單。 從這個隨機結果來看,第一和第二個例子仍然是男性,與樣本人“Braud,Mr. Owen Harris”本人年齡相同。
第三個和第四案例產生悖論: 說明如果他的是女性或Master,或者他有10個兄弟姐妹,那麼他可能會純活下來。
現在讓我們先不要考慮更改反事實的稱號或兄弟姐妹/父母的數量。現在通過使用 features_to_vary 參數來控制變化。
我將 proximity設定成1.5 (默認值 0.5) 和 features_to_vary 配置為僅 4 個特徵(Pclass、Age、Fare、Embarked)。 因此,反事實示例不會改變 Sex, Family thing 和 Title。
這種優化在某種程度上似乎合理。 第三個例子顯示,如果他能支付更高的 14.01(接近 pclass 2 中值)並且登船地點是瑟堡(C)而不是南安普敦(S),他可能會得救。 其餘三個案例說明嬰兒或兒童在這種情況下顯然有可能獲救。
Titanic DiCE 反事實程式碼
結論
總結來說DiCE有以下特色:
優點:
- 不需直接使用訓練資料或是模型,而是利用模型的預測能力
- 非常直觀清楚
缺點:
- 需要建立好模型,做機器學習的步驟
- 模型的好壞,決定反事實的可信度,同時DiCE也需要超參數
- 資料集太小會失敗
若有任何錯誤或要討論的地方,非常歡迎與我聯繫。以下是我的LinkedIn:
https://www.linkedin.com/in/ray-huang-a01a5a171/
歡迎大家follow起來,也可以拍手給我一點鼓勵!