還在做模型解釋的「隱形人」?解釋NLP模型你應該這樣做

點擊上方關注,All in AI中國

機器學習(ML)和人工智能(AI)改變了商業領域的面貌。許多公司聘請數據科學家(作者是其中之一)來研發數據產品。

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

研發一個"高"精度的引擎是非常容易的(作者重複引用這句話的原因是:https://towardsdatascience.com/how-can-use-player-name-to-predict-world-cup-with-80-accuracy-262d076544c4)。如果有人問為什麼,我們可以說這個模型是黑匣子或者是幾年前的統計計算,但是現在我們不能再說了。我們還需要說服產品團隊和管理層相信我們的模型,但不能簡單地說引擎是從數據中"學習"得來的,或者它是一個無法解釋的黑匣子。

當然,在某些特殊情況下,我們可能不需要解釋模型。例如,你不希望向公眾解釋欺詐檢測模型。否則,公眾可能會找到一種"黑進"系統的方法。

在閱讀本文之後,你將瞭解:

  1. 什麼是模型解釋?
  2. 為什麼我們需要解釋模型?
  3. 解釋NLP模型
  4. 相關
  5. 參照內容。

什麼是模型解釋

模型解釋意味著提供模型背後的理由和邏輯,以使模型具有可靠性和透明性。有許多類型的模型解釋,包括:

  1. 在探索性數據分析(EDA)中,我們可以應用主成分分析(PCA)或t-分佈鄰域嵌入算法(t-SNE)來了解特徵
  2. 在建立模型之後,我們將使用各種測量來檢測分類和迴歸模型。分類中使用的準確性、精確性和查全率,迴歸中使用的均方誤差(MSE)。這種做法有助於我們理解模型的性能。
  3. 除了性能之外,我們還可以從模型中檢索諸如靜態特性摘要(即特徵重要性)。但是,它只存在於隨機森林和XGBoost等決策樹庫算法中。
  4. 在評價模型時,我們想知道為什麼我們對模型的預測是錯誤的。我們可以利用庫來解釋錯誤的原因。

在解釋模型之前,我們可以先了解模型解釋的標準:

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

可解釋性

我們不需要訓練另一個模型來解釋目標。例如,它使用決策樹或線性模型時

該模型類似黑匣子模型,我們需要用另一個模型來解釋它。我們將在下面的部分集中討論這個領域

途徑

特定模型:有些工具僅限於特定模型,如線性模型和神經網絡模型

與模型無關(Model-agnostic):一些工具可以通過構建write-box模型來解釋其他模型。

層次

全局:解釋整體模型,如特性權重。

局部:解釋具體的預測結果

為什麼我們要解釋模型?

如前所述,在大多數場景中我們必須做出解釋,因為:

可追究性。模型有責任向消費者提供(相對)正確的答案。作為一名模型的開發人員,我們應該對模型特性進行驗證,以確保它有助於做出正確的決策,而不是隻專注於盡可能多地包含特性。

透明度。機器學習不是一個黑閘子,我們應該向客戶和管理層提供該模型的透明性。讓他們知道你為什麼這麼做。就像開源一樣,人們更願意使用開源的產品,因為他們知道你在做什麼。

可信賴性。這是消費者使用分類或預測結果的基本要求。在大多數情況下,使用者擁有一些領域知識,例如交易員需要了解你為某一股票做出決策的理由在哪裡。

解釋NLP模型

如你所知,作者主要關注NLP。因此,只演示解釋NLP模型的方法,儘管下面的庫還可以解釋其他問題,如迴歸分析和圖像。

對於下面的演示,為了便於理解,作者沒有做任何預處理。但在現實的商業問題中,我們應該做好預處理。否則,垃圾信息會越來越多。

有幾個庫可以幫助解釋模型,包括"解釋我5歲了(ELI5) https://github.com/TeamHG-Memex/eli5"、"對未知模型的局部解釋(LIME) https://github.com/marcotcr/lime"和"溜冰者(Skater)https://github.com/datascienceinc/Skater"。

作者將演示如何使用ELI5和LIME[1] 以及Skater呢?請繼續關注,這將解釋為什麼作者不在NLP中使用它。

算法:在接下來的演示中,將包括線性模型(scikit-learn中的邏輯迴歸)、集合模型(scikit- learn、XGBoost中的隨機森林)和深度學習模型(在Keras中嵌入自構建字)。對於字嵌入的具體細節,你可以點擊鏈接:https://towardsdatascience.com/3-silver-bullets-of-word-embedding-in-nlp-10fa8f50cc5a。

ELI5

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

ELI5提供了全局模型解釋和局部模型解釋。你可以簡單地將全局模型解釋視為特性的重要性,但它不僅支持諸如隨機森林和XGBoost等決策樹算法,而且還支持所有的scikit學習估計器。

作者將其介紹為全局解釋中置換的重要性。為了計算成績,特徵(一個單詞)將被其他單詞(噪音)所代替並進行預測。這一概念之所以重要是在於它可以通過對特定單詞的評分來表示特徵的重要性。例如,"我喜歡蘋果"。它可能會變成"我喜歡橙色",然後它會對新創建的記錄進行分類,以瞭解"蘋果"有多重要。當然,我們需要假設替換的詞(如橙色)是噪音,它不應該提供重大的分數變化。

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

上圖表示,如果輸入包含"keith",則y=0的分數增加2.138。另一個例子是"the",它將分別在y=1和y=2中分別減少-0.731和-1.387。

對於局部模型解釋,ELI5使用了LIME算法。顯示格式不同於LIME,但使用相同的思想。

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

ELI 5解釋了測試數據,並確定可能是y=0,概率為0.031。同時它還對高分與低分的詞進行了突出。

LIME

正如前面提到的,LIME只關注局部模型解釋和與模型無關的部分。

將訓練好的模型和目標記錄傳遞給LIME庫。然後創建一個 bag-of-words模型(A liner bag-of-words model will be created ),併為模型提供大量生成的記錄。作為二進制分類器的盒子模型表明了詞存在的影響。(The while box model work as a binary classifier indicating the impact of word existence.)例如,"我喜歡蘋果"。它可能會變成"我喜歡",然後它會對新創建的記錄進行分類,以瞭解"蘋果"有多重要。

因此,無論提供的模型是什麼,它也可以通過生成記錄來解釋模型。無論它是scikit-learn庫、XGBoost,甚至Keras字嵌入模型。在作者的示例代碼中,成功的讓sci-kit學習API界面實現了Keras,這樣也可以使用LIME來解釋Keras的字嵌入模型。

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

LIME創建了二進制分類器,因此我們可以看到它表示0、9、15類的權重,同時它還對高分與低分的詞進行了突出。

Skater

對於全局解釋,Skater提供特徵重要性和部分依賴方法。

嘗試了幾次,沒有找到sci-kit學習管道包(provide sci-kit learn pipeline package)的方法。必須將原始文本轉換為numpy格式,並分別傳遞模型。然後,當有大約800個獨特的單詞時,大約需要2分鐘來準備(區分)特性的重要性。

Skater提供每個單詞的特徵重要性。

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

部分依賴[3]是一組數字,用來表示目標和特徵之間的關係(線性的、單調的或複雜的)。可以可視化,我們可以可視化一個特性和目標之間的影響。但是,如果存在NLP,則不能使用部分依賴。

相較於作者而言,Skater包括LIME模型以執行本地文本解釋,因此作者更喜歡本地LIME。

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做

相關

訪問具體代碼請點擊:https://github.com/makcedward/nlp/blob/master/sample/nlp-model_interpretation.ipynb

作為一名數據科學家,我們必須解釋模型的作用,以便獲得團隊和管理層的信任。同時你還需要測試模型。否則你可能不知道你建立了什麼。

對於NLP問題。特徵重要性或排列特徵重要性要求實在太高了。作者不建議在NLP領域過多的使用。

在某些情況下,LIME無法正確解釋模型。例如,當它隨機生成樣本時,每次的分數都可能不同。將有另一篇文章介紹如何解決它。

對於ELI5。在show_weight(全局解釋)中支持 sci-kit learn pipeline,但是在ELI5的show_prediction(局部解釋)中不支持。原因請點擊:https://github.com/TeamHG-Memex/eli5/issues/15 。解決方法是使用LIME。

如果分類器是XGBoost分類器,那麼使用ELI5(版本:0.8)時會出現錯誤。如果你使用XGBoost分類器,由於ELI5 bug (xgb_classifierer .get_booster()),你必須進行一些變通。鏈接:https://github.com/TeamHG-Memex/eli5/issues/259

對於Keras模型,實現了sci-kit學習API界面,但仍然不能使用ELI5。ELI5將檢查對象類型以防止意外。

特別感謝Dipanjan(DJ)Sarkar對Skater的部分補充

參考內容

[1]Marco Tulio Ribeiro,Sameer Singh,Carlos Guestrin。"我為什麼要相信你?"解釋任何分類器的預測。 2016年9月。https:/arxiv.org/pdf/1602.04938.pdf

[2]Breiman Leo教授。"隨機森林",2001年1月。https://www.stat.berkeley.edu/~breiman/randomforest2001.pdf

[3]Friedman,Jerome H.2001。"Greedy Function Approximation: A Gradient Boosting Machine."2001年4月。https://statweb.stanford.edu/~jhf/ftp/trebst.pdf

還在做模型解釋的“隱形人”?解釋NLP模型你應該這樣做


分享到:


相關文章: