模型可解釋性方面的研究,在近兩年的科研會議上成為關注熱點,因為大家不僅僅滿足于模型的效果,更對模型效果的原因產生更多的思考,這樣的思考有助于模型和特征的優化,更能夠幫助更好的理解模型本身和提升模型服務質量。本文對機器學習模型可解釋性相關資料匯總survey。
來源:騰訊技術工程微信號
綜述
機器學習業務應用以輸出決策判斷為目標。可解釋性是指人類能夠理解決策原因的程度。機器學習模型的可解釋性越高,人們就越容易理解為什么做出某些決定或預測。模型可解釋性指對模型內部機制的理解以及對模型結果的理解。其重要性體現在:建模階段,輔助開發人員理解模型,進行模型的對比選擇,必要時優化調整模型;在投入運行階段,向業務方解釋模型的內部機制,對模型結果進行解釋。比如基金推薦模型,需要解釋:為何為這個用戶推薦某支基金。
機器學習流程步驟:收集數據、清洗數據、訓練模型、基于驗證或測試錯誤或其他評價指標選擇最好的模型。第一步,選擇比較小的錯誤率和比較高的準確率的高精度的模型。第二步,面臨準確率和模型復雜度之間的權衡,但一個模型越復雜就越難以解釋。一個簡單的線性回歸非常好解釋,因為它只考慮了自變量與因變量之間的線性相關關系,但是也正因為如此,它無法處理更復雜的關系,模型在測試集上的預測精度也更有可能比較低。而深度神經網絡處于另一個極端,因為它們能夠在多個層次進行抽象推斷,所以他們可以處理因變量與自變量之間非常復雜的關系,并且達到非常高的精度。但是這種復雜性也使模型成為黑箱,我們無法獲知所有產生模型預測結果的這些特征之間的關系,所以我們只能用準確率、錯誤率這樣的評價標準來代替,來評估模型的可信性。
事實上,每個分類問題的機器學習流程中都應該包括模型理解和模型解釋,下面是幾個原因:
- 模型改進:理解指標特征、分類、預測,進而理解為什么一個機器學習模型會做出這樣的決定、什么特征在決定中起最重要作用,能讓我們判斷模型是否符合常理。一個深度的神經網絡來學習區分狼和哈士奇的圖像。模型使用大量圖像訓練,并使用另外的一些圖像進行測試。90%的圖像被準確預測,這值得我們高興。但是在沒有計算解釋函數(explainer function)時,我們不知道該模型主要基于背景:狼圖像通常有一個下雪的背景,而哈士奇的圖像很少有。所以我們不知不覺地做了一個雪地探測器,如果只看準確率這樣的指標,我們就不會看到這一點。知道了模型是如何使用特征進行預測的,我們就能直覺地判斷我們的模型是否抓住了有意義的特征,模型是或否能泛化到其他樣本的預測上。
- 模型可信性與透明度:理解機器學習模型在提高模型可信度和提供審視預測結果透明度上是非常必要的,讓黑箱模型來決定人們的生活是不現實的,比如貸款和監獄刑法。另一個對機器學習結果可信度提出質疑的領域是藥品,模型結果會直接決定病人的生與死。機器學習模型在區分惡性腫瘤和不同類型的良性腫瘤方面是非常準確的,但是我們依然需要專家對診斷結果進行解釋,解釋為什么一個機器學習模型將某個患者的腫瘤歸類為良性或惡性將大大幫助醫生信任和使用機器學習模型來支持他們工作。長久來看,更好地理解機器學習模型可以節省大量時間、防止收入損失。如果一個模型沒有做出合理的決定,在應用這個模型并造成不良影響之前,我們就可以發現這一點。
- 識別和防止偏差:方差和偏差是機器學習中廣泛討論的話題。有偏差的模型經常由有偏見的事實導致,如果數據包含微妙的偏差,模型就會學習下來并認為擬合很好。一個有名的例子是,用機器學習模型來為囚犯建議定罪量刑,這顯然反映了司法體系在種族不平等上的內在偏差。其他例子比如用于招聘的機器學習模型,揭示了在特定職位上的性別偏差,比如男性軟件工程師和女性護士。機器學習模型在我們生活的各個層面上都是強有力的工具,而且它也會變得越來越流行。所以作為數據科學家和決策制定者來說,理解我們訓練和發布的模型如何做出決策,讓我們可以事先預防偏差的增大以及消除他們,是我們的責任。
可解釋性特質:
- 重要性:了解“為什么”可以幫助更深入地了解問題,數據以及模型可能失敗的原因。
- 分類:建模前數據的可解釋性、建模階段模型可解釋性、運行階段結果可解釋性。
- 范圍:全局解釋性、局部解釋性、模型透明度、模型公平性、模型可靠性。
- 評估:內在還是事后?模型特定或模型不可知?本地還是全局?
- 特性:準確性、保真性、可用性、可靠性,魯棒性、通用性等。
- 人性化解釋:人類能夠理解決策原因的程度,人們可以持續預測模型結果的程度標示。
動機
在工業界中,數據科學或機器學習的主要焦點是更偏“應用”的解決復雜的現實世界至關重要的問題,而不是理論上有效地應用這些模型于正確的數據。機器學習模型本身由算法組成,該算法試圖從數據中學習潛在模式和關系,而無需硬編碼固定規則。因此,解釋模型如何對業務起作用總是會帶來一系列挑戰。有一些領域的行業,特別是在保險或銀行等金融領域,數據科學家通常最終不得不使用更傳統的機器學習模型(線性或基于樹的)。原因是模型可解釋性對于企業解釋模型所采取的每個決策非常重要。
殘酷的現實是,如果沒有對機器學習模型或數據科學pipeline如何運作的合理理解,現實中的項目很少成功。現實中的數據科學項目,通常會有業務和技術兩方面。數據科學家通常致力于構建模型并為業務提供解決方案。但是,企業可能不知道模型如何工作的復雜細節。
數據科學從業者將知道存在典型的模型可解釋性與模型性能權衡。這里需要記住的一點是,模型性能不是運行時或執行性能,而是模型在決策中的準確程度。有幾種模型,包括簡單的線性模型甚至是基于樹的模型,它們可以很容易地解釋模型為獲得特定的洞察力或預測而做出的決策,但是你可能需要犧牲模型性能,因為它們總是不能產生最好的結果是由于高偏差(線性模型)或高方差的固有問題,導致過度擬合(完全成長的樹模型)。更復雜的模型,如集合模型和最近的深度學習模型系列通常會產生更好的性能,但被認為是黑盒模型,因為很難解釋模型如何真正做出決定。
理解模型可解釋性
模型解釋作為一個概念仍然主要是理論和主觀的。任何機器學習模型的核心都有一個響應函數,它試圖映射和解釋獨立(輸入)自變量和(目標或響應)因變量之間的關系和模式。當模型預測或尋找見解時,需要做出某些決定和選擇。模型解釋試圖理解和解釋響應函數所做出的這些決定,即what,why以及how。模型解釋的關鍵是透明度,質疑能力以及人類理解模型決策的難易程度。模型解釋的三個最重要的方面解釋如下。
1.是什么驅動了模型的預測? 我們應該能夠查詢我們的模型并找出潛在的特征交互,以了解哪些特征在模型的決策策略中可能是重要的。這確保了模型的公平性。
2.為什么模型會做出某個決定? 我們還應該能夠驗證并證明為什么某些關鍵特征在預測期間驅動模型所做出的某些決策時負有責任。這確保了模型的可靠性。
- 我們如何信任模型預測? 我們應該能夠評估和驗證任何數據點以及模型如何對其進行決策。對于模型按預期工作的關鍵利益相關者而言,這應該是可證明且易于理解的。這確保了模型的透明度。
在比較模型時,除了模型性能之外,如果模型的決策比其他模型的決策更容易理解,那么模型被認為比其他模型具有更好的可解釋性。
可解釋性的重要性
在解決機器學習問題時,數據科學家往往傾向于關注模型性能指標,如準確性,精確度和召回等等(毫無疑問,這很重要!)。這在大多數圍繞數據科學和機器學習的在線競賽中也很普遍。但是,指標只能說明模型預測決策的部分故事。隨著時間的推移,由于環境中的各種因素導致的模型概念漂移,性能可能會發生變化。因此,了解推動模型采取某些決策的因素至關重要。
如果一個模型工作得很好,為什么還要深入挖掘呢?在解決現實世界中的數據科學問題時,為了讓企業信任您的模型預測和決策,他們會不斷提出“我為什么要相信您的模型?”這一問題,這一點非常有意義。如果一個人患有癌癥或糖尿病,一個人可能對社會構成風險,或者即使客戶會流失,您是否會對預測和做出決策(如果有的話)感到滿意?也許不是,如果我們能夠更多地了解模型的決策過程(原因和方式),我們可能會更喜歡它。這使我們更加透明地了解模型為何做出某些決策,在某些情況下可能出現的問題,并且隨著時間的推移它有助于我們在這些機器學習模型上建立一定程度的信任。
- 了解預測背后的原因在評估信任方面非常重要,如果計劃基于預測采取行動,或者選擇是否部署新模型,那么這是至關重要的。
- 無論人類是直接使用機器學習分類器作為工具,還是在其他產品中部署模型,仍然存在一個至關重要的問題:如果用戶不信任模型或預測,他們就不會使用它。
這是我們在本文中多次討論的內容,也是決定數據科學項目在行業中取得成功的關鍵區別之一。這推動了模型解釋的必要性和重要性的緊迫性。
可解釋性的標準
有一些特定的標準可用于分類模型解釋方法。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圖的局限性,并提供了有關如何為大數據生成可縮放圖的建議。
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方法計算單個特征的貢獻(剔除交叉影響):
通俗理解:個人影響=個人合作貢獻,減去其它N-1個人的貢獻;下面還是以收入水平數據集進行案例分析:
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, lin)
特征解釋
- 解釋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_typ)
上圖是特征重要性圖譜,由上向下重要性依次減弱。
shap_values = explainer.shap_values(df)
shap.dependence_plot('age', shap_values[1], df, interaction_inde)
圖形解釋:
- 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用于解釋深度模型的代碼教程,有興趣可以動手實現,用于解釋自己的深度模型。
更多騰訊AI相關技術干貨,請關注專欄騰訊技術工程
審核編輯 黃昊宇
-
模型
+關注
關注
1文章
3313瀏覽量
49231 -
機器學習
+關注
關注
66文章
8441瀏覽量
133087
發布評論請先 登錄
相關推薦
《具身智能機器人系統》第7-9章閱讀心得之具身智能機器人與大模型
一種基于因果路徑的層次圖卷積注意力網絡
![一種基于因果路徑的層次圖卷積注意力網絡](https://file1.elecfans.com/web1/M00/F4/CD/wKgaoWcytaCAMt21AAAZF3q1mFc472.jpg)
深度學習模型的魯棒性優化
魯棒性在機器學習中的重要性
常見AI大模型的比較與選擇指南
AI大模型與深度學習的關系
《AI for Science:人工智能驅動科學創新》第二章AI for Science的技術支撐學習心得
數據智能系列講座第3期—交流式學習:神經網絡的精細與或邏輯與人類認知的對齊
![數據智能系列講座第3期—交流式<b class='flag-5'>學習</b>:神經網絡的精細與或邏輯與人類認知的對齊](https://file1.elecfans.com/web2/M00/E5/E7/wKgZomZFcsyAcT-5AAA2A4dQRkQ217.png)
評論