【機器學習】關于機器學習模型可解釋(XAI),再分享一招!
隨著時間的推移,學習模型變得越來越復雜,很難直觀地分析它們。人們經(jīng)常聽說機器學習模型是"黑匣子",從某種意義上說,它們可以做出很好的預測,但我們無法理解這些預測背后的邏輯。這種說法是正確的,因為大多數(shù)數(shù)據(jù)科學家發(fā)現(xiàn)很難從模型中提取見解。然而,我們可以使用一些工具從復雜的機器學習模型中提取見解。
上一篇文章中我已分享了一篇文章:再見"黑匣子模型"!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 數(shù)據(jù)集的乳腺癌示例。這是一個簡單的二進制(惡性,良性)分類問題,從乳腺腫塊的細針抽吸(FNA)的數(shù)字化圖像計算特征,它們描述了圖像中細胞核的特征。
# 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)
拆分數(shù)據(jù)集進行訓練和測試后,使用tree.DecisionTreeClassifier() 建立分類模型。
# model and fit
cls_t = tree.DecisionTreeClassifier()
cls_t.fit(X_train, y_train);
現(xiàn)在,為了對模型有一個基本的印象,我建議可視化特性的重要性。特征重要性的計算方法是通過節(jié)點到達該節(jié)點的概率加權(quán)節(jié)點雜質(zhì)的減少量。節(jié)點概率可以通過到達節(jié)點的樣本數(shù)除以樣本總數(shù)來計算。值越高,特征越重要。最重要的特征將在樹中更高。單個特征可以用于樹的不同分支,特征重要性則是其在減少雜質(zhì)方面的總貢獻。
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)

關于模型我們能了解到什么?
首先,我們可以看到每個決策級別使用的特性的名稱和條件的拆分值。如果一個樣本滿足條件,那么它將轉(zhuǎn)到左分支,否則它將轉(zhuǎn)到右分支。
每個節(jié)點中的samples行顯示當前節(jié)點中正在檢查的樣本數(shù)。如果proporty=True,則samples行中的數(shù)字以總數(shù)據(jù)集的%為單位。
每個節(jié)點中的值行告訴我們該節(jié)點中有多少個樣本屬于每個類,順序是當比例=False時,樣本的比例=True時。這就是為什么在每個節(jié)點中,value中的數(shù)字加起來等于value中顯示的數(shù)字,表示proportion=False,1表示proportion=True。

在類行中我們可以看到節(jié)點的分類結(jié)果。
基尼分數(shù)是量化節(jié)點純度的度量,類似于熵?;嵯禂?shù)大于零意味著該節(jié)點中包含的樣本屬于不同的類。在上圖中,葉子的基尼分數(shù)為零,這意味著每個葉子中的樣本屬于一個類。請注意,當純度較高時,節(jié)點/葉子的顏色較深。
決策樹代理模型
一種解釋“黑匣子”模型全局行為的流行方法是應用全局代理模型。全局代理模型是一種可解釋的模型,經(jīng)過訓練以近似黑盒模型的預測。我們可以通過解釋代理模型來得出關于黑盒模型的結(jié)論。通過使用更多機器學習解決機器學習可解釋性問題!
訓練代理模型是一種與模型無關的方法,因為它不需要關于黑盒模型內(nèi)部工作的任何信息,只需要訪問數(shù)據(jù)和預測函數(shù)。這個想法是我們采用我們的“黑匣子”模型并使用它創(chuàng)建預測。然后我們根據(jù)“黑盒”模型和原始特征產(chǎn)生的預測訓練一個透明模型。請注意,我們需要跟蹤代理模型與“黑盒”模型的近似程度,但這通常不容易確定。
隨機森林分類器是一種常用的模型,用于解決決策樹模型往往存在的過擬合問題。結(jié)果在測試集上具有更好的準確性,但它是
clf = RandomForestClassifier(random_state=42, n_estimators=50, n_jobs=-1)
clf.fit(X_train, y_train);
使用模型創(chuàng)建預測(在本例中為 RandomForestClassifier)
predictions = clf.predict(X_train)
然后使用預測將數(shù)據(jù)擬合到?jīng)Q策樹分類器。
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)
就是這樣!即使我們無法輕易理解森林中數(shù)百棵樹的外觀,我們也可以構(gòu)建一個淺層決策樹,并希望了解森林的工作原理。
最后,測量代理模型復制黑盒模型預測的程度。衡量代理復制黑盒模型的好壞的一種方法是R平方度量。
cls_t.score(X_train, predictions)
提示
如果你使用 pycharm 創(chuàng)建模型,則可以使用 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)
概括
解釋“黑匣子”機器學習模型對于它們成功適用于許多現(xiàn)實世界問題非常重要。sklearn.tree.plot_tree 是一個可視化工具,可以幫助我們理解模型?;蛘邠Q句話說,機器(模型)從這些特征中學到了什么?它符合我們的期望嗎?我們能否通過使用有關問題的領域知識添加更復雜的特征來幫助機器學習?使用決策樹可視化可以幫助我們直觀地評估模型的正確性,甚至可能對其進行改進。
往期精彩回顧 本站qq群851320808,加入微信群請掃碼:
