DiCE Example for Titanic

Raven
隨筆趣事
Published in
5 min readJun 17, 2023
Photo by Peter Hansen on Unsplash

延續上一篇文章,筆者將透過現實生活中的案例,跑一次DiCE 反事實解釋。

下圖是使用DiCE的流程:

自製

可以看到DiCE 它是直接使用我們訓練好的模型,去產生反事實解釋。

在開始講解程式碼之前,先來看看我們今天的題目:

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 個兄弟姐妹。

Titanic train.csv with survived column
Suvival rates for each title

在特徵工程下,我們可以處理缺失值並從兄弟姐妹和父母欄位中添加列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 參數來控制變化。

Generated counterfactual set

我將 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起來,也可以拍手給我一點鼓勵!

--

--

Raven
隨筆趣事

熱愛寫code,平時遇到有趣的事情,也會上來寫寫,抒發自己的心情。