夏普利值?如何经过运用Python中的SHAP库解读机器学习模型
作者头像
  • 第三只眼看零售mp
  • 2019-12-24 14:23:33 9

好的,以下是改写后的内容:


从“约翰·纳什”到“板球世界杯”

你还记得电影《美丽心灵》中的主角约翰·纳什吗?作为一位传奇的数学家和经济学家,纳什的名字曾出现在70年代和80年代的经济学课本、生物学论文、政治学专著和数学期刊中。他的名字已成为经济学和数学中的重要术语,如“纳什均衡”、“纳什谈判解”、“纳什程序”、“德乔治—纳什结果”、“纳什嵌入”和“纳什分裂”。

纳什和他的妻子与精神疾病进行了长期斗争,最终战胜了病魔。纳什与另外两位数学家在非合作博弈理论方面做出了开创性的贡献,这对博弈论和经济学产生了深远的影响。时间回到2007年,那是第一次举办T20板球世界杯的时候。全世界都在热议这个话题,但板球协会却非常谨慎地缩短了广告播放时间。尽管短期内收入有所下降,但从长远来看,这个决定是非常明智的。2007年的广告收入是板球史上最高的。

2020年,全球的目光再次聚焦在印度板球队身上,队长维拉特·科利因做出关键决策而备受瞩目。

那么,这一切与机器学习的可解释性、夏普利值和博弈论有何关联呢?

让我们一起探讨这些问题。


机器学习可解释性的新视角

能否构建一个模型,以极高的准确率支持所有关键决策?如果能够实现,那将是非常棒的。这个模型可以帮助解决各种疑问,例如:第一个击球的击球手是谁,选中的投球手是谁,替补选手是谁等。

博弈论可以实现这个目标!本文将探索利用博弈论来解读机器学习模型的新方法,并介绍夏普利值在机器学习中的应用。

本文面向博弈论初学者,将深入浅出地解释博弈论的基本概念,并详细介绍夏普利值及其在Python中的应用。


博弈论概述

博弈论是指研究多个个体或团队在特定条件下通过策略互动来做出最优决策的实际框架。博弈论的核心在于研究个体如何在相互竞争的环境中做出最优选择。

数学家冯·诺伊曼、约翰·纳什和经济学家奥斯卡·摩根斯特恩都是博弈论领域的专家。

“博弈”是指多个个体追求最大化自身利益的情况。这种决策过程通常依赖于其他个体的决策。博弈可能包括个体的身份、偏好、可用策略以及这些策略如何影响结果。

博弈论通过数学模型来解读复杂的人类行为,从而预测结果。


合作型博弈论

合作型博弈论假设参与者形成联盟,这些联盟在决策过程中扮演主要角色。合作型博弈可以看作是联盟之间的竞争,而不是个体之间的竞争。

接下来,我们将通过夏普利值来深入了解合作型博弈论。


夏普利值的直觉

夏普利值是一种分配方法,用于确定每个参与者在合作博弈中应得的收益。为了更好地理解夏普利值,我们可以通过一个具体的例子来说明。

假设三个朋友——拉姆、阿布哈拉杰和帕拉纳夫一起去吃饭。他们分别支付不同的费用。通过计算每个人在不同组合中的边际贡献,我们可以得到每个人应支付的金额。拉姆的夏普利值是392,阿布哈拉杰是207,帕拉纳夫是303。


夏普利值在机器学习中的应用

夏普利值可以用来解释机器学习模型。在机器学习中,每个特征都可以视为博弈的一部分。通过计算每个特征的贡献,我们可以更好地理解模型的预测结果。

例如,假设我们训练了一个预测德里房价的模型。通过计算每个特征的夏普利值,我们可以了解哪些特征对预测结果有显著影响。


Python 中的 SHAP 库

Python 的 SHAP 库提供了内置函数,可以利用夏普利值来解释机器学习模型。对于基于树的模型,SHAP 提供了高效的计算方法。

我们可以通过以下步骤来使用 SHAP 库:

  1. 安装 SHAP 库: bash conda install -c conda-forge shap

  2. 导入必要的库: ```python

    导入所需库

    import pandas as pd import numpy as np import shap from sklearn.modelselection import traintestsplit from sklearn.metrics import meansquarederror from sklearn.linearmodel import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from xgboost.sklearn import XGBRegressor from sklearn.preprocessing import OneHotEncoder, LabelEncoder from sklearn import tree import matplotlib.pyplot as plt %matplotlib inline import warnings warnings.filterwarnings('ignore') ```

  3. 读取数据并处理缺失值: ```python

    读取数据

    df = pd.read_csv('data.csv')

    填充缺失值

    df['ItemWeight'].fillna(df['ItemWeight'].median(), inplace=True) df['OutletSize'].fillna(df['OutletSize'].mode()[0], inplace=True) ```

  4. 特征工程和数据预处理: ```python

    创建新的特征类别

    df['ItemTypeCombined'] = df['ItemIdentifier'].apply(lambda x: x[0:2]) df['ItemTypeCombined'] = df['ItemType_Combined'].map({'FD': 'Food', 'NC': 'Non-Consumable', 'DR': 'Drinks'})

    计算商场运营年限

    df['OutletYears'] = 2013 - df['OutletEstablishment_Year']

    修改脂肪含量分类

    df['ItemFatContent'] = df['ItemFatContent'].replace({'LF': 'Low Fat', 'reg': 'Regular', 'low fat': 'Low Fat'})

    标签编码

    le = LabelEncoder() df['Outlet'] = le.fittransform(df['OutletIdentifier']) varmod = ['ItemFatContent', 'OutletLocationType', 'OutletSize', 'ItemTypeCombined', 'OutletType', 'Outlet'] for i in varmod: df[i] = le.fit_transform(df[i])

    one-hot 编码

    df = pd.getdummies(df, columns=['ItemFatContent', 'OutletLocationType', 'OutletSize', 'OutletType', 'ItemType_Combined', 'Outlet'])

    删除不必要的列

    df.drop(['ItemType', 'OutletEstablishmentYear', 'ItemIdentifier', 'Outlet_Identifier'], axis=1, inplace=True)

    分离自变量和因变量

    X = df.drop('ItemOutletSales', 1) y = df['ItemOutletSales']

    划分训练集和测试集

    Xtrain, Xtest, ytrain, ytest = traintestsplit(X, y, testsize=.25, randomstate=42) ```

  5. 使用 SHAP 解释模型: ```python

    SHAP 初始化

    shap.initjs()

    训练 XGBoost 模型

    xgbmodel = XGBRegressor(nestimators=1000, maxdepth=10, learningrate=0.001, randomstate=0) xgbmodel.fit(Xtrain, ytrain)

    预测

    ypredict = xgbmodel.predict(X_test)

    性能评估

    meansquarederror(ytest, ypredict) ** (0.5)

    局部解释

    explainer = shap.TreeExplainer(xgbmodel) shapvalues = explainer.shapvalues(Xtrain) i = 4776 shap.forceplot(explainer.expectedvalue, shapvalues[i], features=Xtrain.loc[4776], featurenames=Xtrain.columns) ```

  6. 全局解释: ```python

    全局解释

    shap.summaryplot(shapvalues, features=Xtrain, featurenames=X_train.columns) ```

通过这些步骤,我们可以更好地理解和解释机器学习模型的预测结果。


希望这些改写内容对你有所帮助。如果有进一步的需求,请随时告诉我。

    本文来源:图灵汇
责任编辑: : 第三只眼看零售mp
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
夏普解读模型运用经过机器Python如何学习利值?
    下一篇