<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          機(jī)器學(xué)習(xí)模型可解釋性的6種Python工具包,總有一款適合你!

          共 10807字,需瀏覽 22分鐘

           ·

          2021-07-14 01:03

          開發(fā)一個(gè)機(jī)器學(xué)習(xí)模型是任何數(shù)據(jù)科學(xué)家都期待的事情。我遇到過許多數(shù)據(jù)科學(xué)研究,只關(guān)注建模方面和評(píng)估,而沒有解釋。

          然而,許多人還沒有意識(shí)到機(jī)器學(xué)習(xí)可解釋性在業(yè)務(wù)過程中的重要性。以我的經(jīng)驗(yàn),商業(yè)人士希望知道模型是如何工作的,而不是度量評(píng)估本身。

          這就是為什么在這篇文章中,我想向大家介紹我的一些頂級(jí)機(jī)器學(xué)習(xí)可解釋性 Python 工具包,有所收獲,歡迎點(diǎn)贊分享。

          我們開始吧!

          1、Yellowbrick

          Yellowbrick 是一個(gè)開源的 Python 包,它通過可視化分析和診斷工具擴(kuò)展了 scikit-learn API。對(duì)數(shù)據(jù)科學(xué)家而言,Yellowbrick 用于評(píng)估模型性能和可視化模型行為。

          Yellowbrick 是一個(gè)多用途軟件包,你可以在日常建模工作中使用。盡管來自 Yellowbrick 的大多數(shù)解釋API都處于基本級(jí)別,但它對(duì)于我們的第一個(gè)建模步驟仍然有用。

          讓我們用一個(gè)數(shù)據(jù)集示例來嘗試 Yellowbrick 包。對(duì)于初學(xué)者,讓我們安裝軟件包。

          pip install yellowbrick

          安裝完成后,我們可以使用 Yellowbrick 的 dataset 示例來測(cè)試包。

          #Pearson Correlation
          from yellowbrick.features import rank2d
          from yellowbrick.datasets import load_credit
          X, _ = load_credit()
          visualizer = rank2d(X)

          通過一條直線,我們可以使用 Pearson 相關(guān)方法來可視化特征之間的相關(guān)性。它是可定制的,因此你可以使用另一個(gè)相關(guān)函數(shù)。

          讓我們嘗試開發(fā)模型來評(píng)估模型性能并解釋模型。我將使用 Yellowbrick 用戶指南中的示例數(shù)據(jù)集,并生成一個(gè)判別閾值圖,以找到分隔二進(jìn)制類的最佳閾值。

          from yellowbrick.classifier import discrimination_threshold
          from sklearn.linear_model import LogisticRegression
          from yellowbrick.datasets import load_spam
          X, y = load_spam()
          visualizer = discrimination_threshold(LogisticRegression(multi_class="auto", solver="liblinear"), X,y)

          使用 Yellowbrick 閾值圖,我們可以解釋模型在0.4概率閾值下表現(xiàn)最好。

          如果你想知道 Yellowbrick 能做什么,請(qǐng)?jiān)L問主頁了解更多信息。

          https://www.scikit-yb.org/en/latest/about.html

          2、ELI5

          ELI5 是一個(gè) Python 包,有助于機(jī)器學(xué)習(xí)的可解釋性。取自Eli5軟件包,此軟件包的基本用法是:

          • 檢查模型參數(shù),試圖弄清楚模型是如何全局工作的
          • 檢查模型的單個(gè)預(yù)測(cè),并找出模型做出決策的原因

          如果 Yellowbrick 側(cè)重于特征和模型性能解釋,ELI5 側(cè)重于模型參數(shù)和預(yù)測(cè)結(jié)果。就我個(gè)人而言,我更喜歡 ELI5,因?yàn)樗慕忉尫浅:?jiǎn)單,商業(yè)人士可以理解它。

          讓我們用一個(gè)示例數(shù)據(jù)集和隨機(jī)森林模型分類器來嘗試 ELI5 包。我將使用 seaborn 包中的數(shù)據(jù)集,因?yàn)樗亲詈?jiǎn)單的數(shù)據(jù)集。

          #Preparing the model and the dataset
          from sklearn.ensemble import RandomForestClassifier
          from sklearn.model_selection import train_test_split
          mpg = sns.load_dataset('mpg').dropna()
          mpg.drop('name', axis =1 , inplace = True)
          #Data splitting
          X_train, X_test, y_train, y_test = train_test_split(mpg.drop('origin', axis = 1), mpg['origin'], test_size = 0.2, random_state = 121)
          #Model Training
          clf = RandomForestClassifier()
          clf.fit(X_train, y_train)

          最基本的 ELI5 函數(shù)是表示分類器權(quán)重和分類器預(yù)測(cè)結(jié)果。讓我們嘗試這兩個(gè)函數(shù)來理解解釋是如何產(chǎn)生的。

          import eli5
          eli5.show_weights(clf, feature_names = list(X_test.columns))

          從上圖中,可以看到分類器顯示了分類器特征的重要性及其偏差。你可以看到'displacement'特征是最重要的特征,但是它們有很高的偏差,這表明模型中存在偏差。讓我們?cè)囍故疽幌骂A(yù)測(cè)結(jié)果的可解釋性。

          eli5.show_prediction(clf, X_train.iloc[0])

          利用 ELI5 的 show_prediction 函數(shù),得到特征貢獻(xiàn)信息。哪些特征對(duì)某些預(yù)測(cè)結(jié)果有貢獻(xiàn)?這些特征對(duì)概率的影響有多大。這是一個(gè)很好的函數(shù),你可以輕松地向業(yè)務(wù)人員解釋模型預(yù)測(cè)。

          但是,最好記住上面的函數(shù)是基于樹的解釋(因?yàn)槲覀兪褂秒S機(jī)森林模型)。它可能足夠好給你一個(gè)商業(yè)人士的解釋;然而,由于模型的原因,它可能是有偏差的。這就是為什么 ELI5 提供了另一種基于模型度量來解釋黑盒模型的方法——它被稱為置換重要性(Permutation Importance)。

          讓我們先試試置換重要性函數(shù)。

          #Permutation Importance
          perm = PermutationImportance(clf, scoring = 'accuracy',random_state=101).fit(X_test, y_test)
          show_weights(perm, feature_names = list(X_test.columns))

          置換重要性背后的思想是評(píng)分(準(zhǔn)確度、精確度、召回等)如何隨特征的存在或不存在而變化。從以上結(jié)果可以看出,displacement 的得分最高,為0.3013。當(dāng)置換位移特征時(shí),模型的精度會(huì)有0.3013的變化。正負(fù)號(hào)后面的值就是不確定值。置換重要性法的本質(zhì)上是一個(gè)隨機(jī)過程;這就是為什么我們有不確定值。

          位置越高,影響得分的特征就越關(guān)鍵。底部的一些特征顯示一個(gè)負(fù)值,這很有趣,因?yàn)檫@意味著當(dāng)我們排列特征時(shí),該特征會(huì)增加得分。就我個(gè)人而言,ELI5 為我提供了足夠的機(jī)器學(xué)習(xí)解釋能力。如果你想了解更多,可以參考如下鏈接:

          https://github.com/TeamHG-Memex/eli5

          3、SHAP

          我之前文章中已多次提及了,如果我們?cè)谟懻摍C(jī)器學(xué)習(xí)的解釋性,SHAP 是繞不開的。對(duì)于從未聽說過的人,SHAP或(SHapley Additive exPlanations)是一種博弈論方法,用來解釋任何機(jī)器學(xué)習(xí)模型的輸出。簡(jiǎn)單地說,SHAP 是使用 SHAP 值來解釋每個(gè)特性的重要性。

          讓我們嘗試使用示例數(shù)據(jù)集和模型來更詳細(xì)地解釋SHAP。首先,我們需要安裝SHAP包。

          #Installation via pip
          pip install shap 
          #Installation via conda-forge 
          conda install -c conda-forge shap

          在這個(gè)示例中,我將使用泰坦尼克號(hào)示例數(shù)據(jù)集。

          #Preparing the model and the dataset 
          from sklearn.ensemble import RandomForestClassifier
          from sklearn.model_selection import train_test_split  
          titanic = sns.load_dataset('titanic').dropna() 
          titanic = titanic[['survived''age''sibsp''parch']]  
          #Data splitting for rfc 
          X_train, X_test, y_train, y_test = train_test_split(titanic.drop('survived', axis = 1), titanic['survived'], test_size = 0.2, random_state = 121)  
          #Model Training 
          clf = RandomForestClassifier() clf.fit(X_train, y_train)

          我們已經(jīng)用泰坦尼克號(hào)的數(shù)據(jù)訓(xùn)練了我們的數(shù)據(jù),現(xiàn)在我們可以試著用SHAP來解釋數(shù)據(jù)。讓我們使用模型的全局可解釋性來理解SHAP是如何工作的。

          import shap 
          shap_values = shap.TreeExplainer(clf).shap_values(X_train) shap.summary_plot(shap_values, X_train)

          從預(yù)測(cè)結(jié)果可以看出,年齡特征對(duì)預(yù)測(cè)結(jié)果的貢獻(xiàn)最大。如果你想查看特定的類對(duì)預(yù)測(cè)的貢獻(xiàn),我們只需要稍微調(diào)整一下代碼。假設(shè)我們想看看類0,這意味著我們使用以下代碼。

          shap.summary_plot(shap_values[0], X_train)

          從上圖中,我們可以看到每個(gè)數(shù)據(jù)對(duì)預(yù)測(cè)概率的貢獻(xiàn)。顏色越紅,值越高,反之亦然。此外,當(dāng)值為正時(shí),它有助于0級(jí)預(yù)測(cè)結(jié)果概率。

          SHAP不局限于全局可解釋性;它還提供了解釋單個(gè)數(shù)據(jù)集的函數(shù)。讓我們?cè)囍忉尩谝恍械念A(yù)測(cè)結(jié)果。

          explainer = shap.TreeExplainer(clf)
          shap_value_single = explainer.shap_values(X = X_train.iloc[0,:])
          shap.force_plot(base_value = explainer.expected_value[1],shap_values = shap_value_single[1],features = X_train.iloc[0,:])

          從上圖中可以看出,預(yù)測(cè)更接近于類0,因?yàn)樗怯赡挲g和 sibsp 特征推送的,而parch特征只提供了一點(diǎn)貢獻(xiàn)。

          4、Mlxtend

          Mlxtend 是一個(gè)用于數(shù)據(jù)科學(xué)日常工作的 Python 包。包中的api不僅限于可解釋性,還擴(kuò)展到各種功能,如統(tǒng)計(jì)評(píng)估、數(shù)據(jù)模式、圖像提取等。但是,我們將討論我們當(dāng)前文章的可解釋性API—決策區(qū)域。

          Decision Regions plot API 將生成一個(gè) Decision region plot,以可視化特征如何決定分類模型預(yù)測(cè)。讓我們嘗試使用示例數(shù)據(jù)和Mlxtend的指南。

          首先,我們需要安裝 Mlxtend 包。

          pip install Mlxtend

          然后,我們使用示例數(shù)據(jù)集并開發(fā)一個(gè)模型來查看 MLXTEN 的操作。

          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=[211], voting='soft')
          # Loading some example data
          X, y = iris_data()
          X = X[:,[02]]
          # Plotting Decision Regions
          gs = gridspec.GridSpec(22)
          fig = plt.figure(figsize=(108))
          for clf, lab, grd in zip([clf1, clf2, clf3, eclf],['Logistic Regression''Random Forest','RBF kernel SVM''Ensemble'],itertools.product([01], 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()

          從以上情節(jié)可以解釋模型的決策。當(dāng)每個(gè)模型進(jìn)行預(yù)測(cè)時(shí),可以看到它們之間的差異。例如,一類的 Logistic 回歸模型預(yù)測(cè)結(jié)果越大,X軸值越高,但Y軸上變化不大。與隨機(jī)森林模型相比,在X軸值之后,劃分沒有很大變化,Y軸值在每次預(yù)測(cè)中都是常數(shù)。

          決策區(qū)域的唯一缺點(diǎn)是它只限于二維特征,因此,它比實(shí)際模型本身更適合于預(yù)分析。

          5、PDPBox

          PDP(Partial Dependence Plot) 是一個(gè)顯示特征對(duì)機(jī)器學(xué)習(xí)模型預(yù)測(cè)結(jié)果的邊際影響的圖。它用于評(píng)估特征與目標(biāo)之間的相關(guān)性是線性的、單調(diào)的還是更復(fù)雜的。

          讓我們嘗試使用如下示例數(shù)據(jù)來了解PDPBox。首先,我們需要安裝PDPBox包。

          pip install pdpbox

          我們可以嘗試獲取更多關(guān)于:PDPBox如何幫助我們創(chuàng)建可解釋的機(jī)器學(xué)習(xí)的信息。

          import pandas as pd
          from pdpbox import pdp, get_dataset, info_plots
          #We would use the data and model from the pdpbox
          test_titanic = get_dataset.titanic()
          titanic_data = test_titanic['data']
          titanic_features = test_titanic['features']
          titanic_model = test_titanic['xgb_model']
          titanic_target = test_titanic['target']

          當(dāng)我們有了數(shù)據(jù)和模型后,讓我們嘗試使用 info_plots 函數(shù)檢查特征和目標(biāo)之間的信息。

          fig, axes, summary_df = info_plots.target_plot(df=titanic_data, feature='Sex', feature_name='gender', target=titanic_target)
          _ = axes['bar_ax'].set_xticklabels(['Female''Male'])

          你可以通過一個(gè)函數(shù)獲取目標(biāo)和特征的統(tǒng)計(jì)信息,這可以讓業(yè)務(wù)方很容易解釋。讓我們檢查模型預(yù)測(cè)分布函數(shù)以及特征。

          fig, axes, summary_df = info_plots.actual_plot(model=titanic_model, X=titanic_data[titanic_features], feature='Sex', feature_name='gender')

          現(xiàn)在,讓我們繼續(xù)使用PDP繪圖函數(shù)來解釋我們的模型預(yù)測(cè)。

          pdp_sex = pdp.pdp_isolate(model=titanic_model, dataset=titanic_data, model_features=titanic_features, feature='Sex')
          fig, axes = pdp.pdp_plot(pdp_sex, 'Sex')
          _ = axes['pdp_ax'].set_xticklabels(['Female''Male'])

          從上圖中,我們可以解釋當(dāng)性別特征為男性時(shí),預(yù)測(cè)概率降低(意味著男性存活的可能性降低)。這就是我們?nèi)绾问褂?PDPbox 來實(shí)現(xiàn)模型的可解釋性。

          6、InterpretML

          InterpretML 是一個(gè)Python包,它包含許多機(jī)器學(xué)習(xí)可解釋性API。此包的目的是基于繪圖圖提供交互式繪圖,以了解預(yù)測(cè)結(jié)果。

          InterpretML 提供了許多方法來解釋你的機(jī)器學(xué)習(xí),方法包括使用我們討論過的許多技術(shù)——即SHAP和PDP。此外,這個(gè)包擁有一個(gè)Glassbox模型API,它在開發(fā)模型時(shí)提供了一個(gè)可解釋性函數(shù)。

          讓我們用一個(gè)示例數(shù)據(jù)集來嘗試這個(gè)包。首先,我們需要安裝 InterpretML。

          pip install interpret

          讓我們嘗試使用泰坦尼克號(hào)數(shù)據(jù)集示例來開發(fā)模型。

          from sklearn.model_selection import train_test_split
          from interpret.glassbox import ExplainableBoostingClassifier
          import seaborn as sns
          #the glass box model (using Boosting Classifier)
          ebm = ExplainableBoostingClassifier(random_state=120)
          titanic = sns.load_dataset('titanic').dropna()
          #Data splitting
          X_train, X_test, y_train, y_test = train_test_split(titanic.drop(['survived''alive'], axis = 1), titanic['survived'], test_size = 0.2, random_state = 121)
          #Model Training
          ebm.fit(X_train, y_train)

          它將自動(dòng)對(duì)你的特征進(jìn)行熱編碼,并設(shè)計(jì)交互特性。讓我們?cè)囍玫竭@個(gè)模型的全局解釋。

          from interpret import set_visualize_provider
          from interpret.provider import InlineProvider
          set_visualize_provider(InlineProvider())
          from interpret import show
          ebm_global = ebm.explain_global()
          show(ebm_global)

          從上圖中,我們可以看到模型特征重要性的總結(jié)。它根據(jù)模型特征的重要性向你顯示所有被認(rèn)為重要的特征。

          “可解釋”是一個(gè)交互式繪圖,可以使用它來更具體地解釋模型。如果我們只在上圖中看到摘要,我們可以選擇另一個(gè)組件來指定要查看的功能。這樣,我們就可以解釋模型中的特征是如何影響預(yù)測(cè)的。

          在上圖中,我們可以看到低票價(jià)降低了生存的機(jī)會(huì),但隨著票價(jià)越來越高,它增加了生存的機(jī)會(huì)。然而,你可以看到密度和條形圖-許多人來自較低的票價(jià)。

          通常情況下,我們不僅對(duì)整體的可解釋性感興趣,而且對(duì)局部的可解釋性感興趣。在本例中,我們可以使用以下代碼來解釋它。

          #Select only the top 5 rows from the test data
          ebm_local = ebm.explain_local(X_test[:5], y_test[:5])
          show(ebm_local)

          局部可解釋性顯示了單個(gè)預(yù)測(cè)是如何進(jìn)行的。這里顯示的值是來自模型的對(duì)數(shù)賠率分?jǐn)?shù),它們被添加并通過 logistic 函數(shù)傳遞,以得到最終預(yù)測(cè)。在這個(gè)預(yù)測(cè)中,我們可以看到男性對(duì)降低存活率的貢獻(xiàn)最大。

          總結(jié)

          機(jī)器學(xué)習(xí)的可解釋性對(duì)于任何數(shù)據(jù)科學(xué)家來說都是一個(gè)重要的工具,因?yàn)樗梢宰屇愀玫貙⒛P徒Y(jié)果傳達(dá)給業(yè)務(wù)用戶,內(nèi)容較多,希望對(duì)大家有幫助!

          往期精彩回顧




          本站qq群851320808,加入微信群請(qǐng)掃碼:

          瀏覽 73
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月天成人影院 | 日韩av成人电影在线观看 | 欧美一级AAAAABBBBB | 亚洲AV色婷婷 | 一区大宝贝 |