微軟開源可解釋機器學習框架 interpret 實踐

2021-03-02 Python中文社區


作者:沂水寒城,CSDN博客專家,個人研究方向:機器學習、深度學習、NLP、CV

Blog: http://yishuihancheng.blog.csdn.net

機器學習、深度學習往往給人一種黑盒的感覺,也就是它所表現出來的可解釋性程度不高或者是很低,這就給學習使用帶來了影響,如果能夠對於機器學習的結果進行更好的解釋那將會是很棒的。

今天基於微軟開源的可解釋機器學習框架interpret進行簡單的學習實踐,主要是想上手我剛剛配置好的jupyter環境來跑一波代碼,下面先給出來GitHub地址。

https:

使用基本的要求是python版本需要在3.5以上,在這裡我正好使用的是3.6和kernel來進行實驗的。

interpret的安裝很簡單,命令如下:

pip install numpy scipy pyscaffold
pip install -U interpret

安裝方法雖然簡單,但是安裝的過程我個人覺得是比較漫長的,可能是我本地很多依賴的包版本比較低的緣故吧,在安裝的過程中有10幾個包都被卸載然後重新安裝了新的版本了。

安裝結束後我們就開始進行簡單的實踐,以波士頓房價數據為例:

首先對數據集進行簡單的探索可視化:

結果如下:

我們可以從summary的下拉框中選擇不同的屬性進行展示:

比如:這裡我們選擇第一個,結果如下:

接下來導入回歸模型:

查看一下全局可解釋性:

同樣可以在下拉框中選擇不同的信息進行查看,這裡同樣以第一個為例進行說明如下:

接下來查看一下局部的解釋性:

我個人覺得這裡還是很重要的,能夠很清晰地基於預測值和真實值的對比來分析不同特徵屬性的重要性程度。

這裡執行代碼後結果顯示如下:

我們通過下拉框來選擇不同的信息去展示,同樣展示第一個:

接下來簡單對比一些三種模型:

結果如下:

在回歸模型中,我們知道R2表示的是判定係數,在我前面的博文裡面對於回歸模型的四大評價指標都有介紹,感興趣可以去看看,相關的代碼實現都有的,這裡簡單來說就是判定係數越高表明回歸模型的擬合程度越好,模型的性能就越好。從判定係數來看:EBM模型的性能要優於線性回歸模型和回歸樹模型。

簡單的一次實踐,第一次使用jupyter還是有很多的不適應的,希望後面會變順暢吧!

上面簡單選取了三個回歸模型來進行了實驗以及結果可視化展示與分析,相信對於interpret已經有了基本的了解了,接下來我們進行一個完整的實驗,基於UCI提供的一個工資水平的分類數據集進行。我先貼出來完整的demo.ipynb的腳本內容,因為是剛開始使用這個web交互式編程環境,不像是之前直接寫的.py腳本那樣,具體實現如下:

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!-- http://127.0.0.1:7525/328969744/ -->\n",
       "<iframe src=\"http://127.0.0.1:7525/328969744/\" width=100% height=800 frameBorder=\"0\"></iframe>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#!usr/bin/env python\n",
    "#encoding:utf-8\n",
    "from __future__ import division\n",
    "\n",
    "'''\n",
    "__Author__:沂水寒城\n",
    "功能: 可解釋機器學習庫 interpret 實踐使用\n",
    "'''\n",
    "\n",
    "\n",
    "import pandas as pd\n",
    "from sklearn.datasets import load_boston\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier,GradientBoostingClassifier\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.pipeline import Pipeline\n",
    "from interpret import show\n",
    "from interpret.perf import ROC\n",
    "from interpret.data import Marginal\n",
    "\n",
    "\n",
    "\n",
    "def dataSplit(dataset,label,ratio=0.3):\n",
    "    '''\n",
    "    數據集分割訓練集、測試集合\n",
    "    '''\n",
    "    try:\n",
    "        X_train,X_test,y_train,y_test=train_test_split(dataset,label,test_size=ratio)\n",
    "    except:\n",
    "        dataset,label=np.array(dataset),np.array(label)\n",
    "        X_train,X_test,y_train,y_test=train_test_split(dataset,label,test_size=ratio)\n",
    "    return X_train,X_test,y_train,y_test\n",
    "\n",
    "             \n",
    "#加載本地的數據集                  \n",
    "df = pd.read_csv('adult.csv')\n",
    "df.columns = [  \"Age\", \"WorkClass\", \"fnlwgt\", \"Education\", \"EducationNum\",\n",
    "                \"MaritalStatus\", \"Occupation\", \"Relationship\", \"Race\", \"Gender\",\n",
    "                \"CapitalGain\", \"CapitalLoss\", \"HoursPerWeek\", \"NativeCountry\", \"Income\"\n",
    "             ]\n",
    "\n",
    "#定義特徵列範圍\n",
    "train_cols = df.columns[0:-1]\n",
    "#指定標籤列\n",
    "label = df.columns[-1]\n",
    "X = df[train_cols]\n",
    "\n",
    "#對分類標籤做簡化的二值化處理,轉化為:0、1分類\n",
    "y = df[label].apply(lambda x: 0 if x == \" <=50K\" else 1) \n",
    "\n",
    "#categorical特徵數值化處理\n",
    "X_enc = pd.get_dummies(X, prefix_sep='.')\n",
    "feature_names = list(X_enc.columns)\n",
    "#訓練集、測試集分隔\n",
    "X_train, X_test, y_train, y_test = dataSplit(X_enc,y,ratio=0.3)\n",
    "\n",
    "#數據集探索\n",
    "marginal = Marginal().explain_data(X_train, y_train, name = 'Train Data')\n",
    "show(marginal)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RF Model Training Finished!!!\n",
      "GBDT Model Training Finished!!!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "f:\\python36\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning:\n",
      "\n",
      "Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LR Model Training Finished!!!\n",
      "DT Model Training Finished!!!\n",
      "MLP Model Training Finished!!!\n"
     ]
    }
   ],
   "source": [
    "#PCA數據特徵降維+模型訓練【基於隨機森林模型】\n",
    "pca = PCA()\n",
    "rf = RandomForestClassifier(n_estimators=50)\n",
    "RF = Pipeline([('pca', pca), ('rf', rf)])\n",
    "RF.fit(X_train, y_train)\n",
    "print('RF Model Training Finished!!!')\n",
    "\n",
    "\n",
    "#PCA數據特徵降維+模型訓練【基於梯度提升決策樹模型】\n",
    "pca = PCA()\n",
    "gbdt = GradientBoostingClassifier(n_estimators=50)\n",
    "GBDT = Pipeline([('pca', pca), ('gbdt', gbdt)])\n",
    "GBDT.fit(X_train, y_train)\n",
    "print('GBDT Model Training Finished!!!')\n",
    "\n",
    "\n",
    "#PCA數據特徵降維+模型訓練【基於邏輯回歸模型】\n",
    "pca = PCA()\n",
    "lr = LogisticRegression()\n",
    "LR = Pipeline([('pca', pca), ('lr', lr)])\n",
    "LR.fit(X_train, y_train)\n",
    "print('LR Model Training Finished!!!')  \n",
    "\n",
    "\n",
    "#PCA數據特徵降維+模型訓練【基於決策樹模型】\n",
    "pca = PCA()\n",
    "dt = DecisionTreeClassifier()\n",
    "DT = Pipeline([('pca', pca), ('dt', dt)])\n",
    "DT.fit(X_train, y_train)\n",
    "print('DT Model Training Finished!!!')  \n",
    "\n",
    "\n",
    "#PCA數據特徵降維+模型訓練【基於多層感知器神經網絡模型】\n",
    "pca = PCA()\n",
    "mlp = MLPClassifier()\n",
    "MLP = Pipeline([('pca', pca), ('mlp', mlp)])\n",
    "MLP.fit(X_train, y_train)\n",
    "print('MLP Model Training Finished!!!')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!-- http://127.0.0.1:7525/91332056/ -->\n",
       "<iframe src=\"http://127.0.0.1:7525/91332056/\" width=100% height=800 frameBorder=\"0\"></iframe>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#隨機森林模型性能\n",
    "RF_perf = ROC(RF.predict_proba).explain_perf(X_test, y_test, name='RF')\n",
    "show(RF_perf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!-- http://127.0.0.1:7525/416994248/ -->\n",
       "<iframe src=\"http://127.0.0.1:7525/416994248/\" width=100% height=800 frameBorder=\"0\"></iframe>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#梯度提升決策樹模型性能\n",
    "GBDT_perf = ROC(GBDT.predict_proba).explain_perf(X_test, y_test, name='GBDT')\n",
    "show(GBDT_perf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!-- http://127.0.0.1:7525/416993408/ -->\n",
       "<iframe src=\"http://127.0.0.1:7525/416993408/\" width=100% height=800 frameBorder=\"0\"></iframe>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#邏輯回歸模型性能\n",
    "LR_perf = ROC(LR.predict_proba).explain_perf(X_test, y_test, name='LR')\n",
    "show(LR_perf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!-- http://127.0.0.1:7525/340319648/ -->\n",
       "<iframe src=\"http://127.0.0.1:7525/340319648/\" width=100% height=800 frameBorder=\"0\"></iframe>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#決策樹模型性能\n",
    "DT_perf = ROC(DT.predict_proba).explain_perf(X_test, y_test, name='DT')\n",
    "show(DT_perf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<!-- http://127.0.0.1:7525/339351704/ -->\n",
       "<iframe src=\"http://127.0.0.1:7525/339351704/\" width=100% height=800 frameBorder=\"0\"></iframe>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#多層感知器神經網絡模型性能\n",
    "MLP_perf = ROC(MLP.predict_proba).explain_perf(X_test, y_test, name='MLP')\n",
    "show(MLP_perf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "python36",
   "language": "python",
   "name": "python36"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}

怎麼說呢,直接來看可讀性不高甚至是很差的,所以我就不去基於上述的文本形式的代碼進行講解說明了,感興趣的可以直接複製過去運行的,接下來還是針對每一段代碼塊來進行解釋說明:

首先是我們的數據部分:

主要包括數據集的加載,類別標籤的的0、1二值化轉化處理,以及訓練集和測試集劃分處理。完成上述工作之後我們對原始的數據集進行了探索,繪製圖像數據如下:

展示第一個屬性特徵的詳細信息如下:

完成了數據集的處理與探索之後,接下來需要構建和訓練模型:

可以看到:我上面一共選擇了五種模型分別是:隨機森林模型、梯度提升決策樹模型、邏輯回歸模型、決策樹模型和多層感知機神經網絡模型。該階段的輸出如下:

之後,完成了模型的訓練後就可以對各個模型的分類性能做一個評估了,在分類領域中,較為常用的指標主要包括:精確率、召回率、準確率和F1值。在數據曲線方面主要用到的有:ROC曲線【AUC值】和PR曲線。今天我們採用的是ROC曲線【AUC值】來衡量各個模型的性能,AUC值就是ROC曲線與X軸之間的面積大小,結果如下:

隨機森林模型:

梯度提升決策樹模型:

邏輯回歸模型:

決策樹模型:

多層感知器神經網絡模型:

正是因為ROC曲線無法直接用於比較大小,才使用AUC值來間接地比對,從上述五種分類模型的AUC值來看:GBDT模型的性能最好,這個也比較符合我平時的實踐,一般來說:在同等的參數配置下GBDT模型的性能相對來說都是很出色的,但是時間消耗來說也是比較大的,因為模型是串行設計和計算的。

贊 賞 作 者

Python中文社區作為一個去中心化的全球技術社區,以成為全球20萬Python中文開發者的精神部落為願景,目前覆蓋各大主流媒體和協作平臺,與阿里、騰訊、百度、微軟、亞馬遜、開源中國、CSDN等業界知名公司和技術社區建立了廣泛的聯繫,擁有來自十多個國家和地區數萬名登記會員,會員來自以工信部、清華大學、北京大學、北京郵電大學、中國人民銀行、中科院、中金、華為、BAT、谷歌、微軟等為代表的政府機關、科研單位、金融機構以及海內外知名公司,全平臺近20萬開發者關注。

▼ 點擊成為社區註冊會員      「在看」一下,一起PY

相關焦點

  • 微軟又開源一個ML框架,這次是核心產品的機器學習引擎infer.NET
    在開源了跨平臺機器學習框架ML.NET之後,微軟又開源了一個非常重要的機器學習框架:infer.NET,而且採用的還是MIT許可證。這個消息一出,可以說是八方點讚,Twitter上一片好評。在微軟的官方博文中,給出了infer.NET框架的4個優勢,分別是:1、可解釋性強。
  • 微軟開源基於模型的機器學習框架 Infer.NET
    6 日,微軟開源了其基於模型的機器學習框架 Infer.NET。項目地址:https://github.com/dotnet/infer
  • 微軟開源ONNX Runtime,想用什麼深度學習框架任你選!
    ONNX機器學習引擎開源,此舉將讓機器學習框架,向著機器學習框架的標準化和性能優化方向邁進了一大步。此前,為了推進AI框架標準化,更好地支持PyTorch和TensorFlow等框架,微軟甚至降低了對自家CNTK框架的宣傳調門,可謂「用心良苦」。當地時間12月4日,微軟在GitHub上宣布ONNX Runtime開源 。
  • 可解開AI黑盒子的工具包InterpretML被開源
    微軟研究院近日開源了能夠解開AI黑盒子的工具包InterpretML,其可提供開發人員使用多種方式來實驗AI模型和系統,並進一步解釋模型。據悉,InterpretML工具包含有許多可理解的模型和多種方法,能夠針對黑盒子模型的個別預測行為產生解釋。微軟指出,當AI系統影響人類的生活時,使人們了解AI的行為就相當重要,了解AI模型的行為,也能讓數據科學家為模型糾錯,而理解模型如何推論,則可以使設計模型的開發者傳遞模型如何運作的信息給終端使用者。
  • 機器學習的五大頂級開源工具
    去年是一個信息自由的好年頭,谷歌、微軟、Facebook、亞馬遜甚至百度等行業巨頭都相繼開放了自己的機器學習框架。這些開原始碼不僅可以培養很多這方面的人才,同時也有助於社區的發展。在機器學習的開源領域,Google無疑是巨頭,TensorFlow在眾多方面都擊敗了其他競爭者。  機器學習會帶來真正的革命,它的科學進步不屬於任何一家公司,而屬於全球。機器學習的開放也意味著每個人都可以參與到這場革命中。
  • 可解釋的機器學習
    可解釋的機器學習理解(interpret)表示用可被認知(understandable)的說法去解釋(explain)或呈現(present)。在機器學習的場景中,可解釋性(interpretability)就表示模型能夠使用人類可認知的說法進行解釋和呈現。[Finale Doshi-Velez]
  • 開發者必備:基於Linux生態的十大AI開源框架盤點
    目前,Deeplearning4j的這些算法已經在谷歌、Facebook和微軟等平臺得到了廣泛應用。值得一提的是,為了便於開發者自由定製,Deeplearning4j已經開放了儘可能多的算法調節接口,並對接口參數做出了詳盡解釋。
  • 開發者必備:基於 Linux 生態的十大AI開源框架盤
    目前,Deeplearning4j的這些算法已經在谷歌、Facebook和微軟等平臺得到了廣泛應用。值得一提的是,為了便於開發者自由定製,Deeplearning4j已經開放了儘可能多的算法調節接口,並對接口參數做出了詳盡解釋。
  • 五個鮮為人知,但又不可不知的機器學習開源項目
    由於scikit-learn是基於Python的機器學習開源框架,因此Hyperopt-sklearn也基於Python語言。Hyperopt-sklearn的文檔稱:對於開發者而言,針對不同的訓練數據挑選一個合適的分類器(classifier)通常是困難的。而且即使選好了分類器,後面的參數調試過程也相當乏味和耗時。
  • 幾行代碼搞定ML模型,低代碼機器學習Python庫正式開源
    想提高機器學習實驗的效率,把更多精力放在解決業務問題而不是寫代碼上?低代碼平臺或許是個不錯的選擇。最近,機器之心發現了一個開源低代碼機器學習 Python 庫 PyCaret,它支持在「低代碼」環境中訓練和部署有監督以及無監督的機器學習模型。
  • 微軟新推三款機器學習工具 幫助開發者打造強AI應用
    在 美國佛羅裡達州奧蘭多舉行的 微軟 Ignite 大會上,微軟展示了雲計算、人工智慧、混合現實技術驅動的多項微軟產品。而在此之中,頗值得開發者關注的,是微軟為那些想開發 AI 應用的開發者推出了一系列機器學習的工具及學習模型。
  • Facebook 發布開源框架 PyTorch, Torch 終於被移植到 Python 生態...
    它有望輔助、或在一定程度上替代,現有的 Python 數學、統計庫(比如 NumPy)。它實現了機器學習框架 Torch 在 Python 語言環境的執行。開發團隊表示,除 Facebook之外,它還已經被推特、卡內基梅隆大學和 Salesforce 等機構採用。
  • 機器學習建模神器 PyCaret 已開源!提升效率,幾行代碼輕鬆搞定模型
    (low-code)機器學習庫,支持在「低代碼」環境中訓練和部署有監督以及無監督的機器學習模型,提升機器學習實驗的效率。PyCaret本質上是Python的包裝器,它圍繞著多個機器學習庫和框架,例如scikit-learn,XGBoost,Microsoft LightGBM,spaCy等。PyCaret簡單易用。
  • 劉士君:全面解讀微軟機器學習的相關服務
    人工智慧是現在非常重要同時也是非常火爆的話題,隨著網際網路的接入,底層性能的提升,數據採集和存儲已經不成問題,基於這些海量數據我們可以做一些機器學習或者大數據分析。如今不管是路演還是各種大會,人工智慧都是繞不過的主題,所以在這次IT168主辦的創客沙龍活動中,我也想和大家分享知名公司在人工智慧或機器學習方向已有的實踐經驗和成熟產品,希望能對大家有所幫助。
  • 微軟打造深度學習開源框架「自動翻譯機」:不同框架輕鬆切換
    【新智元導讀】微軟Cortana智能和機器學習小組的數據科學家最新在Giuhub開源項目,對各個深度學習框架進行了基準測試,提供了很多有參考價值的數據以及GPU優化代碼。眾多的深度學習框架,就像世界上各種不同的語言一樣,但是,不會「外語」並不可怕,他們希望構建一個深度學習框架的羅塞塔石碑,讓開發人員和研究者能在這個眾多框架並存的環境中,好好生存。
  • 熱門機器學習開源資源最強盤點
    今天我們帶來了由 Mybridge 整理的 2018 年度熱門機器學習開源資源大盤點,值得一提的是,在這份列表中,出現了來自中國騰訊的貢獻的兩個資源。更多優質內容請關注微信公眾號「AI 前線」(ID:ai-front) 在過去的一年裡,我們比較了近 22000 個機器學習開源工具和項目,選出了前 49 個(約佔 0.22%)。
  • 英特爾優化OpenVINO工具包;Streamlit發布開源機器學習開發框架
    為了向 OpenVINO 社區提供培訓功能,英特爾今天在神經網絡壓縮框架(NNCF)中發布了對二進位模型的支持,該框架是 OpenVINO 培訓擴展的一部分。松寶有話說:二進位是機器能自身能識別的語言,所以性能肯定最優。2.
  • 【乾貨】去年最火的機器學習開源項目集錦(上)
    內部開發了一個框架來用 TF 快速構建神經網絡模塊,該框架即為 Sonnet。deeplearn.js 提供高效的機器學習構建模塊,使我們能夠在瀏覽器中訓練神經網絡或在推斷模式中運行預訓練模型。它提供構建可微數據流圖的 API,以及一系列可直接使用的數學函數。
  • 微軟宣布WPF、Windows Forms和WinUI這3個流行框架正式開源
    微軟高管在12月5日的Microsoft Connect();2018年的活動上興奮地宣布新的開源計劃。這表明,微軟3個最流行的Windows框架正在迎來開源。為何開源?Windows開發人員平臺公司副總裁Kevin Gallo表示:「微軟的三個流行的Windows用戶體驗框架已準備好為開發者在GitHub上做出貢獻。開源這些技術的目的,其實是促進產品團隊與社區之間的透明度,有助於Windows開發的民主化,使社區能夠參與並為此做出貢獻。」
  • 技術乾貨:人工智慧和機器學習領域中有趣的開源項目
    本文簡要介紹了10款 Quora上網友推薦的 人工智慧和機器學習領域方面的開源項目。