【机器学习】关于机器学习模型可解释(XAI),再分享一招!
隨著時間的推移,學習模型變得越來越復雜,很難直觀地分析它們。人們經常聽說機器學習模型是"黑匣子",從某種意義上說,它們可以做出很好的預測,但我們無法理解這些預測背后的邏輯。這種說法是正確的,因為大多數數據科學家發現很難從模型中提取見解。然而,我們可以使用一些工具從復雜的機器學習模型中提取見解。
上一篇文章中我已分享了一篇文章:再見"黑匣子模型"!SHAP 可解釋 AI (XAI)實用指南來了!該篇文章主要介紹了關于回歸問題的模型可解釋性。
本文是關于如何使用sklearn.tree.plot_tree ,來獲得模型可解釋性的方法說明。決策樹本身就是一種可解釋的機器學習算法,廣泛應用于線性和非線性模型的特征重要性。它是一個相對簡單的模型,通過可視化樹很容易解釋。
import?numpy?as?np from?sklearn?import?tree from?sklearn.tree?import?DecisionTreeClassifier import?matplotlib.pylab?as?plt from?sklearn?import?datasets,?ensemble,?model_selection from?sklearn.ensemble?import?RandomForestClassifier在此示例中,我們將使用來自 sklearn 數據集的乳腺癌示例。這是一個簡單的二進制(惡性,良性)分類問題,從乳腺腫塊的細針抽吸(FNA)的數字化圖像計算特征,它們描述了圖像中細胞核的特征。
#?import?data?and?split cancer?=?datasets.load_breast_cancer() X_train,?X_test,?y_train,?y_test?=?model_selection.train_test_split(cancer.data,?cancer.target,?random_state=0)拆分數據集進行訓練和測試后,使用tree.DecisionTreeClassifier() 建立分類模型。
#?model?and?fit cls_t?=?tree.DecisionTreeClassifier() cls_t.fit(X_train,?y_train);現在,為了對模型有一個基本的印象,我建議可視化特性的重要性。特征重要性的計算方法是通過節點到達該節點的概率加權節點雜質的減少量。節點概率可以通過到達節點的樣本數除以樣本總數來計算。值越高,特征越重要。最重要的特征將在樹中更高。單個特征可以用于樹的不同分支,特征重要性則是其在減少雜質方面的總貢獻。
importances?=?cls_t.feature_importances_ indices?=?np.argsort(importances) features?=?cancer.feature_names plt.title('Feature?Importances') j?=?11#?top?j?importance plt.barh(range(j),?importances[indices][len(indices)-j:],?color='g',?align='center') plt.yticks(range(j),?[features[i]?for?i?in?indices[len(indices)-j:]]) plt.xlabel('Relative?Importance') plt.show() cls_t.feature_importances_在這種情況下,僅使用前 13 個特征,未使用其他特征,表明它們的重要性是零。
讓我們將決策樹的前三層進行可視化,max_depth=3。
#?visualization fig?=?plt.figure(figsize=(16,?8)) vis?=?tree.plot_tree(cls_t,?feature_names?=?cancer.feature_names,?class_names?=?['Benign',?'Malignant'],?max_depth=3,?fontsize=9,?proportion=True,?filled=True,?rounded=True) 決策樹可視化:max_depth+3關于模型我們能了解到什么?
首先,我們可以看到每個決策級別使用的特性的名稱和條件的拆分值。如果一個樣本滿足條件,那么它將轉到左分支,否則它將轉到右分支。
每個節點中的samples行顯示當前節點中正在檢查的樣本數。如果proporty=True,則samples行中的數字以總數據集的%為單位。
每個節點中的值行告訴我們該節點中有多少個樣本屬于每個類,順序是當比例=False時,樣本的比例=True時。這就是為什么在每個節點中,value中的數字加起來等于value中顯示的數字,表示proportion=False,1表示proportion=True。
max_depth=8 的決策樹可視化在類行中我們可以看到節點的分類結果。
基尼分數是量化節點純度的度量,類似于熵。基尼系數大于零意味著該節點中包含的樣本屬于不同的類。在上圖中,葉子的基尼分數為零,這意味著每個葉子中的樣本屬于一個類。請注意,當純度較高時,節點/葉子的顏色較深。
決策樹代理模型
一種解釋“黑匣子”模型全局行為的流行方法是應用全局代理模型。全局代理模型是一種可解釋的模型,經過訓練以近似黑盒模型的預測。我們可以通過解釋代理模型來得出關于黑盒模型的結論。通過使用更多機器學習解決機器學習可解釋性問題!
訓練代理模型是一種與模型無關的方法,因為它不需要關于黑盒模型內部工作的任何信息,只需要訪問數據和預測函數。這個想法是我們采用我們的“黑匣子”模型并使用它創建預測。然后我們根據“黑盒”模型和原始特征產生的預測訓練一個透明模型。請注意,我們需要跟蹤代理模型與“黑盒”模型的近似程度,但這通常不容易確定。
隨機森林分類器是一種常用的模型,用于解決決策樹模型往往存在的過擬合問題。結果在測試集上具有更好的準確性,但它是
clf?=?RandomForestClassifier(random_state=42,?n_estimators=50,?n_jobs=-1) clf.fit(X_train,?y_train);使用模型創建預測(在本例中為 RandomForestClassifier)
predictions?=?clf.predict(X_train)然后使用預測將數據擬合到決策樹分類器。
cls_t?=?tree.DecisionTreeClassifier() cls_t.fit(X_train,?predictions);可視化
#?visualization fig?=?plt.figure(figsize=(16,?8)) vis?=?tree.plot_tree(cls_t,?feature_names?=?cancer.feature_names,?class_names?=?['Benign',?'Malignant'],?max_depth=3,?fontsize=9,?proportion=True,?filled=True,?rounded=True)就是這樣!即使我們無法輕易理解森林中數百棵樹的外觀,我們也可以構建一個淺層決策樹,并希望了解森林的工作原理。
最后,測量代理模型復制黑盒模型預測的程度。衡量代理復制黑盒模型的好壞的一種方法是R平方度量。
cls_t.score(X_train,?predictions)提示
如果你使用 pycharm 創建模型,則可以使用 pickle 將其導出到jupyter notebook。
模型輸出:
import?pickle #?dump?information?to?that?file with?open('model','wb')?as?outfile:pickle.dump(cls_t,?outfile)模型導入:
import?pickle #?load?information?from?that?file with?open('model','rb')?as?inputfile:modell?=?pickle.load(inputfile)概括
解釋“黑匣子”機器學習模型對于它們成功適用于許多現實世界問題非常重要。sklearn.tree.plot_tree 是一個可視化工具,可以幫助我們理解模型。或者換句話說,機器(模型)從這些特征中學到了什么?它符合我們的期望嗎?我們能否通過使用有關問題的領域知識添加更復雜的特征來幫助機器學習?使用決策樹可視化可以幫助我們直觀地評估模型的正確性,甚至可能對其進行改進。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习】关于机器学习模型可解释(XAI),再分享一招!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows7电脑删除文件特别慢怎么回
- 下一篇: 【机器学习】Github8.9K,目前最