模型可解釋性方面的研究,在近兩年的科研會議上成為關注熱點,因為大家不僅僅滿足於模型的效果,更對模型效果的原因產生更多的思考,這樣的思考有助於模型和特徵的最佳化,更能夠幫助更好的理解模型本身和提升模型服務質量。本文對機器學習模型可解釋性相關資料彙總survey。
綜述
機器學習業務應用以輸出決策判斷為目標。可解釋性是指人類能夠理解決策原因的程度。機器學習模型的可解釋性越高,人們就越容易理解為什麼做出某些決定或預測。模型可解釋性指對模型內部機制的理解以及對模型結果的理解。其重要性體現在:建模階段,輔助開發人員理解模型,進行模型的對比選擇,必要時最佳化調整模型;在投入執行階段,向業務方解釋模型的內部機制,對模型結果進行解釋。比如基金推薦模型,需要解釋:為何為這個使用者推薦某支基金。
機器學習流程步驟:收集資料、清洗資料、訓練模型、基於驗證或測試錯誤或其他評價指標選擇最好的模型。第一步,選擇比較小的錯誤率和比較高的準確率的高精度的模型。第二步,面臨準確率和模型複雜度之間的權衡,但一個模型越複雜就越難以解釋。一個簡單的線性迴歸非常好解釋,因為它只考慮了自變數與因變數之間的線性相關關係,但是也正因為如此,它無法處理更復雜的關係,模型在測試集上的預測精度也更有可能比較低。而深度神經網路處於另一個極端,因為它們能夠在多個層次進行抽象推斷,所以他們可以處理因變數與自變數之間非常複雜的關係,並且達到非常高的精度。但是這種複雜性也使模型成為黑箱,我們無法獲知所有產生模型預測結果的這些特徵之間的關係,所以我們只能用準確率、錯誤率這樣的評價標準來代替,來評估模型的可信性。
事實上,每個分類問題的機器學習流程中都應該包括模型理解和模型解釋,下面是幾個原因:
模型改進:理解指標特徵、分類、預測,進而理解為什麼一個機器學習模型會做出這樣的決定、什麼特徵在決定中起最重要作用,能讓我們判斷模型是否符合常理。一個深度的神經網路來學習區分狼和哈士奇的影像。模型使用大量影像訓練,並使用另外的一些影像進行測試。90%的影像被準確預測,這值得我們高興。但是在沒有計算解釋函式(explainer function)時,我們不知道該模型主要基於背景:狼影像通常有一個下雪的背景,而哈士奇的影像很少有。所以我們不知不覺地做了一個雪地探測器,如果只看準確率這樣的指標,我們就不會看到這一點。知道了模型是如何使用特徵進行預測的,我們就能直覺地判斷我們的模型是否抓住了有意義的特徵,模型是或否能泛化到其他樣本的預測上。
模型可信性與透明度:理解機器學習模型在提高模型可信度和提供審視預測結果透明度上是非常必要的,讓黑箱模型來決定人們的生活是不現實的,比如貸款和監獄刑法。另一個對機器學習結果可信度提出質疑的領域是藥品,模型結果會直接決定病人的生與死。機器學習模型在區分惡性腫瘤和不同型別的良性腫瘤方面是非常準確的,但是我們依然需要專家對診斷結果進行解釋,解釋為什麼一個機器學習模型將某個患者的腫瘤歸類為良性或惡性將大大幫助醫生信任和使用機器學習模型來支援他們工作。長久來看,更好地理解機器學習模型可以節省大量時間、防止收入損失。如果一個模型沒有做出合理的決定,在應用這個模型並造成不良影響之前,我們就可以發現這一點。
識別和防止偏差:方差和偏差是機器學習中廣泛討論的話題。有偏差的模型經常由有偏見的事實導致,如果資料包含微妙的偏差,模型就會學習下來並認為擬合很好。一個有名的例子是,用機器學習模型來為囚犯建議定罪量刑,這顯然反映了司法體系在種族不平等上的內在偏差。其他例子比如用於招聘的機器學習模型,揭示了在特定職位上的性別偏差,比如男性軟體工程師和女性護士。機器學習模型在我們生活的各個層面上都是強有力的工具,而且它也會變得越來越流行。所以作為資料科學家和決策制定者來說,理解我們訓練和釋出的模型如何做出決策,讓我們可以事先預防偏差的增大以及消除他們,是我們的責任。
可解釋性特質:
重要性:瞭解“為什麼”可以幫助更深入地瞭解問題,資料以及模型可能失敗的原因。
分類:建模前資料的可解釋性、建模階段模型可解釋性、執行階段結果可解釋性。
範圍:全域性解釋性、區域性解釋性、模型透明度、模型公平性、模型可靠性。
評估:內在還是事後?模型特定或模型不可知?本地還是全域性?
特性:準確性、保真性、可用性、可靠性,魯棒性、通用性等。
人性化解釋:人類能夠理解決策原因的程度,人們可以持續預測模型結果的程度標示。
動機
在工業界中,資料科學或機器學習的主要焦點是更偏“應用”的解決複雜的現實世界至關重要的問題,而不是理論上有效地應用這些模型於正確的資料。機器學習模型本身由演算法組成,該演算法試圖從資料中學習潛在模式和關係,而無需硬編碼固定規則。因此,解釋模型如何對業務起作用總是會帶來一系列挑戰。有一些領域的行業,特別是在保險或銀行等金融領域,資料科學家通常最終不得不使用更傳統的機器學習模型(線性或基於樹的)。原因是模型可解釋性對於企業解釋模型所採取的每個決策非常重要。
殘酷的現實是,如果沒有對機器學習模型或資料科學pipeline如何運作的合理理解,現實中的專案很少成功。現實中的資料科學專案,通常會有業務和技術兩方面。資料科學家通常致力於構建模型併為業務提供解決方案。但是,企業可能不知道模型如何工作的複雜細節。
資料科學從業者將知道存在典型的模型可解釋性與模型效能權衡。這裡需要記住的一點是,模型效能不是執行時或執行效能,而是模型在決策中的準確程度。有幾種模型,包括簡單的線性模型甚至是基於樹的模型,它們可以很容易地解釋模型為獲得特定的洞察力或預測而做出的決策,但是你可能需要犧牲模型效能,因為它們總是不能產生最好的結果是由於高偏差(線性模型)或高方差的固有問題,導致過度擬合(完全成長的樹模型)。更復雜的模型,如集合模型和最近的深度學習模型系列通常會產生更好的效能,但被認為是黑盒模型,因為很難解釋模型如何真正做出決定。
理解模型可解釋性
模型解釋作為一個概念仍然主要是理論和主觀的。任何機器學習模型的核心都有一個響應函式,它試圖對映和解釋獨立(輸入)自變數和(目標或響應)因變數之間的關係和模式。當模型預測或尋找見解時,需要做出某些決定和選擇。模型解釋試圖理解和解釋響應函式所做出的這些決定,即what,why以及how。模型解釋的關鍵是透明度,質疑能力以及人類理解模型決策的難易程度。模型解釋的三個最重要的方面解釋如下。
是什麼驅動了模型的預測?我們應該能夠查詢我們的模型並找出潛在的特徵互動,以瞭解哪些特徵在模型的決策策略中可能是重要的。這確保了模型的公平性。
為什麼模型會做出某個決定?我們還應該能夠驗證並證明為什麼某些關鍵特徵在預測期間驅動模型所做出的某些決策時負有責任。這確保了模型的可靠性。
我們如何信任模型預測?我們應該能夠評估和驗證任何資料點以及模型如何對其進行決策。對於模型按預期工作的關鍵利益相關者而言,這應該是可證明且易於理解的。這確保了模型的透明度。
在比較模型時,除了模型效能之外,如果模型的決策比其他模型的決策更容易理解,那麼模型被認為比其他模型具有更好的可解釋性。
可解釋性的重要性
在解決機器學習問題時,資料科學家往往傾向於關注模型效能指標,如準確性,精確度和召回等等(毫無疑問,這很重要!)。這在大多數圍繞資料科學和機器學習的線上競賽中也很普遍。但是,指標只能說明模型預測決策的部分故事。隨著時間的推移,由於環境中的各種因素導致的模型概念漂移,效能可能會發生變化。因此,瞭解推動模型採取某些決策的因素至關重要。
如果一個模型工作得很好,為什麼還要深入挖掘呢?在解決現實世界中的資料科學問題時,為了讓企業信任您的模型預測和決策,他們會不斷提出“我為什麼要相信您的模型?”這一問題,這一點非常有意義。如果一個人患有癌症或糖尿病,一個人可能對社會構成風險,或者即使客戶會流失,您是否會對預測和做出決策(如果有的話)感到滿意?也許不是,如果我們能夠更多地瞭解模型的決策過程(原因和方式),我們可能會更喜歡它。這使我們更加透明地瞭解模型為何做出某些決策,在某些情況下可能出現的問題,並且隨著時間的推移它有助於我們在這些機器學習模型上建立一定程度的信任。
瞭解預測背後的原因在評估信任方面非常重要,如果計劃基於預測採取行動,或者選擇是否部署新模型,那麼這是至關重要的。
無論人類是直接使用機器學習分類器作為工具,還是在其他產品中部署模型,仍然存在一個至關重要的問題:如果使用者不信任模型或預測,他們就不會使用它。
這是我們在本文中多次討論的內容,也是決定資料科學專案在行業中取得成功的關鍵區別之一。這推動了模型解釋的必要性和重要性的緊迫性。
可解釋性的標準
有一些特定的標準可用於分類模型解釋方法。Christoph Molnar,2018年“可解釋的機器學習,製作黑箱模型可解釋指南”中提到了一個很好的指南。
內在還是事後?內在可解釋性就是利用機器學習模型,該模型本質上是可解釋的(如線性模型,引數模型或基於樹的模型)。事後可解釋性意味著選擇和訓練黑匣子模型(集合方法或神經網路)並在訓練後應用可解釋性方法(特徵重要性,部分依賴性圖)。我們將更多地關注我們系列文章中的事後模型可解釋方法。
模型特定或模型不可知?特定於模型的解釋工具非常特定於內在模型解釋方法,這些方法完全依賴於每個模型的功能和特徵。這可以是係數,p值,與迴歸模型有關的AIC分數,來自決策樹的規則等等。與模型無關的工具與事後方法更相關,可用於任何機器學習模型。這些不可知方法通常透過分析(和輸入的擾動)特徵輸入和輸出對來操作。根據定義,這些方法無法訪問任何模型內部,如權重,約束或假設。
本地還是全域性?這種解釋分類討論瞭解釋方法是解釋單個預測還是整個模型行為?或者如果範圍介於兩者之間?我們將很快談論全球和地方的解釋。
可解釋性的範圍
如何定義可解釋性的範圍和界限?一些有用的方面可以是模型的透明度,公平性和責任性。全域性和區域性模型解釋是定義模型解釋範圍的明確方法。
全域性可解釋:就是試圖理解“模型如何進行預測?”和“模型的子集如何影響模型決策?”。要立即理解和解釋整個模型,我們需要全域性可解釋性。全域性可解釋性是指能夠基於完整資料集上的依賴(響應)變數和獨立(預測變數)特徵之間的條件互動來解釋和理解模型決策。嘗試理解特徵互動和重要性始終是理解全球解釋的一個很好的一步。當然,在嘗試分析互動時,在超過兩維或三維之後視覺化特徵變得非常困難。因此,經常檢視可能影響全域性知識模型預測的模組化部分和特徵子集會有所幫助。全域性解釋需要完整的模型結構,假設和約束知識。
區域性解釋:試圖理解“為什麼模型為單個例項做出具體決策?”和“為什麼模型為一組例項做出具體決策?”。對於本地可解釋性,我們不關心模型的固有結構或假設,我們將其視為黑盒子。為了理解單個資料點的預測決策,我們專注於該資料點並檢視該點周圍的特徵空間中的區域性子區域,並嘗試基於該區域性區域理解該點的模型決策。本地資料分佈和特徵空間可能表現完全不同,並提供更準確的解釋而不是全域性解釋。區域性可解釋模型 - 不可知解釋(LIME)框架是一種很好的方法,可用於模型不可知的區域性解釋。我們可以結合使用全域性和區域性解釋來解釋一組例項的模型決策。
模型透明度:為試圖理解“如何根據演算法和特徵建立模型?”。我們知道,通常機器學習模型都是在資料特徵之上利用演算法來構建將輸入對映到潛在輸出(響應)的表示。模型的透明度可能試圖瞭解模型的構建方式以及可能影響其決策的更多技術細節。這可以是神經網路的權重,CNN濾波器的權重,線性模型係數,決策樹的節點和分裂。但是,由於業務可能不太精通這些技術細節,因此嘗試使用不可知的區域性和全域性解釋方法來解釋模型決策有助於展示模型透明度。
可解釋性的作用
對於想要了解模型如何工作的資料科學家來說,評估模型的準確性通常是不夠的。資料科學家通常想知道模型輸入變數如何工作以及模型的預測如何根據輸入變數的值而變化。
機器學習演算法和模型的工程應用中用到最多的主要是樹類模型(lgb,xgb)和神經網路(cnn, rnn),使用者往往習慣於很少去思考其中的含義和解釋性。需要思考一個模型的哪些東西是可解釋的?
所以有幾個問題值得討論:
哪些特徵在模型看到是最重要的?
關於某一條記錄的預測,每一個特徵是如何影響到最終的預測結果的?
從大量的記錄整體來考慮,每一個特徵如何影響模型的預測的?
為什麼這些解釋資訊是有價值的呢:
除錯模型用
一般的真實業務場景會有很多不可信賴的,沒有組織好的髒資料。你在預處理資料時就有可能加進來了潛在的錯誤,或者不小心洩露了預測目標的資訊等,考慮各種潛在的災難性後果,debug的思路就尤其重要了。當你遇到了用現有業務知識無法解釋的資料的時候,瞭解模型預測的模式,可以幫助你快速定位問題。指導工程師做特徵工程
特徵工程通常是提升模型準確率最有效的方法。特徵工程通常涉及到到反覆的操作原始資料(或者之前的簡單特徵),用不同的方法來得到新的特徵。有時候你完成FE的過程只用到了自己的直覺。這其實還不夠,當你有上百個原始特徵的時候,或者當你缺乏業務背景知識的時候,你將會需要更多的指導方向。如何創造出這樣優秀的特徵呢?如何找到最重要的特徵的方法,並且可以發現兩個特別相關的特徵,當面對越來越多的特徵的時候,這些方法就會很重要啦。指導數據採集的方向
對於網上下載的資料集你完全控制不了。不過很多公司和機構用資料科學來指導他們從更多方面收集資料。一般來說,收集新資料很可能花費比較高或者不是很容易,所以大家很想要知道哪些資料是值得收集的。基於模型的洞察力分析可以教你很好的理解已有的特徵,這將會幫助你推斷什麼樣子的新特徵是有用的。指導人們做決策
一些決策是模型自動做出來的,雖然亞馬遜不會用人工來決定展示給你網頁上的商品,但是很多重要的決策是由人來做出的,而對於這些決定,模型的洞察力會比模型的預測結果更有價值。建立模型和人之間的信任
很多人在做重要決策的時候不會輕易的相信模型,除非他們驗證過模型的一些基本特性,這當然是合理的。實際上,把模型的可解釋性展示出來,如果可以匹配上人們對問題的理解,那麼這將會建立起大家對模型的信任,即使是在那些沒有資料科學知識的人群中。
方法
模型效果評估指標圖
Confusion Matrix
一個完美的分類模型就是,如果一個客戶實際上屬於類別 good,也預測成good,處於類別 bad,也就預測成 bad。實際上一些是 good 的客戶,根據我們的模型,卻預測他為 bad,對一些原本是 bad 的客戶,卻預測他為 good。我們需要知道,這個模型到底預測對了多少,預測錯了多少,混淆矩陣就把所有這些資訊,都歸到一個表裡:
Sensitivity(覆蓋率,True Positive Rate)= 正確預測到的正例數 / 實際正例總數;Recall (True Positive Rate,or Sensitivity) =true positive/total actual positive=d/c+d;
PV+ (命中率,Precision, Positive Predicted Value) = 正確預測到的正例數 / 預測正例總數;Precision (Positive Predicted Value, PV+) =true positive/ total predicted positive=d/b+d;
Specificity (負例的覆蓋率,True Negative Rate) = 正確預測到的負例個數 / 實際負例總數;Specificity (True Negative Rate) =true negative/total actual negative=a/a+b;
圖中關於混淆矩陣結果理解:recall:0.54;precision:0.915;specificity:0.95;
Lift
它衡量的是,與不利用模型相比,模型的預測能力 “變好” 了多少。實質上它強調的是投入與產出比。不利用模型,我們只能利用 “正例的比例是 c+d/a+b+c+d” 這個樣本資訊來估計正例的比例(baseline model),而利用模型之後,我們不需要從整個樣本中來挑選正例,只需要從我們預測為正例的那個樣本的子集(b+d)中挑選正例,這時預測的準確率為 d/b+d。
顯然,lift(提升指數)越大,模型的執行效果越好。如果這個模型的預測能力跟 baseline model 一樣,那麼 d/b+d 就等於 c+d/a+b+c+d(lift 等於 1),這個模型就沒有任何 “提升” 了(套一句金融市場的話,它的業績沒有跑過市場)。
ROC曲線 & PR曲線 & KS曲線
實際應用中,通常是先基於訓練好的分類器得出測試樣本的預測機率,然後將該測試樣本的預測機率與給定的閾值進行比較,若該預測機率大於給定閾值,則將該測試樣本劃分為正類,反之則將其劃分為反類。對於不同的分類任務,該分類閾值的取值也是不一樣的。
ROC曲線(The Receiver Operating Characteristic Curve)給出的是不同分類閾值情況下真正率(TPr)和假正率(FPr)的變化曲線。PR曲線(Precision-Recall Curve)給出的是不同分類閾值情況下查準率(Precision)和查全率(Recall)的變化曲線。有文獻指出,ROC曲線相比PR曲線有一個非常好的特性:就是當正負樣本分佈發生變化的時候,ROC曲線的形狀能夠基本保持不變,而PR曲線的形狀會發生較劇烈的變化。為了使得ROC曲線之間能更好的進行比較,通常採用AUC,即ROC曲線下的面積來衡量一個分類演算法的效能。其中,AUC的值越大,表明分類效能越好。
KS(Kolmogorov-Smirnov Curve)曲線橫軸為不同的分類閾值,縱軸為真正率(TPr)和假正率(FPr)的變化曲線。KS值=max|TPr-FPr|,等價於ΔTPr=ΔFPr,這和ROC曲線上找最優閾值的條件一致。KS值常在徵信評分模型中用於衡量區分預測正負樣本的分隔程度。一般來說,KS值越大,表明正負樣本區分的程度越好,說明模型區分度越高。但並非所有的情況KS值都是越高越好的,尤其在徵信模型中,如正負樣本完全分錯的情況下,KS值依舊可以很高。徵信模型最期望得到的信用分數分佈為正態分佈,如果KS值過大,如0.9,就可以認為正負樣本分得過開了,不太可能是正態分佈,反而比較可能是極端化的分佈狀態(如U字型),這樣的分數就很不好,基本可以認為不可用。
Cumulative gains chart
橫座標表示:代表我們樣本的百分比,假設有10000個樣本,0.1代表1000個,1代表10000個樣本。
縱座標表示:代表橫軸所代表的那麼多樣本中,判斷正確的比率。
baseline表示:如果我們不用模型,那我們對每一個人的打分都是一樣的,正率在所有樣本空間都是一樣的,連線起來就成為一條直線。
曲線含義:採用模型進行預測。y值的分子代表模型預測且預測為正例的人數,分母是整個群體正例人數。
Silhouette Analysis
Silhouette指的是一種解釋和驗證資料叢集內一致性的方法。該技術提供了每個物件分類的簡潔圖形表示。
輪廓值是物件與其自身群集(內聚)相比與其他群集(分離)相似程度的度量。輪廓範圍從-1到+1,其中高值表示物件與其自己的簇很好地匹配並且與相鄰簇很不匹配。如果大多數物件具有高值,則群集配置是合適的。如果許多點具有低值或負值,則群集配置可能具有太多或太少的群集。
圖中透過Silhouette方法大致對資料集樣本分類有了掌握,可以看到0/1類別大致比例。
Learning Curve
概念:學習曲線就是透過畫出不同訓練集大小時訓練集和交叉驗證的準確率,可以看到模型在新資料上的表現,進而來判斷模型是否方差偏高或偏差過高,以及增大訓練集是否可以減小過擬合。
Bias是用所有可能的訓練資料集訓練出的所有模型的輸出的平均值與真實模型的輸出值之間的差異。
Variance是不同的訓練資料集訓練出的模型輸出值之間的差異。
解讀:當訓練集和測試集的誤差收斂但卻很高時,為高偏差。左上角的偏差很高,訓練集和驗證集的準確率都很低,很可能是欠擬合。我們可以增加模型引數,比如,構建更多的特徵,減小正則項。此時透過增加資料量是不起作用的。當訓練集和測試集的誤差之間有大的差距時,為高方差。當訓練集的準確率比其他獨立資料集上的測試結果的準確率要高時,一般都是過擬合。右上角方差很高,訓練集和驗證集的準確率相差太多,應該是過擬合。我們可以增大訓練集,降低模型複雜度,增大正則項,或者透過特徵選擇減少特徵數。理想情況是是找到偏差和方差都很小的情況,即收斂且誤差較小。
Permutation Importance
一個最基本的問題大概會是什麼特徵對我模型預測的影響最大呢?這個東西就叫做“feature importance”即特徵重要性。anyway,字面意思看著就很重要啦。我們有很多方法來衡量特徵的重要性,這裡呢,將會介紹一種方法:排列重要性。這種方法和其他方法比起來,優勢有:
計算速度快
廣泛使用和理解
我們希望特徵重要性與屬性具有一致性
工作原理:排列重要性,一定是在model訓練完成後,才可以計算的。簡單來說,就是改變資料表格中某一列的資料的排列,保持其餘特徵不動,看其對預測精度的影響有多大。大概三個步驟:
訓練好模型
拿某一個feature column, 然後隨機打亂順序。然後用模型來重新預測一遍,看看自己的metric或者loss 。function變化了多少。
把上一個步驟中打亂的column復原,換下一個column重複上一個步驟,直到所有column都算一遍。
程式碼示例:
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
import eli5 # python計算permutation importance工具包
from eli5.sklearn import PermutationImportance
path = './census_income_dataset.csv'
data = pd.read_csv(path)
#...省略資料預處理過程
X_train, X_test, y_train, y_test = train_test_split(df, y, test_size=0.2, random_state = 400)
# 訓練XGBoost模型
model = xgb.XGBClassifier(
learning_rate =0.05,
n_estimators=100,
max_depth=3,
min_child_weight=1,
gamma=0.3,
subsample=0.8,
colsample_bytree=0.8,
objective= 'multi:softprob',
nthread=4,
scale_pos_weight=1,
num_class=2,
seed=27
).fit(X_train, y_train)
perm = PermutationImportance(model, random_state = 1).fit(X_test, y_test) # 例項化
eli5.show_weights(perm, feature_names = X_test.columns.tolist())
結果分析:
靠近上方的綠色特徵,表示對模型預測較為重要的特徵;
為了排除隨機性,每一次
shuffle
都會進行多次,然後取結果的均值和標準差;部分特徵出現負值,表示其
shuffle
之後,對精度反而有所提升。這通常出現在特徵不那麼重要的時候。當資料集較小的時候,這種情況更為常見;“+ - ”之後的數字衡量的是一次重新洗牌後的表現如何變化;
這個資料集是收入水平資料集,這個例子裡,最重要的特徵是“capital_gain”, 這看起來是合理的。
PDP
部分依賴圖(PDP或PD圖)顯示特徵對機器學習模型的預測結果的邊際效應,可以展示一個特徵是如何影響預測的。部分依賴圖可以顯示目標與特徵之間的關係是線性的,單調的還是更復雜的。例如,當應用於線性迴歸模型時,部分依賴圖總是顯示線性關係。
迴歸的部分依賴函式定義為:
xSxS是部分依賴圖要畫的特徵集合
xCxC是其他特徵
通常,集合SS中有一到兩個特徵,這個集合中的特徵我們想知道他們對預測的影響。在集合SS和集合CC中的特徵並集組成了全部特徵空間x。邊際化機器學習模型輸出在集合C的特徵分佈上。PDP的一個假設是,C中的特徵與s中的特徵不相關。如果違反這個假設,部分依賴圖的平均值將包括非常不可能甚至不可能的資料點。
邊緣化概念
邊緣化是一種透過累加一個變數的可能值以判定另一個變數的邊緣分佈的方法。這聽起來有點抽象,讓我們看一個例子:
假設我們想知道天氣是如何影響英國人的幸福感的,也就是P(幸福感|天氣)。假定我們具有衡量某人的幸福感所需的定義和裝置,同時記錄了某個英格蘭人和某個蘇格蘭人所處位置的天氣。可能蘇格蘭人通常而言要比英格蘭人幸福。所以我們其實在衡量的是P(幸福感, 國|天氣),即,我們同時考察幸福感和國。
邊緣化告訴我們,我們可以透過累加國家的所有可能值(英國由3國組成:英格蘭、蘇格蘭、威爾士),得到想要計算的數字,即P(幸福感|天氣) = P(幸福感, 國=英格蘭|天氣) + P(幸福感, 國=蘇格蘭|天氣) + P(幸福感, 國=威爾士|天氣)。
部分函式f^xSf^xS透過計算在訓練資料的平均值,即Monte Carlo方法:
x(i)CxC(i)是資料集中的真實特徵值,這些特徵是不關注的特徵。
特徵重要性可以告訴你哪些特徵是最重要的或者是不重要的。
partial dependence圖可以告訴你一個特徵是如何影響預測的。
PDP分析步驟如下:
訓練一個Xgboost模型(假設F1 … F4是我們的特徵,Y是目標變數,假設F1是最重要的特徵)。
我們有興趣探索Y和F1的直接關係。
用F1(A)代替F1列,併為所有的觀察找到新的預測值。採取預測的平均值。(稱之為基準值)
對F1(B)… F1(E)重複步驟3,即針對特徵F1的所有不同值。
PDP的X軸具有不同的F1值,而Y軸是雖該基準值F1值的平均預測而變化。
PDP特別適合用來回答類似這樣的問題:
在所有的收入水平的特徵中,年齡和學歷是如何影響收入的?或者說,在不同的國家相同年齡的人群收入水平有多少相似呢?
預測推薦基金時,投資偏好的不同會帶來多大的影響?還是有其他更重要的影響因素?
如果你對線性迴歸或者邏輯迴歸比較熟悉,那麼partial dependence可以被類比為這兩類模型中的“係數”。並且partial dependence在複雜模型中的作用比在簡單模型中更大,抓出更復雜的特性。
同樣還是用census_income的資料集,不同的個體在各個方面都是不一樣的。比如種族,年齡,受教育程度等等。一眼看過去,很難區分這些特徵對結果的影響有多大。為了清晰的分析,我們還是先只拿出某一行資料,比如說這一行資料裡,有種族White,45歲,Bachelors。我們將會用已有模型來預測結果,將這一行的某一個變數,反覆的進行修改和重新預測,比如將年齡修改從45修改為60,等等。持續觀察預測結果,在不同的年齡時有什麼樣的變化。
這裡的例子,只用到了一行資料。特徵之間的相互作用關係透過這一行來觀察可能不太妥當,那麼考慮用多行資料來進行試驗,然後根據平均值畫出影像來。
from pdpbox import pdp
feature = 'age'
# 建立好畫圖所需的資料
pdp_goals = pdp.pdp_isolate(model, X_train, df.columns, feature)
# 畫出“age”這一特徵的partial dependence plot
pdp.pdp_plot(pdp_goals, feature)
plt.show()
第一:y軸是預測結果的變化量。
第二:藍色陰影區域代表了置信的大小。
從這幅圖可以看出,age的增加肯定可以增加高收入機率,但是增加到一定的時候,對這個機率影響不大了。
置信區間概念
給定置信水平,根據估計值確定真實值可能出現的區間範圍,該區間通常以估計值為中心,該區間則為置信區間。
feature = 'education_num'
pdp_goals = pdp.pdp_isolate(model, X_train, df.columns, feature)
pdp.pdp_plot(pdp_goals, feature)
plt.show()
從這副圖可以看出,受教育程度對收入起積極作用,隨著受的教育越多,收入越高,也符合常人理解。
fig, axes, summary_df_1 = info_plots.target_plot_interact(
df=dataset, features=['age', 'education_num'], feature_names=['age', 'education_num'], target='income_level'
)
在此圖表中,氣泡大小不太重要,因為它與觀測數量(事件發生的次數)有關。最重要的見解來自氣泡的顏色,較暗的氣泡意味著更高的預設機率。這是一個強大的工具,因為它可以深入瞭解我們選擇的兩個變數對因變數的影響。
features_to_plot = ['age', 'education_num']
inter1 = pdp.pdp_interact(model, df, df.columns, features_to_plot)
pdp.pdp_interact_plot(inter1, features_to_plot, plot_type='grid', x_quantile=True, ncols = 2, plot_pdp=True)
plt.show()
上圖可以看出,受教育程度和年齡對收入水平有著正相關作用,且隨著受教育程度增加,年齡從35-90,高收入的機率越來越大。
fig, axes = pdp.pdp_interact_plot(
inter1, ['age', 'education_num'], plot_type='contour', x_quantile=True, ncols=2,
plot_pdp=True
)
重要的是要記住,在該圖中,較暗的顏色並不一定意味著較高的預設機率。在這裡,我們繪製了受教育等級和年齡與收入等級機率。我們可以推斷,在這兩個自變數中,education_num起著更重要的作用,因為等高線圖主要是垂直的,遵循x軸刻度標記(至少達到一個點)。
ICE
部分依賴圖(PDP)和個體條件期望圖(ICE)說明了一個或多個輸入變數與黑盒模型的預測結果之間的關係。它們都基於視覺化,模型不可知的技術。ICE圖可以更深入地探索個體差異並識別模型輸入之間的子組和相互作用。
另一方面,ICE圖使得可以深入到單個觀察的水平。它們可以幫助探索個體差異,並確定模型輸入之間的子組和互動。可以將每個ICE曲線視為一種模擬,顯示如果改變特定觀察的一個特徵,模型預測會發生什麼。為避免視覺化過載,ICE圖一次只顯示一個模型變數。
可以將每個ICE曲線視為一種模擬,顯示如果您改變特定觀察的一個特徵,模型預測會發生什麼。如圖9所示,透過在曲線變數的唯一值上覆制個體觀察並對每個重複進行評分,獲得一個觀察的ICE曲線。
下圖中的PD圖結果基本上是平坦的,給人的印象是X1與模型的預測之間沒有關係。
當我們觀察ICE圖時,它們呈現出一幅截然不同的圖:這種關係對於一次觀察非常正面,但對另一次觀察則非常負面。因此,與PD圖告訴我們的情況相反,ICE圖顯示X1實際上與目標有關;。基本上,ICE圖分離PD功能(畢竟是平均值)以揭示相互作用和個體差異。
當對大資料集分析時,則可能需要進行一些調整。例如,可以對選定的變數進行分箱,也可以對資料集進行取樣或分組。這些技術可以更快地提供實際圖的合理近似值。
如果想進一步瞭解PD和ICE圖,Ray Wright寫了一篇很好的論文,展示了PD和ICE圖如何用於比較和獲得機器學習模型的洞察力,特別是所謂的“黑盒”演算法,如隨機森林,神經網路和梯度增強。在他的論文中,他還討論了PD圖的侷限性,並提供了有關如何為大資料生成可縮放圖的建議。https://www.sas.com/content/dam/SAS/support/en/sas-global-forum-proceedings/2018/1950-2018.pdf
LIME
區域性可解釋不可知模型(LIME)是一種演算法,它提供了一種新穎的技術,以可解釋和可信任的方式解釋任何預測模型的結果。它的工作原理是圍繞想要解釋的預測在本地訓練可解釋的模型。這個工作發表於2016年KDD的論文。工具學習地址。
流程:
訓練模型,模型(記作 ff)可以是LR、NN、Wide and deep、C4.5 Decision tree、Random forest、GBDT等任意模型。
訓練結束後我們需要解析模型,先選擇一個待解析的樣本,樣本透過模型計算可以得到一個prediction(包含預測的label以及預測為1的probability),這時我們在這個樣本的附近選擇新的樣本並用模型計算出多個prediction,這樣樣本組合新的樣本集。
然後使用新的可解析的特徵和prediction作為label來訓練新的簡單模型(例如LR),然後使用簡單模型的權重作為這些特徵的重要性作為輸出。
通俗來說:
就是選擇一個樣本以及樣本附近的點,然後訓練一個簡單模型來擬合,雖然簡單模型不能在完整資料集上有效,但至少在這個點附近都是有效的,這個簡單模型的特徵是人類可解析的,而訓練出的權重也可以表示特徵重要性。
論文中演算法描述:
為了更好地理解LIME的工作原理,讓我們考慮兩種不同型別的可解釋性:
全域性可解釋性:全域性解釋有助於我們理解由訓練的響應函式建模的整個條件分佈,但全域性解釋可以是近似的或基於平均值。
區域性可解釋性:區域性解釋促進對單個資料點或分佈的小範圍的理解,例如一組輸入記錄及其相應的預測。由於小範圍的條件分佈很可能是線性的,因此區域性解釋可能比全域性解釋更準確。LIME旨在提供區域性可解釋性,因此對於特定決策或結果最為準確。
我們希望直譯器與模型無關,並且在區域性可靠。區域性可靠的解釋捕獲要解釋的例項鄰域中的分類器行為。為了學習區域性解釋,LIME使用可解釋的模型近似分類器圍繞特定例項的決策邊界。LIME與模型無關,這意味著它將模型視為黑盒子,並且不對模型行為做出任何假設。這使得LIME適用於任何預測模型。
LIME的核心在於三個方面:
這裡不對模型整體提供解釋,而是區域性對每一個樣本單獨進行解釋
即使機器學習模型訓練過程會產生一些抽象的特徵,但是解釋基於當前輸入資料的變數特徵
透過區域性建立簡單模型進行預測來對大多數重要特徵進行解釋
LIME作用在單個樣本上。
首先,我們取出一個樣本,並(permute)重複這個資料同時增加一些微小擾動,這樣就得到了一個新的資料集,資料集中包含相似的樣本,都基於取出來的那個樣本。對於這個新資料集中的每一個樣本,我們可以計算它跟取出的樣本之間的相似性,即在permutation中它被調整了多大,所有的統計距離、相似性矩陣都可以用在這裡,比如用指定寬度的指數核心將歐式距離轉化為相似度。
下一步,使用最初訓練的複雜模型,在新資料上進行預測。正因為新資料樣本間的細微差別,我們可以跟蹤那些微小擾動對預測結果的影響。
最後,我們在新資料上訓練出一個簡單模型(通常是線性模型),並使用最重要的特徵進行預測。最重要的特徵有不同的決定方法,在指定加入模型解釋中的特徵數量(通常在5到10附近)的前提下,可以
選擇在使用複雜模型進行預測時迴歸擬合上具有最高權重的特徵
運用正向選擇,選擇可以提高複雜模型的預測的迴歸擬合的變數
在複雜的機器學習模型預測的基礎上,選擇正則化的收縮率最小的lasso預測擬合的特徵
使用不多於我們已經選擇了的特徵的節點數量來構建決策樹
## 建立LIME直譯器
explainer = lime.lime_tabular.LimeTabularExplainer(X_train ,feature_names = features_name, class_names=['0','1'], categorical_features=data_cat_features,
categorical_names=cat_columns, kernel_width=3)
predict_fn_xgb = lambda x: xgb.predict_proba(x).astype(float)
exp = explainer.explain_instance(X_test[2], predict_fn_xgb, num_features=6)
exp.show_in_notebook(show_all=False)
上圖給我們解釋了對於一個樣本的預測結果,是哪些特徵決定樣本被分類到類別0,哪些特徵決定樣本被分類到類別1,且具體列出樣本在這些特徵的數值大小。很直觀和明確的解釋為什麼模型做這個決定。
SHAP
Shaply值由美國洛杉磯加州大學教授羅伊德·夏普利(Lloyd Shapley)提出,用於解決合作博弈的貢獻和收益分配問題。N人合作中,單個成員的貢獻不一樣,收益分配也應該不一樣。理想的分配方式是:貢獻=收益;
貢獻和收益分配是否有可以量化的方法呢?
Shapley方法就是這樣一種方法:Shapley值:單個成員所得與自己的貢獻相等。
基於Shap值的模型解釋是一種和模型無關的方法。如上圖,模型預測和Shap值解釋是兩個並行流程,Shap對模型預測的結果進行解釋。NIPS 論文地址:A Unified Approach to Interpreting Model Predictions,也可以參考這篇部落格:One Feature Attribution Method to (Supposedly) Rule Them All: Shapley Values。
原理:一個特徵的shapley value是該特徵在所有的特徵序列中的平均邊際貢獻。
優點:
解決了多重共線性問題;
不僅考慮單個變數的影響,而且考慮變數組的影響,變數之間可能存在協同效應;
缺點:計算效率低。
適用範圍:
計算個體的特徵shapley value;
所有個體的每個特徵的shapley value的絕對值求和或求平均即為整體的特徵重要性;
Shap方法的兩大特性
特徵歸因(收益)一致性:
定義
模型改變(A->B),特徵x的貢獻不遞減(增加或者保持現狀),則歸因(收益)也不遞減;
特點
特徵作用越大(小),重要度越高(低),和模型變化無關;
全域性特徵一致性
mean(|Tree SHAP|): Shap值;
Gain : 特徵用於劃分時所帶來的訓練損失減益的平均值;
Split Count: 根據特徵用於劃分的次數計算重要性;
Permutation: 將特徵的值隨機排列,用排列前後的模型誤差來計算重要性;
區域性樣本(Fever=yes,cough=yes的樣本)一致性
Saabas[5] : 樹建立完成後,根據樣本預測值,將父節點和子節點value的差異,作為父節點的特徵重要性;
Tree SHAP : 基於Shap值矩陣(樣本數*特徵數),計算出Fever和Cough的重要性;
特徵歸因(收益)可加性:
解釋性方法如果具有特徵歸因可加性,特徵重要性和模型預測值可以透過特徵貢獻的線性組合來表示。簡單模型最好的解釋是它本身;複雜模型,直接進行解釋並不容易,需要透過代理模型來解釋。接下來引入代理模型(解釋模型)來描述特徵歸因可加性。
樹模型Shap值的解
N為全體特徵集合,S為N的一個排列子集(順序相關)
求和第一項:排列數
求和第二項:對於任意子集S,特徵i的貢獻
特徵i的shap值可以理解為i的貢獻歸因
詳細內容參考論文。
用Shap值識別特徵交叉
Shap方法計算兩兩特徵交叉影響:
通俗理解:交叉影響=兩個人合作貢獻增益,減去各自單幹的貢獻;
單個特徵的貢獻
Shap方法計算單個特徵的貢獻(剔除交叉影響):
row_to_show = 5
data_for_prediction = X_test.iloc[row_to_show] # use 5 row of data here. Could use multiple rows if desired
data_for_prediction_array = data_for_prediction.values.reshape(1, -1)
# 計算model的shap值
explainer = shap.TreeExplainer(model)
# 計算樣本資料的shap值
shap_values = explainer.shap_values(data_for_prediction)
shap.initjs()
shap.force_plot(explainer.expected_value[1], shap_values[1], data_for_prediction)
圖形解釋
Base value :模型在資料集上的輸出均值:-0.1524
Output value:模型在單個樣本的輸出值:0.68
起正向作用的特徵:marital_status2、occupation3
起負向作用的特徵:capital_gain、education_num
特徵解釋
解釋Output value(單個樣本)和Base value(全體樣本Shap平均值)的差異,以及差異是由哪些特徵造成的
紅色是起正向作用的特徵,藍色是起負向作用的特徵
shap_values_b = explainer.shap_values(X_test)
shap.force_plot(explainer.expected_value[0], shap_values_b[0], X_test, link="logit")
特徵解釋
解釋Output value和Base value的差異,以及差異是由哪些特徵造成的
Summary Plots:
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values[1], X_test)
圖形解釋
每個點是一個樣本(人),圖片中包含所有樣本
X軸:樣本按Shap值排序-
Y軸:特徵按Shap值排序
顏色:特徵的數值越大,越紅
特徵解釋:
martial_status2這個特徵最重要,且值越大,收入會相對更高,到達一定峰值,會明顯下降
年齡也是影響結果的重要特徵,年齡小收入普遍低,但年齡到達一定程度,並不會增加收入,存在年齡小,收入高的人群。
收入水平和capital_gain大致呈正相關。
shap.summary_plot(shap_values[1],X_test, plot_type="bar")
上圖是特徵重要性圖譜,由上向下重要性依次減弱。
shap_values = explainer.shap_values(df)
shap.dependence_plot('age', shap_values[1], df, interaction_index="capital_gain")
圖形解釋:
X軸:age
Y軸(左):一個樣本的age對應的Shap值
顏色:capital_gain越大越紅
特徵解釋:
排除所有特徵的影響,描述age和capital_gain的關係。
年齡大的人更趨向於有大的資本收益,小部分年輕人有大的資本收益。
RETAIN
概述
論文使用稱為RETAIN的建模策略解決了這個限制,這是一種兩級神經網路順序資料的注意模型,提供對預測結果的詳細解釋保持與RNN相當的預測精度。為此,RETAIN依賴於關注機制被建模以表示在遭遇期間醫生的行為。一個區別RETAIN的功能(參見圖1)是利用注意力生成來利用序列資訊機制,同時學習可解釋的表示。並模仿醫生的行為,RETAIN以相反的時間順序檢查患者的過去訪問,從而促進更穩定的注意後代。因此,RETAIN會識別最有意義的訪問次數並量化訪問量有助於預測的功能。
模型使用兩套權重,一套是visit-level attention ,另外一套是variable-level attention。使用兩個RNN網路分別產生。
Step1:使用線性embedding
Step2:產生visit-level attention。其中輸入RNN中的資料採用時間逆序輸入。對於稀疏的attention,使用Sparsemax而不是Softmax。
Step3:產生variable-levelattention,其中輸入RNN中的資料採用時間逆序輸入。
Step4:根據以上兩步生成的attentionweight,生成context vector。Ci表示病人第i次visit。
Step5:根據Context Vector生成預測結果。LRP
逐層相關性傳播(LRP)是一種透過在神經網路中執行反向傳遞來識別重要畫素的方法。向後傳遞是保守的相關再分配過程,其中對較高層貢獻最大的神經元從其獲得最大相關性。LRP程式如下圖所示。
該方法可以在大多數程式語言中容易地實現並且整合到現有的神經網路框架中。當應用於深度ReLU網路時,LRP可以被理解為預測的深度泰勒分解。
這裡有如何實現LRP用於解釋深度模型的程式碼教程,有興趣可以動手實現,用於解釋自己的深度模型。
參考文獻
Interpretable Machine Learning
https://christophm.github.io/interpretable-ml-book/pdp.html
Partial dependence ——整合樹的可解析性
https://zhuanlan.zhihu.com/p/40356430
Machine Learning for Insights Challenge
https://zhuanlan.zhihu.com/p/45898896
https://yyqing.me/post/2018/2018-09-25-kaggle-model-insights
http://rstudio-pubs-static.s3.amazonaws.com/283647_c3ab1ccee95a403ebe3d276599a85ab8.html
《通向人類可理解、可解釋的人工智慧》
https://github.com/lopusz/awesome-interpretable-machine-learning
https://github.com/jphall663/awesome-machine-learning-interpretability
https://github.com/Henrilin28/awesome-Interpretable-ML
http://xiangruix.com/2018/07/31/lime/
https://www.jianshu.com/p/b52efa66154e
https://zhuanlan.zhihu.com/p/32891505
https://suensummit.github.io/intro-lime/#1
https://www.oreilly.com/learning/introduction-to-local-interpretable-model-agnostic-explanations-lime
https://github.com/slundberg/shap
http://km.oa.com/group/22630/articles/show/380452?kmref=search&from_page=1&no=1
感謝 zizhewang(汪子哲) 同學協助整理本文,彙總對機器學習模型可解釋性相關資料。