用于可解釋機器學習的 Python 庫
本文轉自雷鋒網,如需轉載請至雷鋒網官網申請授權。
由于對人工智能偏見的擔心日益凸顯,從業者解釋模型產出的預測結果的能力以及解釋模型自身運作機制的能力變的越來越重要。幸運的是,已經有許多python工具集被開發出來,用以解決上述問題。下文我將對現有4個建立的比較完善的翻譯和解釋機器學習模型的工具包做簡要的指導性描述。
這些工具包都可以通過pip來進行安裝,擁有完善的文檔,并且強調通過可視化來提升可解釋性。
yellowbrick
這個工具包本質上,是scikit-learn的一個擴展,提供了一些非常實用且好看的機器學習模型可視化工具。`visualiser`對象是核心接口,是一個scikit-learn估計器,所以如果你之前熟悉scikit-learn的工作流程,那么將對此非常熟悉。
這個可視化工具覆蓋了模型選擇,特征重要性和模型性能分析等方面。
讓我們看幾個簡短的例子。
該工具包可以通過pip安裝,
- pip install yellowbrick
為了展示工具包中的一些特性,我們將利用scikit-learn中的紅酒識別數據集。這個數據集包含13個特征以及3個目標類別??梢酝ㄟ^scikit-learn直接加載。在下面的代碼里我引入數據集,并把轉換成pandas dataframe。數據集可以直接被用來訓練模型,并不需要其他的數據處理。
- import pandas as pd
- from sklearn import datasets
- wine_data = datasets.load_wine()
- df_wine = pd.DataFrame(wine_data.data,columns=wine_data.feature_names)
- df_wine['target'] = pd.Series(wine_data.target)
利用scikit-learn進一步將數據分為測試集合和訓練集。
- import pandas as pd
- from sklearn import datasets
- wine_data = datasets.load_wine()
- df_wine = pd.DataFrame(wine_data.data,columns=wine_data.feature_names)
- df_wine['target'] = pd.Series(wine_data.target)
接下來,我們用yellowbrick的visualiser觀察特征之間的相關性。
- import pandas as pd
- from sklearn import datasets
- wine_data = datasets.load_wine()
- df_wine = pd.DataFrame(wine_data.data,columns=wine_data.feature_names)
- df_wine['target'] = pd.Series(wine_data.target)
現在,我們擬合一個隨機森林分類器,并通過另一個visualiser評價其性能。
- from yellowbrick.classifier import ClassificationReport
- from sklearn.ensemble import RandomForestClassifier
- model = RandomForestClassifier()
- visualizer = ClassificationReport(model, size=(1080, 720))
- visualizer.fit(X_train, y_train)
- visualizer.score(X_test, y_test)
- visualizer.poof()
ELI5
ELI5是另一個可視化工具包,在模型機器學習模型調試和解釋其產出的預測結果方面非常有用。它能夠同大多數通用的python機器學習工具包一起使用,包括scikit-learn和XGBoost,以及Keras。
讓我們用ELI5來觀察一下上面我們訓練的模型的特征重要性。
- import eli5
- eli5.show_weights(model, feature_names = X.columns.tolist())
默認的,`show_weights`方法采用GAIN來計算權重,但你也可以傳入其他`importance_type`來控制特征重要性的計算。
也可以通過`show_prediction`來觀察某一個樣本的預測結果的原因。
- from eli5 import show_predictionshow_prediction(model, X_train.iloc[1], feature_names = X.columns.tolist(),
- show_feature_values=True)
LIME
LIME(模型無關局部可解釋)是一個用來解釋模型做出的預測的工具包。LIME支持對多種分類器的單個樣本預測進行解釋,并且原生支持scikit-learn。
下面讓我們用LIME對上述我們訓練的模型的一些預測進行解釋。
LIME可以用pip進行安裝
- pip install lime
首先我們構建explainer,它通過訓練數據集數組,模型中用到的特征名稱和目標變量的類別名稱作為初始化參數。
- import lime.lime_tabular
- explainer = lime.lime_tabular.LimeTabularExplainer(X_train.values, feature_names=X_train.columns.values.tolist(), class_names=y_train.unique())
接下來,我們創建一個lambda函數,它表示用模型預測一個樣本。詳見這個優秀的,更有深度的LIME教程。首先我們構建explainer,它通過訓練數據集數組,模型中用到的特征名稱和目標變量的類別名稱作為初始化參數。
- predict_fn = lambda x: model.predict_proba(x).astype(float)
隨后,我們利用explainer解釋指定樣本的預測結果。其結果如下。LIME通過可視化的結果,展示特征如果對得到的預測結果產生影響。
- exp = explainer.explain_instance(X_test.values[0], predict_fn, num_features=6)
- exp.show_in_notebook(show_all=False)
MLxtend
這個工具包包含一系列機器學習可用的工具函數。包括通過stacking和voting構建的分類器,模型的評估,特征的提取、特征工程和可視化。除了該工具包的文檔,這篇論文也是理解工具包更多細節的好資源。
下面讓我們利用MLxtend來比較Ensemble后的分類器的分類邊界與組成他的子分類器的分類邊界有什么不同。
同樣MLxtend也可以通過pip安裝。
- pip install mlxtend
引入一些工具包,
- from mlxtend.plotting import plot_decision_regions
- from mlxtend.classifier import EnsembleVoteClassifier
- import matplotlib.gridspec as gridspec
- import itertools
- from sklearn import model_selection
- from sklearn.linear_model import LogisticRegression
- from sklearn.naive_bayes import GaussianNB
- from sklearn.ensemble import RandomForestClassifier
下面的可視化工具一次只能接受兩個特征作為輸入,所以我們創建了數組['proline', 'color_intensity']。因為這兩個特征在上述利用ELI5分析時,具有最高的特征重要性。引入一些工具包,
- X_train_ml = X_train[['proline', 'color_intensity']].values
- y_train_ml = y_train.values
接下來,我們創建一些分類器,并在訓練數據上進行擬合,通過MLxtend可視化他們的決策邊界。輸出來自下面的代碼。
- clf1 = LogisticRegression(random_state=1)
- clf2 = RandomForestClassifier(random_state=1)
- clf3 = GaussianNB()
- eclf = EnsembleVoteClassifier(clfs=[clf1, clf2, clf3], weights=[1,1,1])
- value=1.5
- width=0.75
- gs = gridspec.GridSpec(2,2)
- fig = plt.figure(figsize=(10,8))
- labels = ['Logistic Regression', 'Random Forest', 'Naive Bayes', 'Ensemble']
- for clf, lab, grd in zip([clf1, clf2, clf3, eclf],
- labels,
- itertools.product([0, 1], repeat=2)):
- clf.fit(X_train_ml, y_train_ml)
- ax = plt.subplot(gs[grd[0], grd[1]])
- fig = plot_decision_regions(X=X_train_ml, y=y_train_ml, clf=clf)
- plt.title(lab)
以上絕對不是模型可解釋和可視化工具包的完整列表。這篇博文羅列了包含其他有用的工具包的列表,值得一試。
感謝閱讀!