【機器學(xué)習(xí)】4 款超級棒的模型可解釋性工具包,總有一款適合你!
近年來機器學(xué)習(xí)模型可解釋性成為大家關(guān)注的熱點,我們不再滿足于模型效果,而是對模型效果的產(chǎn)生原因有了更多的思考,這樣的思考不僅有助于模型和特征優(yōu)化,也能更好的幫助理解模型本身和提升模型服務(wù)質(zhì)量。
算法通常被看成黑盒子模型,訓(xùn)練數(shù)據(jù)流入黑盒子,訓(xùn)練出一個函數(shù)(這個函數(shù)也可以稱之為模型),輸入新的數(shù)據(jù)到該函數(shù)得出預(yù)測結(jié)果。對于算法給出的預(yù)測結(jié)果,其實很多人內(nèi)心都會有質(zhì)疑:"WHY?"
這就是為什么我們要擁有模型可解釋性。
什么是模型可解釋性?
模型可解釋性試圖理解和解釋響應(yīng)函數(shù)所做出的這些決定,即what,why以及how。通常,機器學(xué)習(xí)模型通過預(yù)測,并使用這些預(yù)測解決一系列問題。我們會有如下疑問:
這些預(yù)測的可信度如何? 他們足夠可靠地做出重大決策嗎?
模型可解釋性將你的注意力從"結(jié)論是什么?"轉(zhuǎn)到"為什么得出這個結(jié)論?"。
為什么模型可解釋性很重要?
以一個分類器的示例:哈士奇與狼的分類問題,其中一些哈士奇犬被錯誤分類為狼。使用可解釋的機器學(xué)習(xí),你可能會發(fā)現(xiàn)這些錯誤分類主要是由于圖像中的雪而引起的,分類器將其用作預(yù)測狼的特征。
模型可解釋性對于驗證模型結(jié)果是否符合你的期望是很有必要的。它不僅可以與業(yè)務(wù)方建立信任關(guān)系,推動項目繼續(xù)進行下去,而且可以結(jié)果來改善模型性能本身。
如何解釋機器學(xué)習(xí)模型?
為方便大家理解,讓我們創(chuàng)建一個模型,引入隨機森林分類器,并對模型進行訓(xùn)練、預(yù)測。
#訓(xùn)練
From sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier()
rfc.fit(train_X,y)
#預(yù)測
testpred = rfc.predict(test_X)
模型可解釋工具
我們已經(jīng)建立了模型,現(xiàn)在是時候介紹、使用「4種」可解釋工具了。
1、ELI5
我們先從最流行的工具之一ELI5開始。ELI5 是一個 Python 軟件包,可幫助調(diào)試機器學(xué)習(xí)分類器并解釋其預(yù)測。它可以為以下機器學(xué)習(xí)框架和軟件包提供支持:
scikit-learn Keras xgboost LightGBM CatBoost sklearn-crfsuite
ELI5 安裝方法
pip install eli5
# 或
conda install -c conda-forge eli5
ELI5 使用方法
import eli5
eli5.show_weights(rfc)

更多使用技巧,文檔參考如下:
https://eli5.readthedocs.io/en/latest/
2、LIME
在機器學(xué)習(xí)模型事后局部可解釋性研究中,一種代表性方法是由 Marco Tulio Ribeiro 等人提出的 Local Interpretable Model-Agnostic Explanation(LIME)。
一般地,對于每一個輸入實例,LIME首先利用該實例以及該實例的一組近鄰數(shù)據(jù)訓(xùn)練一個易于解釋的線性模型來擬合待解釋模型的局部邊界,然后基于該線性模型解釋待解釋模型針對該實例的決策依據(jù),其中,線性模型的權(quán)重系數(shù)直接體現(xiàn)了當(dāng)前決策中該實例的每一維特征重要性。
LIME 安裝方法
pip install lime
# 或
conda install -c conda-forge lime
LIME 使用方法
LIME主要提供三種解釋方法,這三種方法都處理不同類型的數(shù)據(jù):
表格解釋 文字翻譯 圖像解釋。
我們將使用Lime的文本解釋方法。
rfc.fit(vectorized_train_text,y)
Import lime
From sklearn.pipeline import make_pipeline
explainer = lime.lime_text.LimeTextExplainer(
class_names=["Not Patient", "Patient"])
pl = make_pipeline(vect,rfc)
exp = explainer.explain_instance(
train["combined_text"][689], pl.predict_proba)
exp.show_in_notebook()

更多使用技巧,文檔參考如下:
https://github.com/marcotcr/lime
3、SHAP
SHAP(SHapley Additive exPlanations)是一種博弈論方法,用于解釋任何機器學(xué)習(xí)模型的輸出。它使用博弈論中的經(jīng)典Shapley值及其相關(guān)擴展將最佳信用分配與本地解釋聯(lián)系起來。
SHAP 安裝方法
pip install shap
or
conda install -c conda-forge shap
SHAP 使用方法
import xgboost
import shap
# train an XGBoost model
X, y = shap.datasets.boston()
model = xgboost.XGBRegressor().fit(X, y)
# explain the model's predictions using SHAP
# (same syntax works for LightGBM, CatBoost, scikit-learn, transformers, Spark, etc.)
explainer = shap.Explainer(model)
shap_values = explainer(X)
# visualize the first prediction's explanation
shap.plots.waterfall(shap_values[0])

上面的解釋顯示了每個功能都有助于將模型輸出從基值推向模型輸出的功能。推高預(yù)測的特征以紅色顯示,推低預(yù)測的特征以藍色顯示??梢暬嗤忉尩牧硪环N方法是使用力圖:
# visualize the first prediction's explanation with a force plot
shap.plots.force(shap_values[0])

更多使用技巧,文檔參考如下:
https://github.com/slundberg/shap
4、MLXTEND
Mlxtend(機器學(xué)習(xí)擴展)是一個用于數(shù)據(jù)科學(xué)和機器學(xué)習(xí)任務(wù)的非常有用 Python 工具庫。
MLXTEND 安裝方法
pip install mlxtend
or
conda install -c conda-forge mlxtend
MLXTEND 使用方法
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import itertools
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import EnsembleVoteClassifier
from mlxtend.data import iris_data
from mlxtend.plotting import plot_decision_regions
# Initializing Classifiers
clf1 = LogisticRegression(random_state=0)
clf2 = RandomForestClassifier(random_state=0)
clf3 = SVC(random_state=0, probability=True)
eclf = EnsembleVoteClassifier(clfs=[clf1, clf2, clf3], weights=[2, 1, 1], voting='soft')
# Loading some example data
X, y = iris_data()
X = X[:,[0, 2]]
# Plotting Decision Regions
gs = gridspec.GridSpec(2, 2)
fig = plt.figure(figsize=(10, 8))
for clf, lab, grd in zip([clf1, clf2, clf3, eclf],
['Logistic Regression', 'Random Forest', 'RBF kernel SVM', 'Ensemble'],
itertools.product([0, 1], repeat=2)):
clf.fit(X, y)
ax = plt.subplot(gs[grd[0], grd[1]])
fig = plot_decision_regions(X=X, y=y, clf=clf, legend=2)
plt.title(lab)
plt.show()

更多使用技巧,文檔參考如下:
https://github.com/rasbt/mlxtend
往期精彩回顧
本站qq群851320808,加入微信群請掃碼:
