“有趣”的预测 PCA 失败的地方。
探索性数据分析的一种有吸引力的替代方法。
大多数数据科学家都熟悉作为探索性数据分析工具的主成分分析(PCA)。外行人回顾一下:研究人员经常使用 PCA 进行降维,希望揭示他们数据中的有用信息(例如,疾病与非疾病类别分离)。PCA 通过寻找正交投影向量来实现这一点,正交投影向量解释了数据中方差的最大量。在实践中,这通常是通过使用奇异值分解(SVD)来找到主成分(特征向量),根据它们对数据中总方差的贡献(特征值)进行加权。毫无疑问,PCA 是我的领域(化学)和许多其他领域中使用最多的数据分析工具,但当它不起作用时会发生什么呢?是不是说明采样实验不好?没有。这是否意味着数据中没有有用的信息?不。我们在达尔豪西大学的团队致力于开发新的化学数据分析工具。今天,我要告诉你一种替代主成分分析的方法,叫做投影寻踪分析(PPA)。
General factor analysis model
PCA 对方差进行操作
PCA 失败在哪里?如前所述,PCA 通过寻找数据中最大方差的方向来工作。如果那个方向上的投影没有用呢?下图由模拟数据(200 个样本)组成,这些数据形成了两个独立的聚类,这两个聚类沿 y- 轴的方差大于沿 x- 轴的方差。如果我们对这个二维数据进行 PCA,我们获得的投影向量, v ,将是 2 x 1 列向量([0;1]).原始数据,X(200X2),投影到这个向量上就给了我们分数T=Xv。可视化这些分数显示两个集群之间没有明显的分离。相反,如果我们投影到 x 轴上(v=【1;0]),那么就很容易看到集群中的分离。我们如何在高维数据中找到这个向量?
“Interesting” projections are projections that reveal, for example, class information.
投影寻踪
投影寻踪,最初由 Friedman 和 Tukey (1974)提出,试图通过最大化或最小化投影指数在数据中找到“感兴趣的”投影。通过扩展,在 PCA 框架中,投影指数(方差)被最大化。现在的问题是,“什么是好的预测指数?”。在定义新的投影指数方面已经做了大量的研究,但我今天将重点关注的一个已被证明对探索化学数据有用的指数是峰度。
基于峰度的投影寻踪
第四个统计矩峰度已被证明是有用的预测指标(https://www . science direct . com/science/article/pii/s 0003267011010804)。
Univariate kurtosis
当峰度最大化时,它往往会揭示数据中的异常值。有些有用,但不是我们真正想要揭示的类或集群信息。然而,当峰度最小化时,它将数据分成一维的两组(二维的 4 组和三维的 8 组)。
Kurtosis minimization
最大的问题是如何使用峰度来搜索这些投影向量?准幂学习算法。见https://www . science direct . com/science/article/pii/s 0003267011010804。在本文中,Hou 和 Wentzell 表明,可以使用以下学习算法找到使峰度最小化的投影向量:
Finding the projection vector that minimizes kurtosis
示例模拟
让我们模拟一些数据,并应用主成分分析和 PPA。类似于开始的图形,我们的数据将有 2 个类(每个类中有 100 个样本),并且只需要 1 个维度来揭示类分离。第一类将以 x 轴上的-4 为中心,标准差为 5,第二类以+4 为中心,标准差为 5。
Original data
为了更真实,让我们通过乘以 2 x 600 随机旋转矩阵,将这个 200 x 2 矩阵旋转成 600 维。这就是我们现在需要利用我们的探索性工具来发现我们的数据的一些有趣的预测的地方。首先,让列均值集中我们的数据,并应用主成分分析,将第一个分量可视化为样本数的函数。
First component from PCA
我们看到,将数据投影到第一台PC 上不会显示任何类别信息。让我们现在申请 PPA。
First scores from PPA
PPA 能够找到对我们有用的投影(即提供类分离的投影)。
PPA 有麻烦的地方
尽管在大多数情况下,PPA 的表现优于主成分分析,但当 PPA 不起作用时,还是有一些重要的注意事项。当班级规模不相等时,PPA 不能很好地工作,例如,如果我在上面的示例中设定 5:1 的班级比例,并应用 PPA,我们会得到:
由于分离的几何关系,当类的数量不是 2 的幂时,PPA 很难理解。PPA 也与过度拟合作斗争,通常需要进行数据压缩(大约需要 10:1 的样本与变量比率)。否则,算法会人为地将样本推到角落里。我们小组目前的工作集中在开发缓解这些问题的方法上,(好消息)我们应该会在未来几个月内发表一些这方面的论文!我一定会让你们了解最新情况。
2020 年 2 月编辑:我们最近发布了一个稀疏的 PPA 实现,它规避了在 PPA 之前对 PCA 压缩的需求。参见 SPPA 库或 t 何在分析化学中的论文。
史蒂夫(男子名)
协方差矩阵的有趣性质
数据科学家关于协方差矩阵的基本信息
协方差矩阵有许多有趣的属性,可以在混合模型、成分分析、卡尔曼滤波器等中找到。发展对协方差矩阵如何运作的直觉有助于理解其实际含义。本文将集中在一些重要的性质,相关的证明,然后一些有趣的实际应用,即非高斯混合模型。
我经常发现研究论文在写公式时没有详细说明矩阵的形状。我已经包括了这些和其他必要的信息来帮助数据科学家编写他们自己的算法。
子协方差矩阵
协方差矩阵可以分解成多个唯一的(2×2)协方差矩阵。唯一子协方差矩阵的数量等于矩阵下半部分的元素数量,不包括主对角线。A (DxD)协方差矩阵将具有 D*(D+1)/2 -D 唯一子协方差矩阵。例如,三维协方差矩阵在等式(0)中示出。
可以看出,协方差矩阵中的每个元素由每个(I,j)维对之间的协方差来表示。等式(1)显示了将 a (DxD)分解成多个(2x2)协方差矩阵。对于(3x3)维的情况,将有 3 * 4/2–3 或 3 个唯一的子协方差矩阵。
注意,生成随机子协方差矩阵可能不会产生有效的协方差矩阵。协方差矩阵必须是半正定的,并且子协方差矩阵的每个对角线元素的方差必须与协方差矩阵对角线上的方差相同。
正半定性质
协方差矩阵的性质之一是它必须是半正定矩阵。正定是什么意思,为什么协方差矩阵总是半正定的,值得另文讨论。简而言之,如果等式(2)中所示的运算产生大于或等于零的值,则矩阵 M 是半正定的。
m 是实值 DxD 矩阵,z 是 Dx1 向量。注意:这个操作的结果是一个 1x1 标量。
协方差矩阵 M 可以通过以下操作从数据中构建,其中 M = E[(x-mu)。T*(x-mu)]。将 M 代入等式(2)得到等式(3)。可以看出,任何可以写成 M.T*M 形式的矩阵都是半正定的。出处。 ✎编辑
请注意,协方差矩阵并不总是描述数据集维度之间的协变。例如,协方差矩阵可用于描述高斯混合模型中使用的多元正态聚类的形状。
几何含义
另一种思考方式协方差矩阵是几何级数的。本质上,协方差矩阵表示数据传播的方向和比例。为了理解这个观点,有必要理解特征值和特征向量。
等式(4)示出了特征向量及其相关特征值的定义。下一个陈述对理解特征向量和特征值很重要。如果矩阵乘法 Mz 产生相同的向量 z,则 z 是 M 的特征向量。换句话说,我们可以把矩阵 M 看作是不*改变 z 方向的变换矩阵,或者 z 是矩阵 M 的一个基矢。
λ是特征值(1x1)标量,z 是特征向量(Dx1)矩阵,M 是(DxD)协方差矩阵。半正定(DxD)协方差矩阵将具有 D 个特征值和(DxD)个特征向量。第一特征向量总是在数据的最高扩展的方向上,所有特征向量彼此正交,并且所有特征向量被归一化,即它们具有 0 和 1 之间的值。等式(5)示出了协方差矩阵、特征向量和特征值之间的矢量化关系。
s 是(DxD)对角缩放矩阵,其中对角值对应于特征值,并且表示每个特征向量的方差。r 是(DxD)旋转矩阵,表示每个特征值的方向。
在上面的等式中,对于唯一的(I,j)子协方差(2D)矩阵,表示特征向量和特征值矩阵。等式(6)中所示的子协方差矩阵的特征向量具有一个参数θ,其控制每个(I,j) 维对之间的旋转量。协方差矩阵的特征值跨越对角元素,如等式(7)所示,并且表示每个维度的方差。缩放矩阵具有控制每个特征向量的缩放的 D 个参数。
协方差矩阵变换
通过应用相关的比例和旋转矩阵,( 2x2)协方差矩阵可以变换(2x1)向量。比例矩阵必须在旋转矩阵之前应用,如等式(8)所示。
等式(9)中示出了(Nx2)矩阵 X 的矢量化协方差矩阵变换。矩阵 X 必须以(0,0)为中心,这样向量才能正确地绕原点旋转。如果矩阵 X 不居中,数据点将不会围绕原点旋转。
(Nx2)矩阵的协方差变换示例如图 1 所示。关于如何生成该图的更多信息可在此处找到。
Figure 1. Covariance Matrix Transform
绘制高斯混合等高线
通过用子协方差矩阵变换(2×2)单位圆,高斯混合的轮廓可以在多个维度上可视化。特定标准偏差下的聚类轮廓可以通过将标度矩阵乘以期望标准偏差的平方值来绘制。然后,聚类从原点移动到它们相关的质心值。生成下图的代码可以在这里找到。
Figure 2. Gaussian Mixture Contours
图二。显示了在虹膜数据集上训练的 3 簇高斯混合模型解决方案。在上面的图中,等高线代表混合物的概率密度,在一个特定的标准偏差,从群集的质心。在图 2 中。,从每个聚类的质心绘制 1 个标准偏差和 2 个标准偏差的等值线。
离群点检测
高斯混合有推开聚类的趋势,因为具有重叠分布会降低优化度量、最大似然估计或 MLE。数据点仍有很高的概率属于多元正态聚类,同时仍是一个或多个维度上的异常值。相对较低的概率值表示属于特定聚类的数据点的不确定性。
通过找到位于多元超立方体之外的数据点,可以将均匀混合模型用于异常值检测。这些混合物对导致特定特征向量上的低方差的“强烈”剪切是鲁棒的。与平滑轮廓相比,查找数据点位于多边形内部还是外部在计算上也更容易。
均匀分布聚类的创建方式与上一节中生成等值线的方式相同。以(0,0)为中心的单位正方形通过子协方差矩阵进行变换,然后移动到特定的平均值。
Figure 3. Multivariate Uniform Mixture — Outlier Detection
旋转后的矩形,如图 3 所示。的长度等于每个特征值的平方根的 1.58 倍。离群值被定义为不完全位于一个集群的超立方体内的数据点。异常值被着色以帮助可视化至少在一个维度上代表异常值的数据点。有许多不同的方法可以用来查找数据点是否位于凸多边形内。寻找一个数据点是否位于多边形内将留给读者作为练习。
均匀分布混合模型的另一个潜在用例是将该算法用作核密度分类器。可以为超立方体内部的数据点找到目标的平均值,并且可以将其用作该集群具有目标的概率。该算法将允许为每个集群独立考虑成本效益分析。
主成分分析
主成分分析(PCA)利用数据集的协方差矩阵将数据集转换为一组正交要素,以获取最大范围的数据。下面的代码片段说明了如何使用协方差矩阵的特征向量和特征值来生成主分量。
特征向量矩阵可用于将标准化数据集转换成一组主成分。数据集的维数可以通过丢弃捕获最低数据分布或具有最低相应特征值的特征向量来减少。在计算协方差矩阵之前,应标准化数据集的列,以确保每列的权重相等。
最终注释
还有许多更有趣的使用案例和属性没有在本文中介绍:1)协方差和相关性之间的关系 2)寻找最近相关矩阵 3)协方差矩阵在卡尔曼滤波器、马氏距离和主成分分析中的应用 4)如何计算协方差矩阵的特征向量和特征值 5)如何优化高斯混合模型。
资源
协方差和中心极限定理 ✎版
中间细流
构建不断发展的应用程序时的一些提示和技巧
It’s never too early to start scaffolding your app. Image by Michael Gaida from Pixabay.
Streamlit 是一款非常棒的工具,可以为您的数据科学工作提供一个界面。我一直将它作为一个轻量级仪表板工具来显示简单的可视化效果,在 UI 中包装 python 包,并探索 NLP 模型的模型评估(真实示例 1 和 2 )。它让我能够更好地理解我的数据,并创建了一个界面,可以帮助在代码/数据/分析之间进行转换,并与利益相关者和主题专家进行交流。
然而,今天的原型变成了明天的生产应用。把事情变得太容易是有风险的——在你知道之前,你已经建立了下一次迭代会同样快发生的预期,或者你的应用程序是健壮的和经过良好测试的,或者在整个公司范围内部署它是指日可待的,或者新实习生可以从这里开始节省一些钱。
随着应用的增长,您需要管理成长的烦恼。在这篇文章中,我将提供一些随着我的 streamit 应用程序的发展而变得有用的技巧和想法。我将从一些构建更好的应用程序的简单技巧开始,以一些使应用程序模块化和可测试的想法结束。
(作为一个功能说明,任何时候你看到一个要点,你都应该能够将其作为一个 streamlit 应用程序运行,并探索自己。如果你愿意做一个pip install streamlit pandas altair vega_datasets
,你可以用streamlit run <gist_url>
运行下面的任何一个 gists。
显示干净的变量名
数据帧中的变量名可能是蛇形的或以不适合最终用户的方式格式化,例如pointless_metric_my_boss_requested_and_i_reluctantly_included
。大多数 streamlit 小部件都包含一个format_func
参数,该参数具有将显示格式应用于您提供给小部件的选项值的功能。举个简单的例子,你可以给每个变量名都加上大小写。
您还可以将此功能与字典结合使用,以显式处理值的格式。下面的例子清理了birdstrikes
数据集中的列名,用作描述每一列的下拉列表。
Passing dict.get
as an argument to format_func
allows you to explicitly control the display of widget values
使用缓存(但首先要进行基准测试)
人们很容易把那个便利的@st.cache
装饰器扔在所有东西上,并希望一切顺利。然而,盲目地应用缓存意味着我们错过了一个获得 meta 并使用 streamlit 来了解缓存在哪里最有帮助的大好机会。
与其装饰每个函数,不如为每个函数创建两个版本:一个有装饰器,一个没有。然后做一些基本的基准测试,看看执行这个函数的缓存版本和非缓存版本需要多长时间。
在下面的例子中,我们通过连接 100 个airports
数据集的副本,然后动态选择第一个n
行并描述它们来模拟加载一个大型数据集。
Don’t blindly apply @st.cache
— benchmark and apply where appropriate
因为其中的每一步(数据加载、选择行、描述选择)都是计时的,所以我们可以看到缓存在哪里提供了加速。根据我在这个例子中的经验,我对缓存的启发是:
- 总是缓存加载数据集
- 可能缓存时间超过半秒的函数
- 衡量其他一切
我认为缓存是 streamlit 的杀手锏之一,我知道他们正在关注并改进它。智能缓存也是一个复杂的问题,所以更倾向于基准测试和验证缓存功能是否按预期运行是一个好主意。
创建动态小部件
许多例子侧重于创建动态可视化,但是不要忘记您也可以编程动态小部件。这种需求最简单的例子是当数据集中的两列有嵌套关系,并且有两个小部件从这两列中选择值时。构建应用程序来过滤数据时,第一列的下拉列表应更改第二个下拉列表中的可用选项。
两个下拉菜单的链接行为是一个常见的用例。以下示例使用cars
数据集构建了一个散点图。这里我们需要一个动态下拉菜单,因为我们为 x 轴选择的变量不需要在 y 轴上可供选择。
我们还可以超越这个基本的动态功能:如果我们按照 y 轴选项与所选 x 变量的相关性对它们进行排序,会怎么样呢?我们可以计算相关性,并将其与小部件的format_func
结合起来,以排序的顺序显示变量及其相关性。
Dynamic widgets are a powerful way to add more context around your app’s functionality
大量使用 f 弦和降价
在上面的例子中,我们使用 python 的 f 字符串来插入变量名及其相关值。在围绕分析构建界面时,大部分工作都需要在变量名、小部件值、轴标签、小部件标签或叙述性描述中创建或操作字符串。
如果我们想以叙述的形式展示一些分析,并且有一些特定的变量我们想突出显示,f-strings 和 markdown 可以帮助我们。除了用特定的变量值填充字符串的简单方法之外,内联格式化它们也是一种简单的方法。例如,我们可以使用类似这样的东西来显示数据集中某一列的基本信息,并在 markdown 字符串中突出显示它们。
mean = df["values"].mean()
n_rows = len(df)md_results = f"The mean is **{mean:.2f}** and there are **{n_rows:,}**."st.markdown(md_results)
我们在这里使用了两种格式:.2f
将浮点数舍入到两位小数,而,
使用逗号作为千位分隔符。我们还使用 markdown 语法来加粗这些值,以便它们在文本中视觉上突出。
考虑切换到 Altair 进行可视化
如果您一直在用另一个库构建可视化原型,那么可以考虑切换到 Altair 来构建您的可视化。以我的经验来看,我认为有三个关键原因可以说明转换是有益的:
- Altair 可能更快(除非我们在绘制大量数据)
- 它直接在熊猫数据帧上操作
- 交互式可视化很容易创建
关于速度的第一点,如果我们使用 matplotlib 进行原型化,我们可以看到显著的加速。与渲染 javascript 可视化相比,大部分加速只是因为渲染静态图像并将其放入应用程序需要更多时间。下面的示例应用程序演示了这一点,它为一些生成的数据生成散点图,并为可视化的每个部分输出创建和渲染的时间。
Altair can be faster than matplotlib if you’re plotting less than a few thousand pionts.
直接使用数据框架提供了另一个好处。它可以简化调试过程:如果输入数据有问题,我们可以使用st.write(df)
在 streamlit 应用程序中显示数据帧并检查它。这使得调试数据问题的反馈循环更短。第二个好处是,它减少了创建特定可视化所需的转换粘合代码的数量。对于基本的绘图,我们可以使用 DataFrame 的绘图方法,但是更复杂的可视化可能需要我们以一种对可视化 API 有意义的方式来重构数据集。数据集和可视化之间的这些额外代码可能会导致额外的复杂性,并且随着应用程序的增长,可能会成为一个棘手的问题。由于 Altair 使用 Vega-Lite 可视化语法,转换 API 中可用的函数可用于进行任何可视化的适当转换。
最后,Altair 的交互式可视化非常简单。虽然应用程序可能会使用 streamlit 小部件来过滤和选择数据,但应用程序也可以使用可视化功能作为选择机制。交互式可视化允许在可视化中对数据的各个方面进行可视化交流,而不是在小部件或叙述中以字符串的形式交流信息。
不要忽视重构、编写模块化代码和测试
花几个小时使用 streamlit 并拥有一个除了你之外没有人理解的 500 行文件是很容易的。如果你正在交付你的代码,部署你的应用程序,或者添加一些新的功能,现在你可能会花费大量的时间试图记住你的代码是如何工作的,因为你已经忽略了良好的代码卫生。
如果一个应用程序超过 100 行代码,它可能会从重构中受益。好的第一步是从代码中创建函数,并将这些函数放在一个单独的helpers.py
文件中。这也使得在这些函数上测试和测试缓存变得更加容易。
关于如何重构代码,没有具体的正确方法,但是我开发了一个练习,可以在开始重构应用程序时提供帮助。
重构练习
在 app.py 中,尝试:
- 仅导入 streamlit 和助手函数(不要忘记在这些助手函数上测试
@st.cache
) - 不要在下一行代码中创建没有输入到 streamlit 对象的变量,例如可视化或小部件(数据加载函数除外)
这些并不是必须遵守的硬性规则:你可以明确地遵循它们,因为你有大量复杂的功能,所以你的应用组织得很差。然而,当从 app.py 中的所有东西转移到更模块化的结构时,它们是很好的开始目标。
下面的例子突出显示了在进行这个练习前后的一个应用程序。
Functions are great and you should use them.
以这种方式重新组织代码的另一个好处是,helpers 文件中的函数现在更容易编写测试。有时我很难想出要测试什么,但我发现现在为我的应用程序进行测试真的很容易,因为我现在可以更快地发现错误和边缘情况,因为我与数据和代码的交互更紧密了。现在,每当我的应用程序显示回溯,我就修复导致它的函数,并编写一个测试来确保新的行为是我所期望的。
包裹
我一直很享受使用 streamlit 的时光,这是一款出色的工具,能够满足数据科学工作流程中的明确需求。然而,今天的原型就是明天的生产应用,一个简单的应用很容易成为数据科学团队无法维护的噩梦。这篇文章中的想法帮助我处理了与将我的应用程序移出原型相关的痛苦,我希望它们对你也一样。
你的数据科学项目真的如你所想的那样吗?
内部效度。相信我,这很重要。以下是需要记住的内容。
Photo by Artur Matosyan on Unsplash
为什么它很重要
在数据科学的许多方面,我们需要了解我们所做的更改是否会对我们关心的东西产生影响。这可能是改变搜索算法以创建更多可用的结果,实施机器学习模型以提供更准确的建议,从而增加销售额,或者添加新的数据捕捉以允许我们预测哪些网站访问者将成为客户。
所有这些变化都可以被认为是实验。我们希望看到变化(自变量)是否会导致预期或希望的结果(因变量)。
更重要的是,我们想知道自变量是否引起因变量的变化。因为如果没有,那么我们的数据科学技术就没有真正的价值,我们在浪费时间。
如果你是一个数据科学团队的成员或主管,请确保你了解如何知道你的团队所做的努力是否真的产生了结果。否则,你可能会浪费很多时间和精力。
什么是有效性?
有效性被描述为“一个推论的近似真理”。虽然这很有诗意,但有点难以理解。简而言之,有效性是对我们面前的数据是否支持一个结论为真的一种衡量。
重要的是要记住,有效性是指在被研究的样本或人群中观察到的“A”和观察到的“B”之间的因果机制。
有效性的核心是我们是否能相信 A 导致了 B,而不是 A 和 B 之间的差异是产品或随机机会或其他因素。
反事实是,如果没有 a,B 就会发生。排除这个反事实有助于我们进行因果推断。
一个元示例:我们想知道改变媒体报道的格式是否会增加阅读时间。这里,A 是改变格式,B 是阅读时间。这个例子中的反事实是,观察到的时间增加(B)会在有或没有格式改变(A)的情况下发生。
四种类型的有效性
有效性有几种类型,根据上下文的不同,它们都很重要。我们将重点关注最常见的内部和外部有效性,但是了解其他类型也是很好的。
统计结论有效性是指正确应用数学和统计方法,在自变量和因变量之间的观测值之间得出结论。例如,研究人员是否对样本而不是总体应用了适当的最小二乘回归公式?
结构效度是对观察到的数据实际上是试图测量的高阶概念或变量的表示的关注。这在社会科学中是很重要的(我相信这占了数据科学中许多与个人和群体行为有关的领域),因为许多重要的理论概念不能被直接观察或测量。
例如,如果我想比较人们的爱国主义,我可以进行某些测量,例如他们是否在国歌演奏时站立,是否向支持退伍军人的慈善机构捐款,是否在保险杠上插国旗,或者是否支持对被指控侵略自己国家的国家采取行动。然而,我需要确定的是,这些观察结果并不是在衡量他们对国旗保险杠贴纸的喜爱,或者他们的懒惰或在国歌奏响时难以站立,或者也许他们只是非常支持战争而不顾挑衅!
外部效度是在特定研究中观察和证明的因果关系在多大程度上可以被推断为存在于更大的样本、人群或不同的环境中。这在你正在进行一个实验或一个小组的试点的情况下是很重要的,如果你在一个不同的小组中扩大规模或进行同样的试点,你想知道你的结果是否成立。
内部有效性是对自变量的变化是否导致实验或研究人群中因变量的差异或变化的衡量。例如,我们能确定观察到的因变量的变化或差异是因为自变量的变化或差异而发生的吗?
内部有效性很重要,因为它与因果关系直接相关,尽管有些人相信,但它在机器学习时代仍然很重要!因为内部有效性非常重要,所以我们将在本文的剩余部分集中讨论它。
对内部有效性的深入探究
我们知道,当我们想要了解自变量(A —格式变化)和因变量(B —阅读时间)之间的因果关系时,内部有效性是至关重要的。
内部效度在许多研究和试点项目中非常重要,在这些研究和试点项目中,我们希望显示初始观察和测试后观察之间的因果关系,或者在推断差异是由治疗引起时显示治疗前和治疗后组之间的差异。
很明显,在内部有效性的情况下,结果的顺序很重要,因为因果关系要求 A 先于 B,A 随 B 变化,并且除了 A 的存在,B 没有其他解释。
但是为了对我们的内在有效性有信心,我们需要关注哪些风险呢?
内部有效性风险:
- 因果时间顺序是指 B 和 A 以相反的顺序或者可能同时发生。在我们的示例中,如果在进行格式更改之前,阅读中型文章所花费的时间开始增加,会怎么样?
- 选择偏差是指研究参与者或实验组或对照组因治疗或独立变量(A)之外的其他原因而存在差异,例如那些更有可能坚持饮食计划并因此表现出更好的减肥结果的参与者。选择对于随机选择(当不愉快的随机发生时)和准实验设计都是有风险的。风险在于,对照组和/或治疗组的固有属性会比实际治疗更影响结果或测试后测量。这与周末上午的媒体读者和工作日下午的读者之间的差异是同一个例子。
- 历史是在 A 经历的同时发生的其他事件对 B 造成的威胁。历史是一种威胁,即不属于治疗一部分的外部因素实际上对结果或治疗后测量负有责任。在我们的例子中,如果中型应用程序发生变化,使得读者不能快速滚动(不是说会有任何应用程序问题!).
- 成熟可能发生在治疗变量之外的其他因素影响结果的时候。在我们的例子中,如果你所有的媒体追随者都很快成为你的崇拜者,因此在浏览你的故事时速度慢得多,以确保他们不会错过你的精彩见解,会怎么样?(或者在我的情况下,也许我的打字错误增加导致他们多次重读句子。)
- 实验性的;死亡率或自然减员是一个概念,随着时间的推移,参与者可能会以多种方式离开研究,这可能会导致那些留在试验后观察的参与者以特定的方式发生变化,这说明了观察到的变化,而不是治疗变量。回到我们的例子,这可能是倾向于快速阅读的人已经转移到其他作家身上的例子,所以你的实验人群只剩下阅读速度较慢的人。
- 仪器威胁是指仪器可能无法以一致的方式进行测量,或者无法测量研究所需的概念。同样,什么是应用程序或网站改变他们的跟踪代码,导致故事阅读率的变化。
- 污染是一种风险,即治疗本身实际上会导致治疗组与对照组之间的差异。这方面的一个例子是山楂效应,参与者认为他们应该因为治疗而采取行动。在我们的例子中,也许你告诉使用新格式的读者,他们是阅读速度试点的一部分,所以他们的反应比平时慢得多,因为他们比平时更专注。这就是为什么许多医学研究是双盲的,因此参与者和负责治疗的人都不知道谁在实验组和对照组。
防范这些风险
治疗组和对照组的比较变化设计有助于我们防范这些风险,因为任何历史事件都适用于两组,研究人员仍然可以衡量治疗的影响。
此外,比较变化设计还包括组选择过程中的集中随机化。这种随机化确保了治疗组和对照组之间的同质性,并防止了两组中选择偏差的风险,允许推断治疗的效果。
最后,该设计要求进行前测和后测,以便测量治疗的因果关系。
然而,即使在比较变更设计中,你也必须适应潜在的污染,因为它是内部有效性的一个风险。
临别赠言
您的数据科学团队正在努力为组织增加价值,请确保您花一些时间来设置清晰的测试,以确保您的努力达到预期的效果。
我听到越来越多的项目和程序声称取得了令人难以置信的改进,但他们中的许多人缺乏辨别这些改进是否会发生(反事实)或它们是否实际上是由数据科学项目引起的能力。
雇用海外人才的艺术
Photo by Brooke Cagle on Unsplash
使用 K-Modes 的无监督学习来识别区域技术中心
- 设置
在美国招聘既昂贵又耗时。在某些情况下,小企业主花费大约 40%的时间在非创收任务上,比如招聘。另外,麻省理工学院估计每雇佣一名美国新员工,公司就要花费大约 1.4 倍的基本工资。对于初创公司来说,这些影响会更加明显,因为他们通常都缺乏时间和资金。
雇佣远程团队让初创公司能够接触到更大的人才库,并有机会以本地化的价格支付工资。那么,在时间和资源有限的情况下,初创公司如何为他们所需的专业技能找到远程办公室的最佳位置呢?是否有某些国家专门从事特定的技术?中国和印度仍然是最佳观察地吗?
2。数据
我开始通过使用 2019 Stack Overflow 开发者调查来回答这些问题,其中包括大约 40,000 名非美国受访者。随着他们的位置,每个回答者报告了他们积极使用的技术栈和框架,如 Java、Python、Angular 和 Django。
在投资离岸办公室之前,初创公司需要确保有足够的人才库满足他们公司的技术和经验要求。为了充分评估本地人才库的质量,我向数据集添加了维度。我为每个回答者的经验、教育和薪水设定了权重,以确定他们作为潜在候选人的素质——从而将他们从他们工作的环境中区分出来。
3。算法
我二进制化了包括被告技术堆栈的列。在处理结束时,我的数据看起来像这样:
Example of binarized data
对二进制数据进行聚类需要专门的算法。我使用了 K-Means 的一个表亲,称为 K-Modes,它允许我以这种当前形式对我的数据进行聚类。快速复习一下——K-Means 是一种分区算法,它根据现有的(和不可见的!)在 K 簇中连续数据的相似性。
- K -随机初始化质心,分配点,
- 基于度量(例如欧几里德距离)将点分配给最近的质心,
- 重新计算作为每个聚类的平均值计算的质心,
- 将点重新分配到最近的质心,
- 重复步骤 2 至 4,直到这些点不再被指定给不同的聚类。
结果是数据的分组,其中聚类内的对象的分离被最小化。
顾名思义,K-Means 使用平均值来计算质心。然而,K-Means 算法只能用于连续数据,而不能用于分类数据。例如,如果我们对应答者 1 和应答者 2 都取欧几里德距离(如上所示),那么当我们知道这是不正确的时候,K-Means 会将两个应答者分配到同一个聚类中。
那么,对于这种二值化的数据,我们如何计算不同开发者技能之间的距离呢?解决方案在于 K-Modes 算法,该算法使用相异度而不是每个数据点到质心的距离。在这种情况下,每个数据点和每个质心的相异度或“距离”可以定义为他们不同意的技术堆栈的数量。当数据点和质心在技术堆栈上一致时,这将使“距离”更低,当它们发散时,将使“距离”更高。
当计算新的质心时,K-Modes 算法也偏离 K-Means。K-Modes 计算的不是类中的平均值,而是类的模式。因此,在我的工作中,我感兴趣的是根据受访者使用的特定技术对他们进行聚类。
K-Modes 是一个相对较新的算法,来自于 1998 年的一篇论文,还不是 scikit-learn 包的一部分。你可以在 Github 上找到 K-Modes 和它的堂兄 K-Prototypes,以便安装和文档。
4。实施
现在我有了一个可以处理我的数据的算法,我需要决定聚类的数量。我在 K-Modes 包中使用了 Jaccard 相异度函数,该函数测量我的集群之间的相异度。
众所周知,Jaccard 距离是 1 减去交集的大小,再除以并集的大小,如下所示:
Jaccard Distance Formula
与 K-Means 剪影分数一样,我将“肘”方法与 Jaccard 相异分数一起应用,以找到最适合我的模型的聚类数。我在 40 个星团里发现了那个手肘。
5。应用程序
现在,我已经用 k=40 运行了我的模型,我希望能够理解我的集群的地理性质——直观地显示我的集群中开发人员的地域性。特别是,我想为早期创业公司开发一个工具,使用一线工具来定位离岸办公室。
为此,我构建了一个 Flask 应用程序,它接受每个受访者的堆栈、教育、经验和工资等参数,并返回满足这些约束的集群的交互式地图。
下面视频中的演示采用了 Hadoop、Spark 和 Postgres 的参数,其中受访者至少拥有学士学位和至少 4 年的工作经验,并且收入低于 7.5 万美元。有了这些参数,我的模型告诉我,我应该在爱沙尼亚、波兰和芬兰开始寻找,因为那里有有这种经历的人。
Search for Data Engineer by tech stack
然而,如果我需要用 Java、Kotlin 和 C#的特定技术栈建立一个专门用于 Android 应用程序开发的远程办公室,我的模型建议首先在中美洲和南美洲寻找。
Search for Android Developer by tech stack
6。结论
伟大的天才无处不在。公司在为他们需要的特定人才寻找离岸办公室时,可以更准确地锁定目标地区。这个模型和应用程序是帮助追求离岸战略的公司迈出建立远程团队的第一步的初始工具。
7。额外资源
物联网——迈向超互联世界
推特:@swatisubodh
连接智能
想象一个场景。当你去上班时,你的车会访问你的手机日历来确定你要去的目的地,并且已经知道最短最快的路线。万一你遇到交通拥挤,汽车会自动通知你的办公室你要迟到了!虽然这看起来像是未来电影中的一个片段,但这样的场景已经成形了。进入物联网的世界,俗称物联网。
迄今为止,互联网主要是将人与信息、人与人、人与企业联系起来。现在,物联网正在创建开放的全球网络,将人、数据和机器相互连接起来。根据最近的报告,截至 2017 年底,全球共有 84 亿个互联实体(“物”),比地球上的总人口还多!到 2020 年,不同的调查预测这一数字将达到惊人的 260-1000 亿台联网设备。过去几年,围绕大数据以及最近的人工智能(AI)的势头和讨论越来越多。这两者都是由错综复杂的互联设备网络驱动的,这些设备在后端收集和处理信息,并将其与社会、工业和科学实践联系起来,同时共同改变当前生产和消费数据、知识和创新的方式。简单地说,物联网是所有可以连接到互联网并相互“交谈”的设备的集合!
Source: Black box paradox
1999 年,英国技术先驱凯文·阿什顿(Kevin Ashton)创造了“物联网”一词,他将计算机从典型的条形码或预定脚本的执行中区分出来,成为可以收集比人工可能收集的更多信息并理解这些信息的原型。这个过程反过来让他们更聪明!
虚拟世界和现实世界之间的界面不亚于一个数字神经系统,其中的传感器和执行器收集各种类型的数据,并将其输入网络。
物联网结构
通常,物联网结构包括硬件、云、后端分析以及这三个组件之间的双向交互。它是建立在以下基础上的超连接计算环境:(1)宽带无线互联网连接;(2)嵌入日常物品的微型传感器;以及(3)由人工智能和机器学习支持的协作机器人(Cobots),解释传感器收集的大数据。
由称为传感器的简单终端设备连接而成的网格接收或传输少量数据。这些传感器与传播器通信,传播器是协议智能的站点。传播方决定如何管理数据,同时收集、整理、捆绑数据并将其传输到互联网,在互联网上,集成商对数据进行分析并采取行动。集成器功能可以托管在各种通用或广泛部署的设备或计算机上,如大数据服务器、智能手机甚至机顶盒。
传感器、传播器和积分器的网格可以自主地或在人工引导下工作。当理解的复杂性超过某个阈值或需要策略上下文信息时,数据可以被发送给人类智能进行分析。在必要的情境化之后,分析可以被发送回 cobots。
完美风暴!
考虑到这一点,今天宽带互联网变得更加广泛,4G 很快过渡到 5G 和 6G;连接的成本正在降低,越来越多的设备具有 wi-fi 功能和内置传感器;技术开发成本大幅下降,智能手机普及率达到历史最高水平。
Bala Pesala 博士,CSIR 首席科学家,AcSIR 副教授;CSIR 大学高级科学家兼 AcSIR 助理教授马丹·拉克什马南博士解释说,最近,不同领域的进步,如低价传感器和计算设备的可用性、连接和数据收集的便利性,以及商业/商业参与者和决策者越来越依赖数据分析和分析的世界,为物联网和基于物联网的应用创造了一个利基。简而言之,物联网革命再好不过了!
直到一切都与其他一切相连
据估计,我们与互联事物的互动更多地是在我们家外面,而不是在家里;从无处不在的自动柜员机(ATM)支付现金,到基于 GPS 的位置感应,帮助我们的日常导航。从极小的颗粒大小的机器人到智能城市的巨型设备,物联网已经渗透到日常生活中,并继续在我们周围扩展。突然间,智能城市的想法,或者更进一步,智能世界的想法,物联网创造了一个并行的虚拟生态系统,似乎不再遥远。
可能性实际上是无限的;物联网解决方案广泛部署在许多领域,包括汽车、交通、智能家居、能源、公用事业、安全、监控、公共安全、金融服务、零售、医疗保健、工业、仓储和配送。这不仅仅是提高现在的能力,也是决定如何改善日常生活。
Pesala 博士和 Lakshmanan 博士解释说,物联网正在物流、农业(“从种子到货架”)、能源和医疗保健领域产生巨大影响。与“无法测量的东西无法控制”的想法相呼应,他们进一步补充说,物联网系统可以持续测量事物,通过这些系统可以“当场”做出数据驱动的决策。
积聚势头
尽管我们目前处于设计和实施物联网能力的初级阶段,但一些轰动的故事已经成为头条新闻,并再次表明这项技术的巨大潜力。
对伦敦受欢迎的地铁网络的制动系统的审计和评估需要昂贵且笨重的设备来测试,并且还需要保持列车不流通,这是代价高昂的网络中断。一个由 iPAD 控制的小型物联网设备——减速器——被制成原型,并被证明不仅与传统的制动评估技术一样有效,而且预计在服务中断最少或没有中断的情况下每年节省 50 万美元。
佩萨拉博士和拉克什马南博士的实验室一方面一直在研究用于持续医疗监控和预警系统的物联网设备,另一方面是用于分散发电、分布式传感和监控应用的物联网太阳能树,他们指出了另外两个例子 Waymo 的自动驾驶电动汽车和 Flybird Innovations 的自动精确灌溉和施肥系统。前者自 2009 年以来一直在运营,无人驾驶汽车在城市道路上行驶了近 800 万公里。这是基于他们仅在 2017 年模拟驾驶的 43 亿公里。该项目旨在开发未来舒适、安全的无人驾驶汽车。另一方面,Flybird Innovations 正在开发物联网设备,这些设备可以通过编程来调节水和肥料、土壤湿度/温度/湿度。这将防止作物/植物灌溉不足和灌溉过量,从而提高作物产量和农民的生产力。
能源和医疗保健行业是大规模设计和部署基于物联网的解决方案的两个主要行业。让我们放大这些来更好地理解这一点。
瓦特网络:智能电网解决新时代的能源需求
预计到 2020 年,能源需求将翻一番,这将需要额外的电流选项和附加基础设施来补充现有的遗留基础设施。此外,许多国家和欧盟(EU)已经发布了减少碳排放和转向可再生能源的指令,至少“到 2020 年减少 20%”,同时提高能源效率。这凸显了建立利用可再生绿色能源的创新框架的必要性。正是在这里,物联网集成可以通过建立智能电网来改变这一等式,智能电网是一种通过数字控制、监控和电信功能增强的能源生成、传输和分配网络。它可以通过(I)增加弹性——通过增加来自传感器的数据;㈡使能——利用数据管理资源;以及(iii)优化——使利益相关者能够就电力使用和发电做出明智的决策。这为提高能力创造了一个信息价值循环(IVL)。
智能电网不仅提供实时、双向的电力流动,还支持自动化、双向的信息流动;这意味着在整个基础设施中分布计算智能。这可能包括在风力涡轮机叶片中嵌入传感器,根据不断变化的风力条件实时控制其俯仰、旋转和功能;涉及最小化与网络干扰相关的生产停工时间的变电站控制系统。这些数据被输入高级分析系统,该系统可以根据天气状况预测电网状态。
电力行业物联网的两个例子是 SCADA(监控和数据采集)和 AMI(高级计量基础设施)。前者包括由中央主单元控制的传感器和致动器,而后者是电表公用事业侧和用户侧智能设备的双向通信系统。许多公司都是这一领域的先行者。全球最大的空调、供暖、通风和制冷公司大金应用(Daikin Applied)正利用物联网专注于为其客户快速实施差异化增值服务,如实时单元性能、远程诊断、监控和控制、高级能源管理和第三方内容集成。
工作中的智能电网
智能电网的预测分析提供了将运营从被动转变为主动的机会。它使电力公司和电网系统运营商能够:
- 减少资本支出
- 通过了解消费模式来管理需求
- 通过了解高峰消费模式和周期来增加可再生能源的能力
- 通过实现远程故障诊断和预测性维护降低维护成本
- 通过将可再生能源用于传输、分配和高效消费来减少碳排放,从而遵守法规
- 通过绘制客户的消费模式来开发量身定制的服务和产品,从而提高客户参与度。
部署这些解决方案的公司越来越多。总部位于佛罗里达州的杜克能源公司声称,当出现问题时,其电力系统有能力自动检测、隔离和重新路由电力。这确保了通过自动检测和自动配置在一分钟内为尽可能多的人不间断供电。太平洋天然气和电力公司(PG&E)正在测试无人机,以提高其电力和天然气服务的安全性和可靠性,特别是在其 70,000 平方英里(1,81299 平方公里)的服务区域内难以到达的地区。它正在与美国宇航局合作测试甲烷传感器,以检测管道中的甲烷泄漏。
在印度,目前有 971 家物联网初创企业,其中大多数正在与印度政府合作开发智能城市(来源:2017 年物联网初创企业目录)。例如,印度初创企业 FluxGen Technologies 的旗舰项目“能源和水资源管理器”( EWM)生成状态报告和消耗账单,甚至使用电子邮件通知用户实际消耗量和实际需求,以确保资源的最佳利用。随着这一领域的机会激增,更多的物联网解决方案和许多这样的初创企业有望进一步增加能源生态系统的动力。
Source: Medium
医疗保健
可负担得起的传感器(嵌入式、可穿戴式、移动、环境等)的可用性。)与物联网的巨大通信和计算能力结合在一起,为参与式和精准医疗的创新提供了可能性。以患者为中心的数据可以方便地收集,而不仅仅是随机对照试验。这将有助于理解更广泛的因果关系、精确治疗结果、介入接触点等。物联网的开放和分布式特性还将使个人能够以盲法和无偏见的方式为试验和医学研究做出贡献,这对于进一步微调医疗保健中的物联网能力至关重要。
概括地说,医疗保健中的物联网目前正在探索用于(1)个人健身和健康跟踪;(2)疾病监测和诊断;(3)治疗监测和坚持;(4)为医学研究收集数据;和(5)保健管理。
2017 年 11 月,美国美国食品药品监督管理局(FDA)批准了一种“数字药物”,即一种内置传感器的药丸,它可以数字跟踪患者是否摄入了药物。当传感器与胃中的液体接触时会发出电信号,并将该信号中继到患者身体上的可穿戴贴片,然后将该信号进一步传输到患者的智能手机。医生和最多四个其他授权人员可以查看该输出。该药物被批准用于治疗某些精神健康疾病,如精神分裂症。
2017 年,FDA 还批准了 AliveCor Kardia band,这是一种安装在表带中的实时心电图(ECG/EKG)。它可以连续检测正常的窦性心律和房颤(最常见的心律失常),而不是在离散的时间点进行检测。这对患者更好的医疗保健和整体降低医疗保健成本大有帮助。基于传感器的生物流体中生物分子和生物溶液的测试正迅速成为流行的非侵入性和优选的诊断工具。它不仅能够全天候无障碍地监测生物参数,还能让患者或其护理人员与医疗保健提供者实时共享结果。这进一步转化为更好的疾病管理或治疗,在某些情况下可以挽救生命。从通过嵌入生物传感器的隐形眼镜测试眼泪到尿液评估,研究人员正在绘制整个光谱。其中一种产品是 UroSense,这是 Future Path 公司的一种医疗设备,可以自动测量导管插入患者的尿量和核心体温(CBT)。这些生命体征对于及早发现和治疗心力衰竭、肾损伤、传染病、前列腺肿瘤、糖尿病、败血症和烧伤非常重要。测量 CBT 也可以表明感染或体温过低。在医院,来自 UroSense 的数据可以直接无线发送到监视器或护理站。
总部位于孟加拉国的初创企业 TerraBlue XT 开发了两款创新产品 TJay 和 Xaant。而 TJay 是用于预测和管理癫痫的解决方案;Xaant 是一种治疗性的可穿戴设备,可以追踪思维路径,生成实时数据。TJay 是一种带有传感器附件和基于 ML/ AI 的软件解决方案的手套,可在癫痫发作前提供预测。其目的是使患者能够过上更安全和高质量的生活,也使医生能够提供及时的护理和干预。该公司将自己的第二款产品 Xaant(在梵语中读作“Shaant ”,意思是平静)描述为“一种可以培养你生活平静的可穿戴设备”,因为它可以识别什么让你焦虑,什么引发你的愤怒或什么导致你的压力。这些信息反过来可以用来训练自己在面对逆境时变得更加坚强。Xaant 作为智能表带或智能珠宝佩戴,可跟踪个人的精神健康状况,并监控压力原因、睡眠质量、心脏健康以及镇静技术在保持头脑冷静方面的效果。
在难以到达的地区和农村地区提供远程医疗和医疗保健是物联网用于个人和社区医疗保健的另一个方面。
物联网无处不在!设备制造商正在将设备连接到物联网,使用增材制造(3D 打印),生产可穿戴电子产品(“智能”服装,贴在皮肤上的传感器),使远程和持续监测患者的健康成为可能。随着世界人口老龄化,慢性病及其治疗费用的增加,以及长期护理医务人员的短缺,医疗护理可能会部分地从医院转移到家庭护理。物联网与这种转变产生了很好的共鸣,并将成为未来医疗保健的前沿。
数据爆炸!
来自设备的数据呈指数级增长,在转化为其他人可以使用的信息之前,这本身没有任何意义。除非转化为有价值的可操作见解,否则转化为知识的数据也将用途有限。这些在特定领域具有巨大价值的见解需要进一步适应多领域、跨职能的智慧,以改变游戏策略和保持竞争优势。大数据是近年来互联事物数量空前激增的产物。核心是数据科学,通过算法设计、人工智能、机器学习、统计学、建模等来分析数据。,以使它在现实世界中一致地工作,跨不同的域,跨不同的基础设施,并为多个用户服务。
介意差距!
新技术在变得普遍之前,通常会面临现实世界的运营挑战。物联网也不例外。为了加快物联网的采用,需要立即解决的关键问题如下:
a)安全性:去年,FDA 史无前例地召回了 4,50000 个易受网络威胁的起搏器。强生公司去年就其胰岛素泵的一个安全漏洞警告了顾客。这意味着黑客可能会给用户注射致命剂量的药物!植入设备也有被黑客攻击和被别人控制的风险!
在一个高度互联的世界里,数据的安全性仍然是人们最关心的问题。这种情绪反映在全球范围内物联网安全年度支出的不断攀升上。高度集成系统的高度自动化带来了系统性风险的脆弱性,例如,如果其中一个部分发生故障,例如黑客或互联网病毒可以完全入侵集成系统,整个网络就会崩溃。
为了解决这些不对称问题,需要考虑在物联网网络的一部分因暴露于恶意软件/病毒或其他可在开放网络中快速传播的非数字威胁而崩溃时的安全退出或遏制策略。已经提出了各种级别的安全结构,许多正在开发中。它们被授权在不损害创新生态系统及其组成部分的长期安全性和可持续性的情况下构建复杂的数字网络。以下是在未来应用中带来对称性的三个措施:(a)考虑数字网络的内置安全出口;(b)认识到加速/减速的必要性;以及技术政策的全球治理创新。
一些公司已经在这一领域处于领先地位。英特尔提供了来自英特尔、Wind River 和 McAfee 的技术组合,将安全层整合到硬件、嵌入式操作系统和安全软件中,以确保智能电网中的端到端安全性。这些功能无法被流氓软件更改,并在安全的分区中运行应用程序,同时保护重要的平台数据并防止恶意软件启动。
b)互操作性:随着多家公司在不同领域提供各种支持物联网的服务和产品,信息碎片化导致不同格式数据的访问和使用受限的风险可能会成为采用和最大化物联网潜力的瓶颈。因此,平台和网络无缝集成的需求变得至关重要。
为了在平台之间实现更好的通信,这意味着将广泛的协议结合在一起,包括 2G、3G、LTE、LTN、wan,以及专业电信服务提供商、硬件和软件公司的参与。如果未连接的基础设施中存在的数据得到最佳实现,物联网将提供巨大的机会。开放的互操作性标准和通用架构对于将传统设备连接到数据中心和云基础设施至关重要,这将实现端到端分析,进而实现其优势。这绝不是一件容易的事;然而,已经朝着这个方向迈出了初步的步伐。
美国电话电报公司、思科、通用电气、IBM 和英特尔已经成立了工业互联网联盟(IIC),这是一个开放成员的非营利组织,将率先在各种工业环境中建立互操作性。人们希望这将转化为一个更加互联的世界。
c)隐私:当数据被收集和上传到云服务器时,无论是私有的还是公共的,数据隐私都是一个大问题。HIPAA(健康保险便携性和责任法案)为保护以电子方式创建、接收、维护或传输的患者数据制定了标准。由于现在有传感器自动收集和存储医疗数据,个人数据的安全性变得更加重要。这使得许多医院无法采用网络容量来存储患者数据和其他医疗信息。
2017 年底,北美、西欧和大中华区占全球物联网的 67%。这导致了第二个更具社会性而非技术性的担忧——极端的连通性创造了新的社会和政治权力结构。这可能导致少数人的独裁或支配性治理,这些人直接或通过其有联系的代理人间接完全控制着网络。在所谓的工业 4.0 Plus 或工业 5.0 中,已经提出了有效利用数字能力和治理的新模式。其伦理、法律和社会影响(ELSI)也在学术辩论中。
Pesala 博士和 Lakshmanan 博士强调了与物联网在大规模实施中的有效使用有关的其他几个问题,即标准化和数据互操作性,以及部署物联网系统的相对较高的成本。物联网边缘设备的认证和授权缺乏标准,此外,平台配置的安全标准也不成熟。许多物联网系统的设计很差,并且使用各种协议和技术实施,有时会产生复杂和冲突的配置。许多物联网运营商的额外网络安全措施不足仍然是一个主要问题。
已经在努力实现平台之间的无缝数据交换和分析。随着越来越多的行业采用物联网系统,这些系统的成本也在下降。几年后,随着更多利益相关方的参与,这一数字有望进一步下降。
到目前为止,我们所目睹的只是开始,本质上只是冰山一角。正如我们今天所知,随着物联网缓慢而稳定地创建几乎所有行业的后端,无论是当前行业还是新兴行业,不久的将来都会有巨大的前景。
(这篇文章作为封面故事发表在 2018 年 5 月至 6 月发行的《发明情报》杂志上,这是印度政府国家研究发展公司的出版物)。
为初创企业、政府和行业实习
I’m about one engine tall!
我在不同团体、机构和公司工作时的轶事。
在大学本科期间,我有幸获得了几份实习和合同职位。大二的夏天,我为一家名为 Graba Engineering 的小型工程咨询初创公司工作;接下来是在卡纳维拉尔角为美国宇航局实习;我最后的实习是在康宁公司,一家玻璃和陶瓷公司。
积累了来自初创企业、政府和企业的经验后,我想我可以分享一些每个工作场所及其文化的趣闻。寻找实习机会并对实习充满好奇的工科学生会发现这篇文章很有意义。
初创企业:格拉巴工程有限责任公司
当我加入 Graba 的时候,他们正在研究一项相当奇怪的技术。一位客户带着保存断肢的想法来到这家初创公司。这项技术被设计得很小,大约是视频游戏控制台的大小,并打算由应急响应车辆和军事战地医务人员携带。
使用新颖的、偶尔不可靠的技术是初创企业的共同主题。这并不是说人们不会在工业和政府中看到新技术。早期的初创企业没什么可损失的,可以说他们会在产品上冒更大的风险。此外,考虑到初创企业受到资源的极大限制,新手实习生直接使用新技术的可能性更大。
在波音公司收购奥罗拉飞行科学公司(Aurora Flight Sciences)之前,我的一位电气工程同事曾在该公司工作。AFS 是一家专注于航空研究的初创公司,最著名的是他们在太阳能和电动垂直起降飞行器方面的工作。我的朋友直接在 AFS 的奥德修斯的动力系统上工作,这是一架完全由太阳能驱动的飞机。同样,我直接研究了这台保肢机的电子设备。
Odysseus concept model, a terrific opportunity for an intern! (Credit: Aurora Flight Sciences)
能够为一个新颖项目的成功(或失败)做出贡献,本身就有精神上的回报。对于务实的实习生来说,在初创企业工作将会获得丰富的经验。小型初创企业必须同时兼顾管理、财务和多学科工程任务。在 Graba,大量的任务要求我涉猎电路、PCB 设计、电力电子、微控制器编程、传感器通信和系统集成。在工作结束时,由于 CEO 的日程安排很紧,我甚至向客户演示了这项技术。
虽然工作量和期望可能会很高,但初创企业的环境却出人意料地宽松。我可以自己安排时间,只要项目和需求在截止日期前交付。不需要向我的经理汇报或与他交谈来获得批准,这是业内的一个重要协议。个人责任的氛围允许很大程度的独立性。
政府:美国航天局
美国国家航空航天局对作为一名工程师在政府部门工作的感受进行了有限的介绍。大部分政府工程都是国防工程。尽管如此,在美国国家航空航天局实习带来了一系列独特的故事。
与在初创公司工作类似,你会有一种 NASA 人手不足的感觉。总是有工作要做,但没有足够的人或时间去做。考虑到 NASA 任务的规模,这是意料之中的。毕竟,我们正在努力到达火星。
对于实习生来说,无限量的工作确实显现了出来。作为自动化测试团队的成员,我和我的团队每周都会为软件抽取数百个测试。然而,我们的经理一直鼓励我们完成更多。不幸的是,本科生实习生受到他们贡献能力的限制。火箭科学需要相当熟练的能力。因此,我们作为软件实习生所做的许多工作对于中级程序员来说并不太具有挑战性。
不管是哪种工作,为政府工作都有一种强烈的感觉。特别是在 NASA,你的工作会产生影响。看到自己的贡献飞向太空的敬畏之情让人充满力量。很少有人能说他们为人类探索太空做出了贡献。在美国宇航局,许多员工都有一种与生俱来的情感:他们的工作服务于一个更大的目标。我自己作为一个太空极客,也热情地加入了这种心态。
除了观察火箭发射和科学进步,在美国国家航空航天局工作还有许多精彩的故事。由于美国国家航空航天局与联邦政府的密切联系,我见到了副总统彭斯、参议员卢比奥、巴兹·奥德林和许多其他宇航员。
除了这些故事、工作和经历,为政府工作唯一显著的缺点就是工资。任何政府机构——中央情报局、联邦调查局、环境保护局——都不太可能有能力与私营部门的薪水竞争。还有一线希望。缺乏金钱激励肯定了员工对他们所在行业的热情和承诺。简单来说,工程师在 NASA 工作不是为了钱,而是为了旅程。
行业:康宁公司。
我在康宁的第一项任务就是为我参与的项目挑选要购买的电子零件。从吃拉面和借用亚马逊 Prime 账户的简朴大学生活中,我开始寻找最便宜的工具来完成这项工作。更让我懊恼的是,我后来被资深员工取笑,因为我买了一个便宜而复杂的工具,而不是挥霍在一个更昂贵且可能对用户友好的设备上。
康宁强调支持公司相关研究。实际上,员工每月都有津贴,可以用来购买与研究相关的产品。一天,我隔壁隔间的实习生拿着各种各样的树莓派进来。接下来的一周,他带着一台等离子电视走进了光学实验室。作为康宁公司的工程师,资源是无限的。薪水也反映了这一点。
然而,这种挥金如土的态度在管理层和整个公司产生了相同和相反的反应。金钱激励在工业中非常明显。虽然早期初创企业确实有有利可图的潜在因素,但康宁等公司非常清楚地向股东表明了他们的优先考虑。
Last Day of Work!
关于实习工作,我从来没有在办公室感到难以置信的压力或挑战。我偶尔不得不搜索任务,并且给出的任务完成得相当快。这很奇怪,因为并不缺少工作。全职员工一直很忙。其他工程学科的几个实习生有要求很高的项目。尽管如此,许多软件实习生确实显得缺乏责任感。
也许这是这家公司独有的,但康宁没有其他两次经历那样的精神或雄心。对我所在部门的许多人来说,这份工作很方便,也有点意思。此外,各部门感觉严重分裂。员工们乐于保持自己的圈子,很少与其他部门和分支机构交往。
也就是说,康宁有一种社区和家庭意识。康宁家族,一个被重点强调的格言,在众多的公司郊游、内部团队和拓展计划中显而易见。主管在截止日期方面很严厉,但是理解和关心个人问题。康宁公司为自己寻找出路。
不管学生决定涉足哪个领域,实习都是非常受鼓励的。实习将会给你学生时代最实际、最愉快的经历。前面提到的三种经历确实触及了各种工作类型中的一些普遍主题,但声称它们代表了绝对的主题是错误的。例如,许多现代科技公司正在采用年轻初创企业的主题。任何公司都有自己独特的怪癖、好处和缺点。获得实习机会将有助于学生对去哪里工作做出自己的判断。
我最近在 Medium 上超过了 100 名粉丝。感谢所有喜欢和支持我内容的人!
具有深度生成模型的插值
生成模型如何学习创造新事物
在这篇文章中,我将写关于生成模型。它将涵盖生成模型和判别模型之间的二分法,以及生成模型如何通过能够执行插值来真正了解感兴趣对象的本质。
0.生成模型(G)与判别模型(D)
老实说,在生成对抗网络(GANs)起飞后,我才开始思考统计和机器学习模型的本质。在 GAN 的原始版本中,让我们称之为香草 GAN,你有一个生成网络(G ),它从高斯噪声中生成合成数据,还有一个鉴别网络(D ),它试图区分真假。显然,香草甘中的 G 和 D 分别是生成模型和判别模型。事实上,GAN 可能是第一个协调生成和判别模型的 ML 算法,它通过创新的对抗训练来学习两个模型的参数。
Image source: https://www.slideshare.net/ckmarkohchang/generative-adversarial-networks
我自己的经验就说这么多,什么是生成式和判别式模型?直觉上,生成模型试图抽象出一些对象集合的一些可概括的模式,而鉴别模型试图发现集合之间的差异。具体来说,在分类问题的背景下,例如,生成模型将学习每个类的特征,而判别模型将找到最好地分离类的决策边界。更正式地说,让我们将实例表示为由一些标量值 y、标记的特征向量*【x】生成模型学习联合概率分布*p(x,y)、*而判别模型学习条件*概率分布*(y |*x
还有一些有趣的生成器-鉴别器对可以考虑:
- 二元分类:朴素贝叶斯与逻辑回归
- 序列建模:隐马尔可夫模型与条件随机场
值得一提的是,大多数传统的最大似然分类器都是判别模型,包括逻辑回归、SVM、决策树、随机森林、LDA。判别模型在需要学习的参数方面很少,并且已经被证明在许多分类任务中比它们的生成模型具有更好的性能。
但是我想说的是,学习区分一个类和另一个类并不是真正的学习,因为当处于另一个环境中时,它通常不起作用。例如,当一个看不见的类(狗)被添加到测试集中时,被训练来以异常的准确度区分猫和鸟的鉴别分类器可能会悲惨地失败,因为鉴别分类器可能简单地知道有四条腿的东西是猫,否则是鸟。
为了进一步说明生成性和判别性模型真正学到了什么,让我们考虑一下最简单的分类模型,朴素贝叶斯和逻辑回归。下图显示了朴素贝叶斯和逻辑回归分类器在二元分类问题上获得的“知识”。
朴素贝叶斯分类器学习两个类的均值和方差向量,而逻辑回归学习线性边界的斜率和截距,以最佳方式分隔两个类。利用从朴素贝叶斯分类器中学习的均值和方差,我们可以通过从多元高斯分布中采样来为每个类生成合成样本。这类似于使用 GANs 生成合成样本,但显然朴素贝叶斯无法生成任何高质量的高维图像,因为它太幼稚,无法独立地对特征进行建模。
1.生成模型
我简单地提到了朴素贝叶斯算法,它可以说是生成模型的最简单形式。现代生成模型通常涉及深度神经网络架构,因此称为深度生成模型。有三种类型的深度生成模型:
- 可变自动编码器(VAE)
- 开始
- 基于流程的生成模型(一个关于这类模型的优秀博客
1.1.VAE
VAE 由金玛&韦林,2014 推出,作为自动编码器(AE)的概率扩展。与 vanilla AE 相比,它有以下三个附加功能:
- 概率编码器 qϕ( z | x 和解码器 pθ( x | z
- 潜在空间(AE 的瓶颈层)的先验概率分布:pθ( z
- 由 Kullback-Leibler 散度定义的潜在损失:d(qϕ(z|x)‖pθ(z|x))来量化这两个概率分布之间的距离
VAE illustration from https://lilianweng.github.io/lil-log/2018/08/12/from-autoencoder-to-beta-vae.html
1.2.甘斯
GAN 是由 Goodfellow et al .,2014 介绍的,由一对生成器和鉴别器网络组成,彼此进行一场极小极大博弈。GAN 的许多变体已经被开发出来,例如双向 GAN(甘比)、CycleGAN、InfoGAN、Wasserstein GAN 和这个列表还在继续增长。
特别吸引人,因为它明确地学习一个编码器网络,E()x)将输入映射回潜在空间:
Figure source: Donahue et al, 2016 Adversarial Feature Learning
2.生成模型插值
有了一些深层生成模型的知识,我们将检查它们的能力。生成模型能够学习来自不同类别的样本的低维概率分布。这种概率分布可用于监督学习和生成合成样本。虽然这些功能非常有用,但让我印象更深的是生成模型能够沿着任意轴对真实样本执行插值,以生成不存在的操纵样本。例如,深度生成模型可以沿着年龄、性别、头发颜色等轴操纵人脸图像。在我看来,这表明深度生成模型能够获得想象的能力,因为想象是产生心理图像的过程。接下来让我们深入研究如何执行插值。
插值通过在生成模型学习的潜在空间( z )中执行简单的线性代数来工作。首先,我们想在潜在空间中找到一个轴来进行插值,它可以是类似生物性别的东西。生物性别的插值向量可以简单地计算为潜在空间中从雄性质心指向雌性质心的向量。
更一般地,我们首先需要在潜在空间中找到两类质心( a , b ):
****
从类别 b 指向类别 a 的潜在空间中的插值向量为:
给定任何类别*x _*c的任何看不见的样本,我们可以通过以下方式用插值向量操纵看不见的样本:1)将样本编码到潜在空间中;2)在潜在空间中执行线性插值;以及 3)将内插样本解码回原始空间:
****
上式中的 α 是决定插值大小和方向的标量。接下来,我将围绕 α 沿着不同的插值向量滑动。以下 Python 函数可使经过训练的创成式模型执行此类插值:
3.基于 MNIST 数据的生成模型实验
我在 MNIST 手写数字数据集上训练了一些生成模型,包括朴素贝叶斯、VAE 和甘比,以实验插值。下图显示了瓶颈层只有两个神经元的 VAE 的潜在空间。虽然不同的数字有不同的模式,但重建质量很差。也许将 784 维空间压缩到 2 维空间是一个挑战。我发现瓶颈层有 20 个神经元的 VAE 可以重建质量不错的 MNIST 数据。
Latent space learned by a VAE with 2 neurons at the bottleneck layer
还值得指出的是,生成模型的训练是不受监督的。因此,学习的潜在空间不知道类别标签。插值向量是在模型完成学习后计算的。
为了进行插值,我首先可视化了 10 个数字的所有 45 个可能对之间的插值向量:
Visualization of the interpolation vectors of MNIST digits in the latent space of a VAE with 20 neurons at the bottleneck layer
在上图中,每行对应一个从一个数字指向另一个数字的插值向量,而每列对应一个 alpha 值。从左到右观察潜在空间产生的数字,看一个数字如何逐渐变成另一个数字,这很有趣。由此,我们还可以找到位于 10 位数字的两个质心之间的模糊数字。
接下来,我做了另一个有趣的插值实验:我问我们是否可以通过沿着 6->0 向量移动数字 7 来将它变成数字 6 或 0。以下是生成图像的结果。它在右边显示了一些看起来相对 0 的图像,而左边的看起来一点也不像 6。
也可以使用在 MNIST 上训练的逻辑回归分类器来量化这些图像,以预测标记的概率。分类器非常符合我们目测图像的感觉。
Predicted probability for the images of interpolated digits from a Logit classifier
用 MNIST 数据集进行的看似无聊的概念验证实验展示了深度生成模型的想象能力。我可以想象插值的许多实际应用。
如果你想了解更多的技术细节,这篇文章基于我的 GitHub repo:
MNIST -王 10/生成模型实验深度生成模型教程
github.com](https://github.com/wangz10/Generative-Models)
这篇文章的笔记本版本在 Ma’ayan 实验室会议上发表:
看看这个 Jupyter 笔记本!
nbviewer.jupyter.org](https://nbviewer.jupyter.org/github/wangz10/Generative-Models/blob/master/Main.ipynb)
参考
可解释性和随机森林
我们如何以及为什么可以从随机森林分类器中获得特征重要性?
机器学习的出现是因为人类不能总是很好地解释我们自己,尤其是对机器。在很长一段时间里,机器只能执行精确的逐步指令,而简单的人工任务对我们来说太自然了,以至于我们无法明确地将它们作为算法写下来。以识别某物是猫为例——我无法向你或计算机解释我是如何确切地知道某物是猫的。事实上,从来没有人真正向我解释过:我只是遇到了一群猫,最终,作为一个优秀的小神经网络,我明白了要点。
You’ve got a lot to learn, kid.
我知道猫通常有两只耳朵,四条腿,圆圆的脸型,还有那双独特的猫眼,但这只是解开了第一层解释。在此基础上,我必须用算法解释上一句中每个形容词和名词的意思:二,耳朵,圆,等等。,以及详述诸如猫眼到底是什么样子之类的细节。理论上,我也许可以继续一项一项地解开这个问题——只是这可能会花费我大量的时间。
我们人类相当聪明地决定,对学习过程进行数学建模可能比用算法分解每个决策过程更容易,这就是我们如何开始机器学习的。然而,我们使用的学习模型并不总是符合任何一种“自然”的学习方法,建模学习并不能解决我们与计算机的基本交流问题。机器学习没有摆脱解释数据中关系的困难,这导致在建立和分析学习模型时可解释性和准确性之间的冲突。
可解释性和准确性之间的冲突
当谈到机器学习模型的使用时,数据科学几乎只有两个目标:
- 应用程序,通过它我们使用训练好的模型来执行任务,理想情况下尽可能准确有效。
- 解释,通过学习特征和响应变量之间的关系,我们使用训练好的模型来获得对数据的洞察力。
正如我们刚刚讨论的,我们人类几乎不知道我们实际上是如何识别事物的,但是我们真的很擅长。换句话说,我们大脑的内部逻辑是准确的,非常适合应用,但它不是很好解释。那么,通常最准确的机器学习方法是最不可解释的,这就不应该令人惊讶了。
RoboCat: First Contact
所谓的黑盒模型,如神经网络,给我们很少关于他们的决策过程的信息;他们学习的函数的代数复杂性倾向于失去关于原始特征变量集的任何意义。另一方面,线性回归和决策树等有助于解释的模型往往在准确性方面有所欠缺,因为它们往往无法捕捉数据集中任何细微或复杂的关系。我们可以将这种关系概括如下:
对于足够复杂的数据,在决策算法的可解释性和应用的准确性之间存在自然的权衡。
就像计算机没有理解猫的腿、眼睛和耳朵的天然亲和力一样,人类也没有对高阶数字关系的内在理解。我们无法有意义地解释神经网络的复杂决策边界,我们无法向计算机解释猫是什么,这是一个硬币的两面。在两个方向的转换中,有些东西会丢失。
找到平衡
我们史前穴居人的大脑似乎非常喜欢解释线性关系/决策边界。线性回归是一个高度可解释的算法,这是毫无疑问的:如果 x 增加 1 ,y 增加 m,,我们就都可以回家了*。然而,线是简单的和高度偏向的,因此它们通常不适合伟大的学习算法。当然,我们可以调整我们对线性的定义,并扩展我们的基础,以包括多项式、指数和其他任何术语,但在某些时候债务必须偿还,我们失去了参数的自然意义。*
Barney and Fred, excited about Linear Regression.
另一个简单易懂但本质上很弱的分类器是决策树:通过贪婪地将特征空间分割成矩形,我们最终得到了一个描述决策过程背后逻辑的漂亮图表——以及一个除了最基本的关系之外几乎毫无用处的模型。但是,回想一下,树模型非常适合集成方法,随机森林是一种特别强大的方法,可以将大量单独较弱的树聚合到一个强预测模型中。
随机森林和特征重要性
得知随机森林能够无视这种可解释性-准确性的权衡,或者至少将它推到极限,这似乎令人惊讶。毕竟,随机森林的决策过程存在固有的随机因素,而且有这么多树,任何固有的意义都可能在森林中迷失。然而,就像树一起工作来减少预测误差一样,它们一起工作来准确地表示特征的重要性。为了理解它们是如何做到这一点的,首先有必要了解一种解释单个树中的特性重要性的自然方法。
单一树中的特征重要性
回想一下,单个树旨在以局部最优的方式减少误差,因为它分割特征空间。分类树使用杂质的度量来对当前的类别分离进行评分,而回归树使用残差平方误差。我们将使用分类树的概念来使我们的可视化效果更好,但是在交换掉误差函数之后,回归情况是一样的…
减少杂质(或熵)是迭代分裂区域以减少决策树的分类错误的最快和最稳定的方法。衡量某个特性在决策过程中的影响的一种自然方法是查看该特性从系统中移除的熵值,即仅根据该特性的值所做决策获得的信息量或准确度。下面的可视化演示了我们分割特征空间和构建决策树的过程。我们从一个初始熵值( D )开始,我们计算每个子区域中的减少,然后对整个树中每个特征变量的熵的归因变化求和。
We start with D=1.31 and split feature space until we reach zero entropy. 1.011 of the reduction is due to decisions made on y, while x is only responsible for 0.299 of the reduction.
我以前说过,现在再说一遍:决策树是弱分类器。训练数据中的微小变化可能意味着我们最终会得到一个完全不同的树,从而对我们的特征重要性有不同的估计。在我们的观想中,考虑原始数据的这一微小变化:
Now the reduction in entropy due to x is 1.011 while the reduction due to y is 0.299. The variable importances have switched!
减少与许多树的差异
如果这种计算特征重要性的方法如此不稳定,对我们来说就没有多大用处了。问题是测量的方差太高,这就是随机森林的作用所在:回想一下,随机森林最终的工作方式是,首先通过从本质上消除个体树对局部最优策略的偏好并随机分割要素,然后通过聚合树来减少模型的整体方差。
这种方差的减少稳定了模型,减少了其对训练数据选择的偏差,并导致更少的变量和更准确的预测。如果像我们预测的那样,通过对每个特征变量的熵或准确度的变化取平均值,我们对随机森林中的树木的特征重要性的度量进行汇总,我们会获得完全相同的效果。
直观地说,对随机特征的分割使模型中的每个特征都有机会在树的所有可能点上显示其决策能力,而聚合减少了最终结果的可变性。本质上,与随机森林提高最终预测的准确性一样,它也提高了这种特征重要性度量的准确性。如果你不相信我,这里有一点证据:
A, B, C are all i.i.d
当用连续变量对抗分类变量时,这种方法有一些明确的问题;连续变量有更多的“空间”来分割,所以可以比分类变量多一点,但不一定更重要。这种方法也没有真正违反可解释性-准确性权衡的思想,因为它只真正告诉我们变量如何相互叠加,也就是说,它没有告诉我们如果我们增加或减少特征值(就像以前的线性回归一样),我们的决策会发生什么。但是,嘿,这很有用我从没说过随机森林是完美的。
不管怎样,现在你知道 scikit-learn RandomForestClassifier
上的feature_importances_
属性的力量了…但是你仍然不能解释猫对计算机来说是什么。哦好吧。
Later!
另外,这个博客很乱,也很粗糙,但是我想发表一些东西。我会花一天左右的时间来整理它。请给我发电子邮件,询问我在 thomasggrigg@gmail.com 需要澄清或反馈的任何问题
正在撰写的博文:内核技巧–偏差-方差权衡–深入探究随机森林的工作原理(我在这里稍微提到了一点)。
可解释性:打开黑匣子——第一部分
我们怎样才能给 ML 中使用的黑盒带来可解释性?
可解释性是人类能够理解决策原因的程度 —米勒、蒂姆【1】
付费墙是否困扰着你? 点击这里 绕过去。
可解释的人工智能(XAI)是人工智能的一个子领域,在最近的过去已经取得了进展。作为一名日复一日与客户打交道的机器学习实践者,我明白为什么。我已经做了 5 年多的分析从业者,我发誓,机器学习项目最困难的部分不是创建一个击败所有基准的完美模型。这是你说服客户为什么和如何工作的部分。
面对未知事物,人类总是一分为二。我们中的一些人用信仰来对待它并崇拜它,就像我们崇拜火、天空等的祖先一样。我们中的一些人变得不信任。同样,在机器学习中,有人对模型的严格测试(即模型的性能)感到满意,有人想知道模型为什么以及如何做它正在做的事情。这里没有对错之分。
图灵奖获得者、脸书首席人工智能科学家 Yann LeCun 和谷歌首席决策智能工程师 Cassie Kozyrkov 都是这种思想的强烈支持者,即你可以通过观察模型的行动(即在监督学习框架中的预测)来推断模型的推理。另一方面,微软研究院的 Rich Caruana 和其他几个人坚持认为,模型天生具有可解释性,而不仅仅是通过模型的性能得出的。
我们可以花数年时间来辩论这个话题,但对于人工智能的广泛采用,可解释的人工智能是必不可少的,并且越来越多地来自行业的需求。因此,在这里我试图解释和演示一些可解释性技术,这些技术对我向客户解释模型以及研究模型并使其更加可靠都很有用。
什么是可解释性?
可解释性是人类能够理解决策原因的程度。在人工智能领域,它意味着一个人能够理解算法及其预测的方式和原因的程度。有两种主要的方式来看待这个问题——和 事后解释 。
透明度
透明度解决了模型可以被理解的程度。这是我们使用的模型所固有的。
这种透明性的一个关键方面是可模拟性。可模拟性表示模型被人类严格模拟或思考的能力[3]。模型的复杂性在定义这一特征时起了很大的作用。虽然简单的线性模型或单层感知器很容易考虑,但考虑深度为 5 的决策树变得越来越困难。考虑一个有很多特性的模型也变得更加困难。因此,稀疏线性模型(正则化线性模型)比密集线性模型更容易解释。
可分解性是透明的另一个主要原则。它代表解释模型的每个部分(输入、参数和计算)的能力[3]。它需要解释从输入(没有复杂的特性)到输出的一切,而不需要另一个工具。
透明的第三个原则是算法透明。这涉及算法固有的简单性。它涉及人类完全理解算法将输入转换为输出的过程的能力。
事后口译
当模型本身不透明时,事后解释是有用的。因此,在不清楚模型如何工作的情况下,我们求助于用多种方式解释模型及其预测。Arrieta、Alejandro Barredo 等人将它们汇编并分类为 6 个主要类别。我们将在这里讨论其中的一些。
- 可视化解释——这些方法试图将模型行为可视化,并试图解释它们。属于这一类别的大多数技术使用降维等技术,以人类可理解的格式可视化模型。
- 特性相关性解释——这些方法试图通过计算特性相关性或重要性来揭示模型的内部工作原理。这些被认为是解释模型的间接方式。
- 通过简化来解释——这套方法试图在原始模型的基础上训练全新的系统来提供解释。
由于这是一个广泛的话题,涵盖所有内容将是一个庞大的博客帖子,我把它分成多个部分。我们将在当前部分讨论可解释的模型和其中的“陷阱”,并将事后分析留给下一部分。
可解释的模型
奥卡姆剃刀理论认为简单的解决方案比复杂的更有可能是正确的。在数据科学中,奥卡姆剃刀通常与过度拟合联系在一起。但是我相信它同样适用于可解释性。如果您可以通过透明模型获得想要的性能,那么就不要再寻找完美的算法了。
Arrieta、Alejandro Barredo 等人总结了 ML 模型,并在一个漂亮的表格中对它们进行了分类。
线性/逻辑回归
由于 Logistic 回归在某种程度上也是线性回归,所以我们只重点研究线性回归。我们拿一个小数据集( auto-mpg )来考察一下模型。数据涉及城市循环油耗,单位为每加仑英里数,以及汽车的不同属性,如:
- 圆柱体:多值离散
- 位移:连续
- 马力:连续
- 重量:连续
- 加速度:连续
- 年款:多值离散型
- 起源:多值离散
- 汽车名称:字符串(对于每个实例是唯一的)
加载数据后,第一步是运行 pandas_profiling 。
*import pandas as pd
import numpy as np
import pandas_profiling
import pathlib
import cufflinks as cf
#We set the all charts as public cf.set_config_file(sharing='public',theme='pearl',offline=False) cf.go_offline()
cwd = pathlib.Path.cwd()
data = pd.read_csv(cwd/'mpg_dataset'/'auto-mpg.csv')
report = data.profile_report() report.to_file(output_file="auto-mpg.html")*
只需一行代码,这个出色的库就可以为您完成初步的 EDA。
Snapshot from the Pandas Profiling Report. Click here to view the full report.
数据预处理
- 马上,我们看到汽车名称在 396 行中有 305 个不同的值。所以我们放弃这个变量。
- **马力被解释为分类变量。经过调查,它有一些行带有“?”。将它们替换为列的平均值,并将其转换为浮点型。
- 它还显示了位移*、气缸和重量之间的多重共线性。让我们暂时把它留在那里。*
在 python 世界中,线性回归在 Sci-kit Learn 和 Statsmodels 中可用。它们给出了相同的结果,但是 Statsmodels 更倾向于统计学家,Sci-kit Learn 更倾向于 ML 从业者。让我们使用 statsmodels,因为它提供了开箱即用的漂亮摘要。
*X = data.drop(['mpg'], axis=1)
y = data['mpg']
## let's add an intercept (beta_0) to our model
# Statsmodels does not do that by default
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()
predictions = model.predict(X)
# Print out the statistics
model.summary()
# Plot the coefficients (except intercept) model.params[1:].iplot(kind='bar')*
**
这里的解释非常简单。
- 截距可以解释为在所有自变量都为零的情况下你所预测的里程。这里的“问题”是,如果独立变量可以为零是不合理的,或者如果在线性回归训练的数据中没有这种情况,那么截距是没有意义的。它只是将回归锚定在正确的位置。
- 这些系数可以被解释为因变量的变化,它将驱动自变量的单位变化。例如,如果我们增加 1 的重量,里程将减少 0.0067
- 一些特征,如气缸、年款等,本质上是明确的。这些系数需要解释为不同类别之间的平均里程差异。这里还有一点需要注意的是,所有的分类特征在本质上都是有序的(圆柱体越多意味着里程越少,或者模型年份越高,里程越多),因此可以让它们保持原样并运行回归。但如果情况不是这样,哑元或一次性编码分类变量是可行的。
现在来看特征重要性,看起来产地和车型年份是驱动该车型的主要特征,对吗?
没有。我们来详细看一下。为了阐明我的观点,让我们看几行数据。
**原点有 1、2 等值。, model_year 的值类似于 70、80 等。重量的值有 3504、3449 等。,mpg(我们的因变量)有 15,16 等值。你看到这里的问题了吗?要建立一个输出 15 或 16 的方程,该方程需要一个小的权重系数和一个大的原点系数。
那么,我们该怎么办?
回车,标准化回归系数。
我们将每个系数乘以自变量的标准偏差与因变量的标准偏差之比。标准化系数是指预测变量每增加一个标准差,因变量将改变多少个标准差。
*#Standardizing the Regression coefficients std_coeff = model.params for col in X.columns: std_coeff[col] = (std_coeff[col]* np.std(X[col]))/ np.std(y) std_coeff[1:].round(4).iplot(kind='bar')*
画面真的变了,不是吗?汽车的重量是决定行驶里程的最大因素,其系数几乎为零。如果你想获得标准化背后更多的直觉/数学,建议你看看这个 StackOverflow 答案。
获得类似结果的另一种方法是在拟合线性回归之前标准化输入变量,然后检查系数。
*from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
lm = LinearRegression()
lm.fit(X_std,y)
r2 = lm.score(X_std,y)
adj_r2 = 1-(1-r2)*(len(X)-1)/(len(X)-len(X.columns)-1)
print ("R2 Score: {:.2f}% | Adj R2 Score: {:.2f}%".format(r2*100,adj_r2*100))
params = pd.Series({'const': lm.intercept_})
for i,col in enumerate(X.columns):
params[col] = lm.coef_[i]
params[1:].round(4).iplot(kind='bar')*
即使实际系数不同,特征之间的相对重要性保持不变。
线性回归中的最后一个“陷阱”通常是多重共线性和 OLS。线性回归是解决使用 OLS,这是一个无偏估计。即使听起来是好事,其实也不一定。这里的“无偏”是指求解过程不考虑哪个自变量比其他变量更重要;即,它对独立变量是无偏的,并且努力获得最小化残差平方和的系数。但是我们真的想要一个最小化 RSS 的模型吗?提示:RSS 是在训练集中计算的。
在偏差与方差的权衡中,存在一个最佳点,在这个点上你可以获得平衡过度拟合的最佳模型复杂度。通常,因为很难估计偏差和方差来进行分析推理并达到最佳点,所以我们采用基于交叉验证的策略来达到同样的目的。但是,如果你想一想,在线性回归中没有真正的超参数可以调整。
而且,由于估计量是无偏的,它会将一部分贡献分配给它可用的每个特征。当存在多重共线性时,这就成了一个更大的问题。虽然这不会对模型的预测能力产生太大影响,但会影响模型的可解释性。当一个特征与另一个特征或特征组合高度相关时,该特征的边际贡献受到其他特征的影响。因此,如果数据集中存在强烈的多重共线性,回归系数将会产生误导。
进入正规化。
几乎任何机器学习算法的核心都是最小化成本函数的优化问题。在线性回归的情况下,成本函数是残差平方和,它只不过是由系数参数化的预测值和实际值之间的平方误差。
Source: https://web.stanford.edu/~hastie/ElemStatLearn/
为了增加正则化,我们在优化的成本函数中引入了一个附加项。成本函数现在变成:
**
在岭回归中,我们将所有平方系数之和添加到成本函数中,在 Lasso 回归中,我们添加了绝对系数之和。除此之外,我们还引入了一个参数λ*,这是一个超参数,我们可以调整它来达到最佳的模型复杂度。并且由于 L1 和 L2 正则化的数学性质,对系数的影响略有不同。*
- 岭回归将它认为不太重要的独立变量的系数缩小到接近零。
- 套索回归将它认为不太重要的独立变量的系数缩小到零。
- 如果存在多重共线性,Lasso 会选择其中一个并将另一个缩小到零,而 Ridge 会将另一个缩小到接近零。
由 Hastie,Tibshirani,Friedman 撰写的《统计学习的要素》给出了以下指导方针:当你有许多中小型效果时,你应该使用 Ridge。如果你只有几个中/大效果的变量,用套索。你可以看看这个媒体博客,它相当详细地解释了正规化。作者也给出了一个简洁的总结,我在这里借用一下。
*lm = RidgeCV()
lm.fit(X,y)
r2 = lm.score(X,y)
adj_r2 = 1-(1-r2)*(len(X)-1)/(len(X)-len(X.columns)-1)
print ("R2 Score: {:.2f}% | Adj R2 Score: {:.2f}%".format(r2*100,adj_r2*100))
params = pd.Series({'const': lm.intercept_})
for i,col in enumerate(X.columns):
params[col] = lm.coef_[i]
ridge_params = params.copy() lm = LassoCV()
lm.fit(X,y)
r2 = lm.score(X,y)
adj_r2 = 1-(1-r2)*(len(X)-1)/(len(X)-len(X.columns)-1)
print ("R2 Score: {:.2f}% | Adj R2 Score: {:.2f}%".format(r2*100,adj_r2*100))
params = pd.Series({'const': lm.intercept_})
for i,col in enumerate(X.columns):
params[col] = lm.coef_[i]
lasso_params = params.copy()ridge_params.to_frame().join(lasso_params.to_frame(), lsuffix='_ridge', rsuffix='_lasso')*
我们只是对相同的数据进行了岭和套索回归。岭回归给出了与原始回归完全相同的 R2 和调整后的 R2 分数(分别为 82.08%和 81.72%),但系数略有缩小。Lasso 给出了较低的 R2 和调整后的 R2 得分(分别为 76.67%和 76.19%),并有相当大的收缩。
如果你仔细观察这些系数,你会发现岭回归并没有减少多少系数。唯一真正缩水的地方是位移和原点*。这可能有两个原因:*
- 位移与圆柱体(0.95)有很强的相关性,因此它被缩小了
- 原始问题中的大部分系数已经接近于零,因此收缩非常小。
但是如果你看看 Lasso 是如何缩小系数的,你会发现它相当有侵略性。
作为一个经验法则,我建议总是使用某种正规化。
决策树
让我们为这个练习选择另一个数据集——世界著名的虹膜数据集。对于那些一直生活在岩石下的人来说,Iris 数据集是对三种花卉进行测量的数据集。一种花与另外两种花是线性可分的,但是另外两种花彼此不是线性可分的。
该数据集中的列是:
- 身份
- SepalLengthCm
- SepalWidthCm
- PetalLengthCm
- PetalWidthCm
- 种类
我们删除了“Id”列,对物种目标进行了编码,使其成为目标,并在其上训练了一个决策树分类器。
让我们看看决策树中的“特征重要性”(我们将在博客系列的下一部分详细讨论特征重要性及其解释)。
*clf = DecisionTreeClassifier(min_samples_split = 4) clf.fit(X,y) feat_imp = pd.DataFrame({'features': X.columns.tolist(), "mean_decrease_impurity": clf.feature_importances_}).sort_values('mean_decrease_impurity', ascending=False) feat_imp = feat_imp.head(25) feat_imp.iplot(kind='bar', y='mean_decrease_impurity', x='features', yTitle='Mean Decrease Impurity', xTitle='Features', title='Mean Decrease Impurity', )*
在这四个特征中,分类器仅使用花瓣长度和花瓣宽度来区分这三类。
让我们使用出色的库 dtreeviz 来可视化决策树,看看模型是如何学习规则的。
*from dtreeviz.trees import * viz = dtreeviz(clf, X, y, target_name='Species', class_names=["setosa", "versicolor", "virginica"], feature_names=X.columns) viz*
模型如何做它正在做的事情是非常清楚的。让我们向前一步,想象一个特定的预测是如何做出的。
*# random sample from training x = X.iloc[np.random.randint(0, len(X)),:] viz = dtreeviz(clf, X, y, target_name='Species', class_names=["setosa", "versicolor", "virginica"], feature_names=X.columns, X=x) viz*
如果我们只使用决策树选择的两个特征重新运行分类,它会给出相同的预测。但是线性回归这样的算法就不一样了。如果我们移除不满足 p 值临界值的变量,模型的性能也可能会下降一些。
解释决策树要比线性回归简单得多,尽管它有很多奇怪的地方和假设。统计建模:Leo Breiman 的《两种文化》是理解解释线性回归中的问题的必读之作,它还从性能和可解释性两方面论证了决策树甚至随机森林优于线性回归的情况。(免责声明:如果你还没有想到,利奥·布雷曼是《随机森林》的创始人之一)**
这就是我们博客系列的第一部分。请继续关注下一部分,我们将探索诸如排列重要性、Shapely 值、PDP 等事后解释技术。
我的 Github 中有完整的代码
参考文献
- 米勒蒂姆。"人工智能中的解释:来自社会科学的见解."arXiv 预印本 arXiv:1706.07269。(2017)
- 可解释的人工智能(XAI):面向负责任的人工智能的概念、分类学、机遇和挑战。艾]
- Guidotti,Ricardo 等,“解释黑盒模型的方法综述”arXiv:1802.01933 [cs .CY]
原载于 2019 年 11 月 12 日【http://deep-and-shallow.com】*。*
可解释性:打开黑匣子——第二部分
杂质的平均减少,排列的重要性?LOOC 重要性、PDP 图等
付费墙是否困扰着你? 点击这里 可以绕过去。
在本系列的最后一篇文章中,我们定义了什么是可解释性,并查看了几个可解释性模型以及其中的怪癖和“陷阱”。现在,让我们更深入地研究事后解释技术,当您的模型本身不透明时,这种技术很有用。这与大多数真实世界的用例产生了共鸣,因为无论我们喜欢与否,我们都可以通过黑盒模型获得更好的性能。
数据集
在本练习中,我选择了成人数据集,也称为人口普查收入数据集。人口普查收入是一个非常受欢迎的数据集,它有人口统计信息,如年龄、职业,还有一列告诉我们特定人的收入是否为 50k。我们使用该列来运行使用随机森林的二元分类。选择随机森林有两个原因:
- 随机森林和梯度增强树是最常用的算法之一。这两种算法都来自于决策树集成算法家族。
- 我想讨论一些特定于基于树的模型的技术。
事后口译
现在,让我们看看做事后解释的技术,以理解我们的黑盒模型。在博客的其余部分,讨论将基于机器学习模型(而不是深度学习),并将基于结构化数据。虽然这里的许多方法都是模型不可知的,但由于有许多特定的方法来解释深度学习模型,特别是在非结构化数据上,我们将这一点置于我们当前的范围之外。(可能是另一篇博客,改天。)
数据预处理
- 将目标变量编码成数字变量
- 处理缺失值
- 通过组合几个值,将婚姻状况转换为二元变量
- 放弃教育,因为教育 _ 数字给出了相同的信息,但以数字格式表示
- 放弃资本收益和资本损失,因为他们没有任何信息。90%以上都是零
- 放弃 native_country 是因为高基数和偏向我们
- 因为与婚姻状况有很多重叠,所以放弃了关系
对随机森林算法进行了调整,并对数据进行了训练,取得了 83.58%的性能。考虑到根据你建模和测试的方式,最好的分数从 78-86%不等,这是一个不错的分数。但是对于我们的目的来说,模型性能已经足够了。
1.杂质的平均减少
这是迄今为止最流行的解释基于树的模型及其集合的方式。这很大程度上是因为 Sci-Kit Learn 及其简单易用的实现。拟合随机森林或梯度推进模型并绘制“要素重要性”已成为数据科学家中使用和滥用最多的技术。
当在任何集合决策树方法(随机森林、梯度推进等)中创建决策树时,通过测量特征在减少不确定性(分类器)或方差(回归器)方面的有效性来计算特征的杂质重要性的平均减少。).
该技术的优点是:
- 获取特征重要性的快速简单的方法
- 在 Sci-kit 学习和 R 中决策树实现中很容易获得
- 向外行人解释是非常直观的
算法
- 在构建树的过程中,无论何时进行分割,我们都会跟踪哪个特征进行了分割,分割前后的基尼系数是多少,以及它影响了多少样本
- 在树构建过程的最后,您可以计算归因于每个特征的基尼系数的总增益
- 在随机森林或梯度增强树的情况下,我们对集合中的所有树平均这个分数
履行
默认情况下,Sci-kit Learn 在基于树的模型的“特征重要性”中实现这一点。因此检索它们并绘制出前 25 个特征是非常简单的。
feat_imp = pd.DataFrame({'features': X_train.columns.tolist(), "mean_decrease_impurity": rf.feature_importances_}).sort_values('mean_decrease_impurity', ascending=False) feat_imp = feat_imp.head(25) feat_imp.iplot(kind='bar', y='mean_decrease_impurity', x='features', yTitle='Mean Decrease Impurity', xTitle='Features', title='Mean Decrease Impurity', )
Click here for full interactive plot
我们还可以检索并绘制每种树的杂质平均减少量的箱线图。
# get the feature importances from each tree and then visualize the distributions as boxplots all_feat_imp_df = pd.DataFrame(data=[tree.feature_importances_ for tree in rf], columns=X_train.columns) order_column = all_feat_imp_df.mean(axis=0).sort_values(ascending=False).index.tolist()
all_feat_imp_df[order_column[:25]].iplot(kind=’box’, xTitle = 'Features’, yTitle=’Mean Decease Impurity’)
Click for full interactive plot
解释
- 前 4 个特征是婚姻状况、教育程度、年龄、和工作时间。这很有道理,因为它们与你的收入有很大关系
- 注意到 fnlwgt 和 random 这两个特性了吗?它们比一个人的职业更重要吗?
- 这里的另一个警告是,我们将热门特征视为独立的特征,这可能与职业特征的排名低于随机特征有一定关系。当考虑特性重要性时,处理热点特性是另外一个话题
我们来看看 fnlwgt 和随机是什么。
- fnlwgt 数据集的描述是一个冗长而复杂的描述,描述了人口普查机构如何使用抽样来创建任何特定人口社会经济特征的“加权记录”。简而言之,这是一个抽样体重,与一个人的收入无关
- 而随机也就顾名思义。在拟合模型之前,我用随机数做了一列,称之为 random
当然,这些特征不可能比职业、工作阶级、性别等其他特征更重要。如果是这样的话,那就有问题了。
包里的小丑,又名“抓到你了”
当然…有。杂质测量的平均减少是特征重要性的偏差测量。它偏爱连续的特性和高基数的特性。2007 年,施特罗布尔等人 [1]也在的《随机森林变量重要性度量的偏差:图解、来源和解决方案中指出“布雷曼的原始随机森林方法的变量重要性度量……在潜在预测变量的度量尺度或类别数量发生变化的情况下是不可靠的。”
我们来试着理解一下为什么会有偏差。还记得杂质平均减少量是如何计算的吗?每次在要素上分割一个结点时,都会记录基尼系数的下降。并且当一个特征是连续的或者具有高基数时,该特征可能比其他特征被分割更多次。这扩大了该特定特征的贡献。我们这两个罪魁祸首的特征有什么共同点——它们都是连续变量。
2.删除列重要性,也称为遗漏一个协变量(LOOC)
Drop Column feature importance 是查看特性重要性的另一种直观方式。顾名思义,这是一种迭代删除特性并计算性能差异的方法。
该技术的优点是:
- 给出了每个特征的预测能力的相当准确的图像
- 查看特性重要性的最直观的方法之一
- 模型不可知。可适用于任何型号
- 它的计算方式,会自动考虑模型中的所有相互作用。如果要素中的信息被破坏,它的所有交互也会被破坏
算法
- 使用您训练过的模型参数,在 OOB 样本上计算您选择的指标。您可以使用交叉验证来获得分数。这是你的底线。
- 现在,从您的训练集中一次删除一列,重新训练模型(使用相同的参数和随机状态)并计算 OOB 分数。
- 重要性= OOB 得分—基线
履行
def dropcol_importances(rf, X_train, y_train, cv = 3):
rf_ = clone(rf)
rf_.random_state = 42
baseline = cross_val_score(rf_, X_train, y_train, scoring='accuracy', cv=cv)
imp = []
for col in X_train.columns:
X = X_train.drop(col, axis=1)
rf_ = clone(rf)
rf_.random_state = 42
oob = cross_val_score(rf_, X, y_train, scoring='accuracy', cv=cv)
imp.append(baseline - oob)
imp = np.array(imp)
importance = pd.DataFrame( imp, index=X_train.columns) importance.columns = ["cv_{}".format(i) for i in range(cv)]
return importance
让我们做一个 50 倍交叉验证来估计我们的 OOB 分数。(我知道这是多余的,但让我们保留它,以增加我们箱线图的样本)像以前一样,我们绘制准确性的平均下降以及箱线图,以了解跨交叉验证试验的分布。
drop_col_imp = dropcol_importances(rf, X_train, y_train, cv=50) drop_col_importance = pd.DataFrame({’features’: X_train.columns.tolist(), "drop_col_importance": drop_col_imp.mean(axis=1).values}).sort_values(’drop_col_importance’, ascending=False) drop_col_importance = drop_col_importance.head(25) drop_col_importance.iplot(kind=’bar’, y=’drop_col_importance’, x=’features’, yTitle=’Drop Column Importance’, xTitle=’Features’, title=’Drop Column Importances’, ) all_feat_imp_df = drop_col_imp.T order_column = all_feat_imp_df.mean(axis=0).sort_values(ascending=False).index.tolist()
all_feat_imp_df[order_column[:25]].iplot(kind=’box’, xTitle = 'Features’, yTitle=’Drop Column Importance’)
Click for full interactive plot
Click for full interactive plot
解释
- 排名前 4 位的特征仍然是婚姻状况、教育程度、年龄、和工作时间。
- fnlwgt 在列表中被向下推,现在出现在一些热门编码职业之后。
- random 仍然占据着很高的排名,将自己定位在工作时间之后
正如所料, fnlwgt 远没有杂质重要性的平均降低让我们相信的那么重要。随机的高位置让我有点困惑,我重新运行了重要性计算,将所有独一无二的特性视为一个。即删除所有职业列并检查职业的预测能力。当我这么做的时候,我可以看到随机和 fnlwgt 排名低于职业和工作类 。冒着让帖子变得更大的风险,让我们改天再调查吧。
那么,我们有完美的解决方案吗?这些结果与杂质的平均减少一致,它们有一致的意义,并且它们可以应用于任何模型。
群里的小丑
这里的难点在于所涉及的计算。为了执行这种重要性计算,您必须多次训练模型,针对您拥有的每个功能训练一次,并针对您想要进行的交叉验证循环次数重复训练。即使你有一个训练时间不到一分钟的模型,当你有更多的特征时,计算时间也会激增。为了给你一个概念,我花了 2 小时 44 分钟来计算 36 个特性和 50 个交叉验证循环的特性重要性(当然,这可以通过并行处理来改进,但你要明白这一点)。如果你有一个需要两天时间训练的大型模型,那么你可以忘记这个技巧。
我对这种方法的另一个担心是,因为我们每次都用新的特性集来重新训练模型,所以我们没有进行公平的比较。我们删除一列并再次训练模型,如果可以,它会找到另一种方法来获得相同的信息,当存在共线特征时,这种情况会放大。因此,我们在调查时混合了两种东西——功能的预测能力和模型自我配置的方式。
3.排列重要性
置换特征重要性被定义为当单个特征值被随机打乱时模型分数的减少[2]。这项技术衡量的是置换或打乱特征向量时的性能差异。关键的想法是,一个特性是重要的,如果这个特性被打乱,模型性能就会下降。
该技术的优点是:
- 非常直观。如果一个特性中的信息被打乱,性能会下降多少?
- 模型不可知。尽管该方法最初是由 Brieman 为 Random Forest 开发的,但它很快就适应了模型不可知的框架
- 它的计算方式,会自动考虑模型中的所有相互作用。如果要素中的信息被破坏,它的所有交互也会被破坏
- 该模型不需要重新训练,因此我们节省了计算
算法
- 使用度量、训练模型、特征矩阵和目标向量来计算基线得分
- 对于特征矩阵中的每个特征,制作特征矩阵的副本。
- 打乱特征列,将其传递给训练好的模型以获得预测,并使用度量来计算性能。
- 重要性=基线-得分
- 重复 N 次以获得统计稳定性,并在所有试验中取平均重要性
履行
置换重要性至少在 python 的三个库中实现——Eli 5、 mlxtend ,以及 Sci-kit Learn 的一个开发分支。我选择 mlxtend 版本完全是为了方便。根据施特罗布尔等人【3】,“原始【排列】重要性……具有更好的统计特性”与通过除以标准偏差来归一化重要性值相反。我已经检查了 mlxtend 和 Sci-kit Learn 的源代码,它们没有正常化它们。
from mlxtend.evaluate import feature_importance_permutation #This takes sometime. You can reduce this number to make the process faster num_rounds = 50
imp_vals, all_trials = feature_importance_permutation( predict_method=rf.predict, X=X_test.values, y=y_test.values, metric='accuracy', num_rounds=num_rounds, seed=1)permutation_importance = pd.DataFrame({’features’: X_train.columns.tolist(), "permutation_importance": imp_vals}).sort_values(’permutation_importance’, ascending=False) permutation_importance = permutation_importance.head(25) permutation_importance.iplot(kind=’bar’, y=’permutation_importance’, x=’features’, yTitle=’Permutation Importance’, xTitle=’Features’, title=’Permutation Importances’, )
我们还绘制了所有试验的箱线图,以了解偏差。
all_feat_imp_df = pd.DataFrame(data=np.transpose(all_trials), columns=X_train.columns, index = range(0,num_rounds)) order_column = all_feat_imp_df.mean(axis=0).sort_values(ascending=False).index.tolist()
all_feat_imp_df[order_column[:25]].iplot(kind='box', xTitle = 'Features', yTitle='Permutation Importance')
Click for full interactive plot
Click for full interactive plot
解释
- 前四名保持不变,但是前三名(婚姻状况、教育程度、年龄)在排列重要性上更加明显
- fnlwgt 和 random 甚至没有进入前 25 名
- 成为一名执行经理或专业教授与你是否能挣到 5 万英镑有很大关系
- 总而言之,这与我们对这一过程的心理模型产生了共鸣
功能重要性方面一切都好吗?我们有没有最好的方法来解释模型在预测中使用的特征?
包里的小丑
我们从生活中知道,没有什么是完美的,这种技术也是如此。它的致命弱点是特征之间的相关性。就像 drop column importance 一样,这种技术也会受到特性之间的相关性的影响。施特罗布尔等人在《随机森林的条件变量重要性》[3]中指出,“排列重要性高估了相关预测变量的重要性。“特别是在树的集合中,如果有两个相关变量,一些树可能会选择特征 A,而另一些树可能会选择特征 B。在进行此分析时,在没有特征 A 的情况下,选择特征 B 的树会工作良好并保持高性能,反之亦然。这将导致相关特征 A 和 B 都具有夸大的重要性。
该技术的另一个缺点是该技术的核心思想是置换特征。但这本质上是一种随机性,我们无法控制。正因为如此,结果可能变化很大。我们在这里看不到它,但是如果箱线图显示一个特性在不同试验中的重要性有很大的变化,我会在我的解释中保持警惕。
Phi_k Correlation Coefficient [7](in-built in pandas profiling which considers categorical variables as well)
这种技术还有另一个缺点,在我看来,这是最令人担心的。Giles Hooker 等人[6]说,“当训练集中的特征表现出统计相关性时,排列方法在应用于原始模型时可能会产生很大的误导。”
我们来考虑一下职业和学历。我们可以从两个角度理解这一点:
- 逻辑:你想想,职业和学历有确定的依赖关系。如果你受过足够的教育,你只能得到几份工作,从统计学上来说,你可以在它们之间画出平行线。因此,如果我们改变这些列中的任何一个,它将创建没有意义的功能组合。一个学历学历第十职业第职业第Prof-specialty的人没有太大意义,不是吗?因此,当我们评估模型时,我们评估的是无意义的情况,这些情况混淆了我们用来评估特性重要性的度量标准。
- 数学 : 职业和学历有很强的统计相关性(从上面的相关图可以看出)。因此,当我们置换这些特征中的任何一个时,我们是在迫使模型探索高维特征空间中看不见的子空间。这迫使模型进行外推,而这种外推是误差的重要来源。
Giles Hooker 等人[6]提出了结合 LOOC 和置换方法的替代方法,但所有替代方法的计算量都更大,并且没有具有更好统计特性的强有力的理论保证。
处理相关特征
在识别高度相关的特征之后,有两种处理相关特征的方法。
- 将高度相关的变量组合在一起,仅评估该组中的一个特征作为该组的代表
- 当您置换列时,请在一次试验中置换整组特征。
注意:第二种方法与我建议的处理一次性变量的方法相同。
旁注(培训或验证)
在讨论删除列重要性和排列重要性时,您应该想到一个问题。我们将测试/验证集传递给计算重要性的方法。为什么不是火车组?
这是应用这些方法的一个灰色地带。这里没有对错之分,因为两者都有支持和反对的理由。在《可解释机器学习》一书中,Christoph Molnar 提出了训练集和验证集都适用的案例。
测试/验证数据的案例是显而易见的。出于同样的原因,我们不能通过训练集中的误差来判断模型,我们也不能根据训练集中的性能来判断特征的重要性(特别是因为重要性与误差有着内在的联系)。
训练数据的情况是反直觉的。但是如果你仔细想想,你会发现我们想要衡量的是模型如何使用这些特性。有什么比训练模型的训练集更好的数据来判断这一点呢?另一个无关紧要的问题是,我们应该在所有可用的数据上训练模型,在这样一个理想的场景中,将没有测试或验证数据来检查性能。在可解释机器学习[5]中,第 5.5.2 节详细讨论了这个问题,甚至用一个过度拟合 SVM 的合成例子。
归根结底,你是想知道模型依靠什么特征来进行预测,还是想知道每个特征对未知数据的预测能力。例如,如果您在特性选择的上下文中评估特性的重要性,在任何情况下都不要使用测试数据(您会过度调整您的特性选择以适应测试数据)
4.部分依赖图(PDP)和个体条件期望图(ICE)
到目前为止,我们回顾的所有技术都着眼于不同特性的相对重要性。现在让我们稍微换个方向,看看一些探索特定特征如何与目标变量交互的技术。
部分依赖图和个别条件期望图帮助我们理解特征和目标之间的功能关系。它们是一个给定变量(或多个变量)对结果的边际效应的图形可视化。Friedman(2001)在他的开创性论文贪婪函数逼近:梯度推进机【8】中介绍了这一技术。
部分相关图显示平均效应,而 ICE 图显示单个观察值的函数关系。PD 图显示平均效应,而 ICE 图显示效应的分散性或异质性。
这种技术的优势是:
- 计算非常直观,易于用通俗的语言解释
- 我们可以理解一个特征或特征组合与目标变量之间的关系。即它是线性的、单调的、指数的等等。
- 它们易于计算和实现
- 它们给出了因果解释,与特征重要性风格解释相反。但我们必须记住的是,模型如何看待世界以及现在的现实世界的因果解释。
算法
让我们考虑一个简单的情况,其中我们为单个特征 x 绘制 PD 图,具有唯一值{x1,x2,……xk}。PD 图可构建如下:
- 对于{1,2,3,…的 I 元素。k}
- 复制训练数据并用 x(i)替换原始值 x
- 使用已训练的模型为整个训练数据的已修改副本生成预测
- 将对 x(i)的所有预测存储在类似映射的数据结构中
对于 PD 图:
- 计算{1,2,3,…k}的 I 元素的每个 x(i)的平均预测值
- 绘制对{ x { I },平均值(所有带有 x(i)的预测值)
对于冰图:
- 画出所有的对{x(i),f(x(i),其余的特征(n)}其中 n 元素为{1,2,3,…。N}
- 在实践中,我们不是取某个特征的所有可能值,而是为连续变量定义一个区间网格,以节省计算时间。
- 对于分类变量,这个定义也成立,但是我们不会在这里定义一个网格。取而代之的是,我们采用类别中的所有唯一值(或属于分类特征的所有一次性编码变量),并使用相同的方法计算 ICE 和 PD 图。
- 如果过程你还不清楚,建议看看这篇中帖(作者是 PDPbox,一个用于绘制 PD 图的 python 库。
履行
我发现在 PDPbox 、滑手和 Sci-kit Learn 中实现的 PD 剧情。以及 PDPbox 、 pyCEbox 和 skater 中的冰剧情。在所有这些中,我发现 PDPbox 是最完美的。它们还支持 2 个可变 PDP 图。
from pdpbox import pdp, info_plots pdp_age = pdp.pdp_isolate( model=rf, dataset=X_train, model_features=X_train.columns, feature='age' ) #PDP Plot
fig, axes = pdp.pdp_plot(pdp_age, 'Age', plot_lines=False, center=False, frac_to_plot=0.5, plot_pts_dist=True,x_quantile=True, show_percentile=True)
#ICE Plot
fig, axes = pdp.pdp_plot(pdp_age, 'Age', plot_lines=True, center=False, frac_to_plot=0.5, plot_pts_dist=True,x_quantile=True, show_percentile=True)
让我花点时间解释一下情节。在 x 轴上,您可以找到您试图理解的特征的值,即年龄。在 y 轴上你会发现预测。在分类的情况下,它是预测概率,而在回归的情况下,它是实值预测。底部的条形表示不同分位数中训练数据点的分布。这有助于我们判断推论的正确性。点数很少的部分,模型看到的例子很少,解释可能很棘手。PD 图中的单线显示了特征和目标之间的平均函数关系。ICE 图中的所有线条显示了训练数据中的异质性,即训练数据中的所有观察值如何随着不同的年龄值而变化。
解释
- 年龄与一个人的赚钱能力有很大程度上的单调关系。年龄越大,收入越有可能超过 5 万英镑
- 冰图显示了很大的分散性。但是所有这些都显示了我们在 PD 图中看到的同样的行为
- 训练观察在不同的分位数之间相当平衡。
现在,让我们举一个具有分类特征的例子,比如教育。PDPbox 有一个非常好的特性,它允许您传递一个特性列表作为输入,它将计算它们的 PDP,将它们视为分类特性。
# All the one-hot variables for the occupation feature occupation_features = ['occupation_ ?', 'occupation_ Adm-clerical', 'occupation_ Armed-Forces', 'occupation_ Craft-repair', 'occupation_ Exec-managerial', 'occupation_ Farming-fishing', 'occupation_ Handlers-cleaners', 'occupation_ Machine-op-inspct', 'occupation_ Other-service', 'occupation_ Priv-house-serv', 'occupation_ Prof-specialty', 'occupation_ Protective-serv', 'occupation_ Sales', 'occupation_ Tech-support', 'occupation_ Transport-moving'] #Notice we are passing the list of features as a list with the feature parameter
pdp_occupation = pdp.pdp_isolate( model=rf, dataset=X_train, model_features=X_train.columns, feature=occupation_features ) #PDP
fig, axes = pdp.pdp_plot(pdp_occupation, 'Occupation', center = False, plot_pts_dist=True)
#Processing the plot for aesthetics
_ = axes['pdp_ax']['_pdp_ax'].set_xticklabels([col.replace("occupation_","") for col in occupation_features]) axes['pdp_ax']['_pdp_ax'].tick_params(axis='x', rotation=45)
bounds = axes['pdp_ax']['_count_ax'].get_position().bounds axes['pdp_ax']['_count_ax'].set_position([bounds[0], 0, bounds[2], bounds[3]]) _ = axes['pdp_ax']['_count_ax'].set_xticklabels([])
解释
- 大多数职业对你的收入影响很小。
- 其中最突出的是行政管理、专业教授和技术支持
- 但是,从分布情况来看,我们知道几乎没有技术支持的培训示例,因此我们对此持保留态度。
多个特征之间的相互作用
理论上可以为任意数量的特征绘制 PD 图,以显示它们的相互作用。但实际上,我们只能做两个人,最多三个人。让我们来看看两个连续特征年龄和教育之间的交互图(教育和年龄不是真正连续的,但由于缺乏更好的例子,我们选择它们)。
有两种方法可以绘制两个特征之间的 PD 图。这里有三个维度,特征值 1、特征值 2 和目标预测。或者,我们可以绘制一个三维图或一个二维图,第三维用颜色表示。我更喜欢二维图,因为我认为它比三维图以更清晰的方式传达信息,在三维图中,你必须查看三维形状来推断关系。PDPbox 实现了二维交互图,既有等高线图也有网格图。等值线最适用于连续要素,格网最适用于分类要素
# Age and Education inter1 = pdp.pdp_interact( model=rf, dataset=X_train, model_features=X_train.columns, features=['age', 'education_num'] ) fig, axes = pdp.pdp_interact_plot( pdp_interact_out=inter1, feature_names=['age', 'education_num'], plot_type='contour', x_quantile=False, plot_pdp=False ) axes['pdp_inter_ax'].set_yticklabels([edu_map.get(col) for col in axes['pdp_inter_ax'].get_yticks()])
解释
- 尽管我们在观察孤立时观察到了与年龄的单调关系,但现在我们知道这并不普遍。例如,请看第 12 级教育右边的等高线。与一些大学及以上的线相比,这是相当平坦的。它真正表明的是,你获得超过 50k 的概率不仅随着年龄的增长而增加,而且还与你的教育程度有关。随着年龄的增长,大学学位能确保你增加收入的潜力。
这也是一个非常有用的技术来调查你的算法中的偏见(伦理的那种)。假设我们想看看在性别维度上的算法偏差。
#PDP Sex pdp_sex = pdp.pdp_isolate( model=rf, dataset=X_train, model_features=X_train.columns, feature='sex' ) fig, axes = pdp.pdp_plot(pdp_sex, 'Sex', center=False, plot_pts_dist=True) _ = axes['pdp_ax']['_pdp_ax'].set_xticklabels(sex_le.inverse_transform(axes['pdp_ax']['_pdp_ax'].get_xticks())) # marital_status and sex inter1 = pdp.pdp_interact( model=rf, dataset=X_train, model_features=X_train.columns, features=['marital_status', 'sex'] ) fig, axes = pdp.pdp_interact_plot( pdp_interact_out=inter1, feature_names=['marital_status', 'sex'], plot_type='grid', x_quantile=False, plot_pdp=False ) axes['pdp_inter_ax'].set_xticklabels(marital_le.inverse_transform(axes['pdp_inter_ax'].get_xticks())) axes['pdp_inter_ax'].set_yticklabels(sex_le.inverse_transform(axes['pdp_inter_ax'].get_yticks()))
- 如果我们只看性别的概率分布图,我们会得出这样的结论:不存在真正的基于人的性别的歧视。
- 但是,你只要看看和 marriage _ status 的互动情节就知道了。在左手边(已婚),两个方块有相同的颜色和价值,但在右手边(单身)有女性和男性的区别
- 我们可以得出结论,单身男性比单身女性更有机会获得超过 50k 的收入。(虽然我不会基于此发动一场反对性别歧视的全面战争,但这绝对会是调查的起点。
群里的小丑
这种方法的最大缺陷是假设特征之间的独立性。LOOC 重要性和排列重要性中存在的相同缺陷。适用于 PDP 和 ICE 图。累积局部效应图是这个问题的解决方案。ALE 图通过计算——也是基于特征的条件分布——预测中的差异而不是平均值来解决这个问题。
总结一下每种类型的图(PDP,ALE)如何计算某个网格值 v 下某个特性的效果:
部分相关图:“让我向你展示当每个数据实例都有那个特性的值 v 时,模型平均预测的结果。我忽略了值 v 是否对所有数据实例都有意义。”
ALE plots :“让我向您展示模型预测如何在 v 周围的一个小特征“窗口”中针对该窗口中的数据实例发生变化。”
在 python 环境中,没有好的稳定的 ALE 库。我只发现了一个 ALEpython ,它还在开发中。我设法得到了一个年龄的 ALE 图,你可以在下面找到。但是当我尝试交互图时出错了。它也不是为分类特征开发的。
这就是我们再次中断的地方,把剩下的东西推到下一篇博文。在下一部分,我们来看看石灰,SHAP,锚,等等。
完整的代码可以在我的 Github 中找到
博客系列
- 第一部分
- 第二部分
- 第三部分—即将推出
参考
- 施特罗布尔特区,Boulesteix,AL。,Zeileis,a .等,《BMC 生物信息学》( 2007 年)8: 25。https://doi.org/10.1186/1471-2105-8-25
- 长度布雷曼,“随机森林”,机器学习,45(1),5–32,2001 年。https://doi.org/10.1023/A:1010933404324
- 施特罗布尔,c .,Boulesteix,a .,Kneib,T. 等随机森林的条件变量重要性。 BMC 生物信息学 **9,**307(2008)doi:10.1186/1471–2105–9–307
- 特伦斯·帕尔、凯雷姆·图尔古特鲁、克里斯多夫·西萨尔和杰瑞米·霍华德,“小心默认随机森林重要性”
- Christoph Molnar,“可解释的机器学习:使黑盒模型可解释的指南”
- Giles Hooker,Lucan Mentch,“请停止置换特征:一种解释和替代方案”, arXiv:1905.03151 【统计。我]
- 米(meter 的缩写))Baak,R. Koopman,H. Snoek,S. Klous,“具有皮尔逊特征的分类变量、序数变量和区间变量之间的新相关系数,arXiv:1811.11440【stat .我]
- 杰罗姆·h·弗里德曼贪婪函数近似法:一种梯度推进机。安。统计学家。29 (2001 年),第 5 号,1189-1232。doi:10.1214/aos/1013203451
- 亚历克斯·戈尔茨坦等“窥视黑盒内部:用个体条件期望图可视化统计学习”, arXiv:1309.6392 【统计。美联社]
原载于 2019 年 11 月 16 日http://deep-and-shallow.com。
可解释性:打开黑盒——第三部分
深入了解石灰、匀称的价值观和 SHAP
付费墙是否困扰着你?点击 这里 可以绕过去。
之前,我们在基于树的模型中使用默认的特征重要性查看了陷阱,讨论了排列重要性、LOOC 重要性和部分依赖图。现在让我们换个话题,看看一些模型不可知的技术,它们采用自下而上的方式来解释预测。这些方法不是着眼于模型并试图给出像特征重要性这样的全局解释,而是着眼于每一个预测,然后试图解释它们。
5.局部可解释的模型不可知解释(LIME)
顾名思义,这是一种模型不可知的技术,为模型生成局部解释。这项技术背后的核心思想非常直观。假设我们有一个复杂的分类器,具有高度非线性的决策边界。但是,如果我们放大观察一个单一的预测,该模型在该地区的行为可以用一个简单的可解释模型(大部分是线性的)来解释。
LIME[2]使用了一个局部替代模型,该模型针对我们正在研究的数据点的扰动进行训练,以寻求解释。这确保了即使解释不具有全局保真度(对原始模型的保真度),它也具有局部保真度。论文[2]还认识到可解释性与保真度之间存在权衡,并提出了一个表达该框架的正式框架。
ξ (x) 是解释,L(f,g,πₓ)是局部保真度的倒数(或者说 g 在局部逼近 f 有多不忠实),ω*(g)*是局部模型的复杂度, g 。为了确保局部保真度和可解释性,我们需要最小化不忠实度(或最大化局部保真度),牢记复杂度应该低到足以让人类理解。
即使我们可以使用任何可解释的模型作为局部替代,本文使用套索回归来诱导解释的稀疏性。该论文的作者将他们的探索限制在模型的保真度上,并将复杂性保持为用户输入。在套索回归的情况下,它是解释应归因于的要素的数量。
他们探索并提出解决方案的另一个方面(还没有得到很多人的欢迎)是使用一组个体实例提供全局解释的挑战。他们称之为*“子模式摘”。它本质上是一种贪婪的优化,试图从整个批次中挑选一些实例,最大化他们所谓的“非冗余覆盖”。非冗余覆盖确保优化不会挑选具有相似解释的实例。*
该技术的优势是:
- 方法论和解释对人类来说都是非常直观的。
- 生成的解释是稀疏的,从而增加了可解释性。
- 模型不可知
- LIME 适用于结构化和非结构化数据(文本、图像)
- 在 R 和 Python 中随时可用(本文作者的原始实现)
- 使用其他可解释特征的能力,即使模型是在嵌入等复杂特征中训练的。例如,回归模型可以在 PCA 的几个成分上训练,但是解释可以在对人类有意义的原始特征上生成。
算法
- 为了找到对单个数据点和给定分类器的解释
- 均匀随机地对所选单个数据点周围的局部性进行采样,并从我们想要解释的模型中生成扰动数据点及其相应预测的数据集
- 使用指定的特性选择方法选择解释所需的特性数量
- 使用核函数和距离函数计算样本权重。(这捕获了采样点离原始点有多近或多远)
- 使用样本权重对目标函数进行加权,在扰动的数据集上拟合可解释的模型。
- 使用新训练的可解释模型提供本地解释
履行
论文作者的实现可以在 Github 和 pip 中找到。在我们看一下如何实现它们之前,让我们先讨论一下实现中的一些奇怪之处,在运行它之前你应该知道这些(重点是表格解释器)。
主要步骤如下
- 通过提供训练数据(或训练数据统计,如果训练数据不可用),一些关于特性和类名的细节(在分类的情况下),初始化tabular 解释器**
- 调用类中的方法, explain_instance 并提供需要解释的实例、训练模型的预测方法以及需要包含在解释中的功能数量。
你需要记住的关键事情是:
- 默认情况下模式是分类。所以如果你试图解释一个回归问题,一定要提到它。
- 默认情况下,功能选择设置为“自动”。“自动”基于训练数据中的特征数量在 前向选择 和最高权重之间选择(如果小于 6,前向选择。最大权重刚好符合对缩放数据的岭回归,并选择 n 个最大权重和*。如果将“无”指定为特征选择参数,则不会进行任何特征选择。如果您将“lasso_path”作为特征选择,它将使用来自 sklearn 的信息来查找提供 n 个非零特征的正确级别正则化。*
- 默认情况下,岭回归用作可解释模型。但是您可以传入任何您想要的 sci-kit 学习模型,只要它有 coef_ 和’ sample_weight '作为参数。
- 还有另外两个关键参数, kernel 和 kernel_width ,它们决定了样本权重的计算方式,也限制了可能发生扰动的局部性。这些在算法中作为超参数保存。虽然,在大多数用例中,缺省值是可行的。
- 默认情况下,discrete ize _ continuous设置为 True 。这意味着连续特征被离散为四分位数、十分位数或基于熵。离散化器的默认值为四分位数*。*
现在,让我们继续使用上一部分中使用的数据集,看看 LIME 的实际应用。
*import lime import lime.lime_tabular
# Creating the Lime Explainer
# Be very careful in setting the order of the class names lime_explainer = lime.lime_tabular.LimeTabularExplainer( X_train.values, training_labels=y_train.values, feature_names=X_train.columns.tolist(), feature_selection="lasso_path", class_names=["<50k", ">50k"], discretize_continuous=True, discretizer="entropy", )
#Now let's pick a sample case from our test set.
row = 345*
Row 345
*exp = lime_explainer.explain_instance(X_test.iloc[row], rf.predict_proba, num_features=5) exp.show_in_notebook(show_table=True)*
为了多样化,让我们看另一个例子。一个被模型错误分类的。
Row 26
解释
例 1
- 我们看到的第一个例子是一个 50 岁的已婚男子,拥有学士学位。他在一家私营公司担任行政/管理职务,每周工作 40 个小时。我们的模型正确地将他归类为收入超过 5 万英镑的人
- 这样的预测在我们的心理模型中是有意义的。一个 50 岁的人在管理岗位上工作,收入超过 50k 的可能性非常高。
- 如果我们看看这个模型是如何做出这个决定的,我们可以看到,这是由于他的婚姻状况、年龄、教育程度以及他担任行政/管理职务的事实。事实上,他的职业不是一个专业,这试图降低他的可能性,但总的来说,模型决定,这个人很有可能收入超过 50k
例 2
- 第二个例子是一个 57 岁的已婚男子,高中学历。他是一名从事销售的个体户,每周工作 30 个小时。
- 即使在我们的心理模型中,我们也很难预测这样一个人的收入是否超过 50k。模型预测这个人的收入不到 50k,而事实上他赚得更多。
- 如果我们看看模型是如何做出这个决定的,我们可以看到在预测的局部有一个很强的推拉效应。一方面,他的婚姻状况和年龄将他推向了 50k 以上。另一方面,他不是高管/经理的事实、他所受的教育和每周工作时间都在把他往下推。最终,向下推动赢得了比赛,模型预测他的收入低于 50k。
子模块选择和全局解释
如前所述,论文中还提到了另一种技术,叫做“子模型选择”,可以找到一些解释来解释大多数情况。让我们也试着得到它。python 库的这个特殊部分不太稳定,提供的示例笔记本给了我错误。但是在花了一些时间通读源代码之后,我找到了一个解决错误的方法。
*from lime import submodular_pick
sp_obj = submodular_pick.SubmodularPick(lime_explainer, X_train.values, rf.predict_proba, sample_size=500, num_features=10, num_exps_desired=5) #Plot the 5 explanations [exp.as_pyplot_figure(label=exp.available_labels()[0]) for exp in sp_obj.sp_explanations]; # Make it into a dataframe W_pick=pd.DataFrame([dict(this.as_list(this.available_labels()[0])) for this in sp_obj.sp_explanations]).fillna(0)
W_pick['prediction'] = [this.available_labels()[0] for this in sp_obj.sp_explanations] #Making a dataframe of all the explanations of sampled points W=pd.DataFrame([dict(this.as_list(this.available_labels()[0])) for this in sp_obj.explanations]).fillna(0)
W['prediction'] = [this.available_labels()[0] for this in sp_obj.explanations] #Plotting the aggregate importances
np.abs(W.drop("prediction", axis=1)).mean(axis=0).sort_values(ascending=False).head( 25 ).sort_values(ascending=True).iplot(kind="barh") #Aggregate importances split by classes
grped_coeff = W.groupby("prediction").mean()
grped_coeff = grped_coeff.T
grped_coeff["abs"] = np.abs(grped_coeff.iloc[:, 0]) grped_coeff.sort_values("abs", inplace=True, ascending=False) grped_coeff.head(25).sort_values("abs", ascending=True).drop("abs", axis=1).iplot( kind="barh", bargap=0.5 )*
Click for full interactive plot
Click for full interactive plot
解释
有两个图表,其中我们汇总了从我们的测试集中采样的 500 个点的解释(我们可以在所有测试数据点上运行它,但选择只进行采样,因为需要计算)。
第一个图表汇总了超过 50k 和<50k cases and ignores the sign when calculating the mean. This gives you an idea of what features were important in the larger sense.
The second chart splits the inference across the two labels and looks at them separately. This chart lets us understand which feature was more important in predicting a particular class.
- Right at the top of the first chart, we can find “婚姻状况> 0.5 的特征的影响。按照我们的编码,就是单身的意思。所以单身是一个很强的指标,表明你的收入是高于还是低于 50k。但是等等,结婚是第二位的。这对我们有什么帮助?
- 如果你看第二张图表,情况会更清楚。你可以立即看到单身让你进入了<50k bucket and being married towards the >的 50k 桶。
- 在你匆忙去寻找伴侣之前,请记住这是模型用来寻找伴侣的。这不一定是现实世界中的因果关系。也许这个模型是在利用其他一些与结婚有很大关联的特征来预测收入潜力。
- 我们在这里也可以看到性别歧视的痕迹。如果你看“性别> 0.5”,这是男性,两个收入潜力阶层之间的分布几乎相等。不过只要看一下《性<0.5”. It shows a large skew towards <50k bucket.
Along with these, the submodular pick also(in fact this is the main purpose of the module) a set of n data points from the dataset, which best explains the model. We can look at it like a representative sample of the different cases in the dataset. So if we need to explain a few cases from the model to someone, this gives you those cases which will cover the most ground.
The Joker in the Pack
From the looks of it, this looks like a very good technique, isn’t it? But it is not without its problems.
The biggest problem here is the correct definition of the neighbourhood, especially in tabular data. For images and text, it is more straightforward. Since the authors of the paper left kernel width as a hyperparameter, choosing the right one is left to the user. But how do you tune the parameter when you don’t have a ground truth? You’ll just have to try different widths, look at the explanations, and see if it makes sense. Tweak them again. But at what point are we crossing the line into tweaking the parameters to get the explanations we want?
Another main problem is similar to the problem we have with permutation importance( 第二部)就知道了。当对局部中的点进行采样时,LIME 的当前实现使用高斯分布,这忽略了特征之间的关系。这可以创建相同的‘不太可能’数据点,在这些数据点上学习解释。
最后,选择一个线性的可解释模型来进行局部解释可能并不适用于所有情况。如果决策边界过于非线性,线性模型可能无法很好地解释它(局部保真度可能较高)。
6.得体的价值观
在讨论 Shapely 值如何用于机器学习模型解释之前,我们先试着了解一下它们是什么。为此,我们必须简单地了解一下博弈论。
博弈论是数学中最迷人的分支之一,它研究理性决策者之间战略互动的数学模型。当我们说游戏时,我们指的不仅仅是象棋,或者就此而言,垄断。游戏可以概括为两个或两个以上的玩家/团体参与一个决策或一系列决策以改善他们的地位的任何情况。当你这样看待它时,它的应用扩展到战争策略、经济策略、扑克游戏、定价策略、谈判和合同,不胜枚举。
但是由于我们关注的主题不是博弈论,我们将只讨论一些主要术语,这样你就能跟上讨论。参与游戏的各方被称为玩家。这些玩家可以采取的不同行动被称为选择。如果每个参与者都有有限的选择,那么每个参与者的选择组合也是有限的。因此,如果每个玩家都做出一个选择,就会产生一个结果,如果我们量化这些结果,这就叫做收益。如果我们列出所有的组合和与之相关的收益,这就叫做收益矩阵。
博弈论有两种范式——非合作、合作博弈。而 Shapely 值是合作博弈中的一个重要概念。我们试着通过一个例子来理解。
爱丽丝、鲍伯和席琳一起用餐。账单共计 90 英镑,但他们不想各付各的。因此,为了算出他们各自欠了多少钱,他们以不同的组合多次去同一家餐馆,并记录下账单金额。
有了这些信息,我们做一个小的心理实验。假设 A 去了餐厅,然后 B 出现了,C 出现了。因此,对于每个加入的人,我们可以有每个人必须投入的额外现金(边际贡献)。我们从 80 英镑开始(如果 A 一个人吃饭,他会支付 80 英镑)。现在当 B 加入时,我们看看 A 和 B 一起吃饭时的收益——也是 80。所以 B 给联盟带来的额外贡献是 0。当 C 加入时,总收益是 90。这使得 C 10 的边际贡献。所以,当 A,B,C 依次加入时的贡献是(80,0,10)。现在我们对这三个朋友的所有组合重复这个实验。
现在我们有了所有可能的到达顺序,我们有了所有参与者在所有情况下的边际贡献。每个参与者的预期边际贡献是他们在所有组合中边际贡献的平均值。例如,A 的边际贡献将是,(80+80+56+16+5+70)/6 = 51.17*。如果我们计算每个玩家的预期边际贡献,并把它们加在一起,我们会得到 90,这是三个人一起吃饭的总收益。*
你一定想知道所有这些与机器学习和可解释性有什么关系。很多。如果我们想一想,一个机器学习预测就像一个游戏,其中不同的功能(玩家),一起游戏以带来一个结果(预测)。由于这些特征一起工作,相互作用,做出预测,这就变成了一个合作博弈的例子。这完全符合匀称的价值观。
但是只有一个问题。随着特征的增加,计算所有可能的联盟及其结果很快变得不可行。因此,2013 年,Erik trumbelj等人提出了一种使用蒙特卡罗抽样的近似方法。在这个结构中,回报被建模为不同蒙特卡罗样本的预测与平均预测的差异。
其中 f 是我们试图解释的黑盒机器学习模型, x 是我们试图解释的实例,j 是我们试图找到预期边际贡献的特征, x ᵐ₋ⱼ和 x ᵐ₊ⱼ是 x 的两个实例,我们已经通过从数据集本身中采样另一个点对其进行了随机置换, M 是我们从训练集中抽取的样本数。
让我们看看 Shapely 值的一些令人满意的数学属性,这使得它在可解释性应用中非常令人满意。Shapely 值是唯一满足效率、对称性、虚拟性和可加性属性的属性方法。同时满足这些条件被认为是公平支付的定义。
- 效率-要素贡献加起来就是 x 和平均值的预测差异。
- 对称性-如果两个特征值对所有可能的联合的贡献相等,则它们的贡献应该相同。
- 虚拟-无论添加到哪个联盟,都不会更改预测值的要素的 Shapely 值都应为 0
- 可加性——对于组合支付的游戏,可以将相应的 Shapely 值加在一起,得到最终的 Shapely 值
虽然所有的属性都使这成为一种理想的特征归属方式,但其中一个特别具有深远的影响,即可加性*。这意味着,对于像 RandomForest 或梯度增强这样的集合模型,该属性保证了如果我们单独计算每棵树的要素的 Shapely 值并对其进行平均,您将获得集合的 Shapely 值。这一特性也可以扩展到其他集成技术,如模型叠加或模型平均。*
出于两个原因,我们将不回顾算法并查看 Shapely 值的实现:
- 在大多数现实世界的应用中,计算 Shapely 值是不可行的,即使有近似值。
- 有一个更好的计算 Shapely 值的方法,还有一个稳定的库,我们将在下面介绍。
7.得体的附加解释(SHAP)
SHAP (SHapely 附加解释)提出了一个解释模型预测的统一方法。斯科特·伦德伯格等人提出了一个框架,该框架统一了六种先前存在的特征归属方法(包括 LIME 和 DeepLIFT ),他们将其框架作为附加特征归属模型。
他们表明,这些方法中的每一种都可以用上面的等式来表示,并且 Shapely 值可以很容易地计算出来,这带来了一些保证。尽管论文中提到的属性与 Shapely 值略有不同,但原则上它们是相同的。这提供了一个强大的技术(如石灰)的理论基础,一旦适应这一框架的估计匀称的价值。在论文中,作者提出了一种新的模型不可知的方法来近似 Shapely 值,称为核 SHAP(石灰+ Shapely 值)和一些特定于模型的方法,如 DeepSHAP(这是 DeepLIFT 的改编,一种估计神经网络特征重要性的方法)。除此之外,他们还表明,对于线性模型,如果我们假设特征独立,Shapely 值可以直接从模型的权重系数中近似得到。2018 年,斯科特·伦德伯格等人*【6】提出了该框架的另一个扩展,该框架可以精确计算基于树的系综的 Shapely 值,如随机森林或梯度增强。*
内核 SHAP
尽管从下面的等式来看,这并不是非常直观,但石灰也是一种附加的特征归属方法。对于附加特征解释方法,Scott Lundberg 等人表明,满足所需属性的唯一解决方案是 Shapely 值。并且该解取决于损失函数 L 、加权核πₓ和正则化项ω。
如果你还记得,当我们讨论 LIME 时,我提到过它的一个缺点是,它将核函数和核距离作为超参数,它们是使用启发式算法来选择的。内核 SHAP 消除了这种不确定性,提出了一个形状良好的内核和相应的损失函数,确保上述方程的解决方案将产生形状良好的值,并享受数学保证。
算法
- 对联合向量进行采样(联合向量是二进制值的向量,其长度与特征的数量相同,表示特定特征是否包括在联合中。 z’ ₖ ϵ {0,1}ₘ, k ϵ { 1 ,…, K } (1 =特征存在,0 =特征不存在)
- 通过使用函数 hₓ 将联合向量转换到原始样本空间,从模型中获得联合向量 z’ₖ 的预测。 hₓ 只是我们用一套变换从原始输入数据中得到相应值的一种花哨说法。例如,对于联合向量中的所有 1,我们用我们正在解释的实例中该特征的实际值来替换它。对于 0 来说,它根据应用略有不同。对于表格数据,从数据中随机抽样,用相同特征的一些其他值替换 0。对于图像数据,0 可以用参考值或零像素值代替。下图试图让表格数据的这一过程变得清晰。
- 使用 Shapely 内核计算样本的重量
- 对 K 个样本重复此操作
- 现在,拟合一个加权线性模型并返回 Shapely 值,即模型的系数。
特里 SHAP
如前所述[6],树 SHAP 是一种快速算法,它为基于决策树的模型计算精确的 Shapely 值。相比之下,核 SHAP 只是近似 Shapely 值,计算起来要昂贵得多。
算法
让我们试着直观地了解一下它是如何计算的,而不要深入研究大量的数学知识(那些倾向于数学的人,这篇论文在参考资料中有链接,尽情享受吧!).
我们将首先讨论算法如何对单棵树起作用。如果你记得关于 Shapely 值的讨论,你会记得为了精确计算,我们需要以实例的特征向量的所有子集为条件的预测。因此,假设我们试图解释的实例的特征向量是 x ,并且我们需要预期预测的特征子集是 S 。
下面是一个人工决策树,它仅使用三个特征年龄、工作时间和婚姻状况来预测收入潜力。
- 如果我们以所有特征为条件,即 S 是所有特征的集合,那么 x 所在的节点中的预测就是预期预测。即> 50k
- 如果我们不以任何特征为条件,则同样有可能(忽略点在节点间的分布)您最终会出现在任何决策节点中。因此,预期预测将是所有终端节点预测的加权平均值。在我们的例子中,有 3 个节点输出 1( <50k) and three nodes which outputs 0 (> 50k)。如果我们假设所有的训练数据点平均分布在这些节点上,在没有所有特征的情况下的预期预测是 0.5
- 如果我们以某些特性 S 为条件,我们计算出实例 x 最终可能到达的节点的期望值。例如,如果我们从集合 S 中排除marriage _ status*,实例同样有可能在节点 5 或节点 6 中结束。因此,对于这种 S 的预期预测将是节点 5 和 6 的输出的加权平均值。因此,如果我们从 S 中排除 hours_worked ,预期预测会有任何变化吗?否,因为 hours_worked 不在实例 x 的决策路径中。*
- 如果我们排除了位于树根的特征,如年龄*,它将创建多个子树。在这种情况下,它将有两棵树,一棵树从右侧的已婚区块开始,另一棵树从左侧的工作小时数开始。还有一个节点 4 的决策存根。现在实例 x 沿着两棵树向下传播(不包括具有年龄的决策路径),并且预期预测被计算为所有可能节点(节点 3、4 和 5)的加权平均值。*
现在,您已经在一个决策树中获得了所有子集的预期预测,您可以对集合中的所有树重复该操作。还记得 Shapely 值的可加性属性吗?它允许您通过计算所有树的 Shapely 值的平均值,将它们聚集在一个系综中。
但是,现在的问题是,必须为所有树中所有可能的特征子集和所有特征计算这些期望值。该论文的作者提出了一种算法,在这种算法中,我们能够同时将所有可能的特征子集推下树。这个算法相当复杂,我建议你参考参考文献中链接的论文来了解细节。
优势
- SHAP 和 Shapely 价值观享有博弈论的坚实理论基础。Shapely 值保证了预测在不同的要素之间公平分布。这可能是唯一能够经受住理论和实践检验冲击的特征归属技术,无论是学术检验还是监管检验
- SHAP 将其他可解释性技术,如 LIME 和 DeepLIFT,与博弈论的强大理论基础联系起来。
- SHAP 对基于树的模型有着极快的实现,这是机器学习中最流行的方法之一。
- 通过计算整个数据集的 Shapely 值并聚合它们,SHAP 还可用于全局解释。它在您的本地和全球解释之间提供了一个强有力的链接。如果你使用莱姆或 SHAP 进行局部解释,然后依靠 PDP 图进行全局解释,这实际上是行不通的,你可能会得出相互矛盾的结论。
实施(本地解释)
出于两个原因,我们在本节中将只关注 TreeSHAP:
- 我们在整个博客系列中查看了结构化数据,我们选择的运行可解释性技术的模型是 RandomForest,这是一个基于树的集合。
- TreeSHAP 和 KernelSHAP 在实现中有几乎相同的接口,如果你试图解释一个 SVM,或者其他一些不是基于树的模型,用 KernelSHAP 替换 TreeSHAP 应该很简单(以计算为代价)。
*import shap
# load JS visualization code to notebook
shap.initjs() explainer = shap.TreeExplainer(model = rf, model_output='margin') shap_values = explainer.shap_values(X_test)*
这些代码行计算 Shapely 值。即使算法很快,这仍然需要一些时间。
- 在分类的情况下, shap_values 将是数组的列表,并且列表的长度将等于类的数量
- explainer.expected_value 也是如此
- 因此,我们应该选择我们试图解释的标签,并在进一步的绘图中使用相应的形状值和预期值*。根据实例的预测,我们可以选择相应的 SHAP 值并绘制它们*
- 在回归的情况下,shap_values 将只返回一个项目。
现在我们来看看个别的解释。我们将接受和石灰一样的箱子。SHAP 图书馆有多种绘制个人解释的方式——力量图和决定图。两者都非常直观地理解不同的功能一起发挥,以达到预测。如果特征的数量太大,决策图在解释时会有一点优势。
*shap.force_plot( base_value=explainer.expected_value[1], shap_values=shap_values[1][row], features=X_test.iloc[row], feature_names=X_test.columns, link="identity", out_names=">50k", ) # We provide new_base_value as the cutoff probability for the classification mode
# This is done to increase the interpretability of the plot shap.decision_plot( base_value=explainer.expected_value[1], shap_values=shap_values[1][row], features=X_test.iloc[row], feature_names=X_test.columns.tolist(), link="identity", new_base_value=0.5, )*
**
Force Plot
Decision Plot
现在,我们将检查第二个示例。
解释
例 1
- 与 LIME 类似,SHAP 也认为婚姻状况、年龄、教育程度等对他有很大影响。
- 力图解释了不同的要素如何推动和拉动输出,以将其从 base_value 移动到预测。这里的预测是这个人赚到> 50k 的概率或可能性(因为这是对这个实例的预测)。
- 在原力剧情中,你可以看到的婚姻状况、学历数量等。在左侧,将预测值推至接近 1,并将 hours_per_week 推至相反方向。我们可以看到,从基值 0.24 开始,这些功能通过推和拉使输出达到 0.8
- 在决策情节中,画面更清晰一点。你有很多特征,比如职业特征和其他特征,这使得模型输出较低,但是来自年龄、职业 _ 执行-管理、教育 _ 数量和婚姻 _ 状态的强烈影响已经将指针一路移动到 0.8。
- 这些解释符合我们对这一过程的心理模型。
例 2
- 这是一个我们分类错误的案例。这里我们解释的预测是这个人赚了 5 万。
- 力图显示了双方之间的均匀匹配,但是模型最终收敛到 0.6。教育程度,工作时间,以及这个人不在执行管理职位的事实都试图增加挣 5 万英镑的可能性。
- 如果比较两个例子的决策图,这一点就更清楚了。在第二个例子中,你可以看到一个强有力的之字形模式,在这个模式中,多个强有力的影响者推动和拉动,导致与先前信念的偏差较小。
- 实施(全球解释)
SHAP 库还提供了简单的方法来聚合和绘制一组点(在我们的例子中是测试集)的 Shapely 值,以对模型进行全局解释。
解释
*#Summary Plot as a bar chart
shap.summary_plot(shap_values = shap_values[1], features = X_test, max_display=20, plot_type='bar') #Summary Plot as a dot chart
shap.summary_plot(shap_values = shap_values[1], features = X_test, max_display=20, plot_type='dot') #Dependence Plots (analogous to PDP)
# create a SHAP dependence plot to show the effect of a single feature across the whole dataset shap.dependence_plot("education_num", shap_values=shap_values[1], features=X_test) shap.dependence_plot("age", shap_values=shap_values[1], features=X_test)*
Summary Plot (Bar)
Summary Plot (Dot)
Dependence Plot — Age
Dependence Plot-Education
在二元分类中,您可以绘制两个 SHAP 值中的任意一个来解释模型。我们选择了> 50k 来解释,因为这样考虑模型更直观
- 在汇总摘要中,我们可以看到列表顶部的常见嫌疑人。
- 边注 :我们可以给 summary_plot 方法提供一个 shap_values(多类分类)列表,前提是我们给plot _ type*=‘bar’。它将以堆积条形图的形式绘制每个类别的汇总 SHAP 值。对于二进制分类,我发现这比仅仅绘制其中一个类要不直观得多。*
- 点阵图更有趣,因为它比条形图揭示了更多的信息。除了整体重要性之外,它还显示了特征值对模型输出的影响。例如,我们可以清楚地看到,当特征值较低时,婚姻状况对积极的一面(更有可能大于 50k)产生强烈的影响。从我们的标签编码中我们知道,婚姻状态= 0,意味着已婚,1 意味着单身。所以结婚会增加你赚> 50k 的机会。
- 边注 :当使用 plot_type = 'dot 时,我们不能使用 shap 值列表。你将不得不绘制多个图表来理解你所预测的每一类
- 同样,如果你看一下年龄*,你会发现当特征值较低时,它几乎总是对你赢得> 50k 的机会产生负面影响。但当特征值较高时(即你年龄较大),会出现一个混合的点包,这告诉我们在为模型做出决策时,会有很多与其他特征的交互作用。*
- 这就是 依赖图 出现的地方。这个想法与我们在上一篇博文中回顾的 PD 图非常相似。但是我们用 SHAP 值来绘制相关性,而不是部分相关性。这种解释除了细微的改动之外,仍然是相似的。
- X 轴表示要素的值,Y 轴表示 SHAP 值或其对模型输出的影响。正如您在点阵图中看到的,正面影响意味着它将模型输出推向预测方向(在我们的例子中大于 50k),负面影响意味着相反的方向。所以在年龄依赖图中,我们可以看到我们之前讨论过的相同现象,但是更清楚。当你年轻时,这种影响大多是负面的,当你年老时,这种影响是正面的。
- 《SHAP》中的依赖情节还做了另外一件事。它选择另一个与我们正在研究的特征交互最多的特征,并根据该特征的特征值给点着色。在年龄的情况下,该方法选择的是婚姻状况。我们可以看到,你在年龄轴上发现的大部分离差是由婚姻状况解释的。
- 如果我们看看教育的依赖图(这是一个有序的特征),我们可以看到教育程度越高,你挣得越多的预期趋势。
- 群里的小丑
和往常一样,为了有效地使用这种技术,我们应该意识到它的缺点。如果你一直在寻找解释的完美技巧,很抱歉让你失望了。生活中没有什么是完美的。所以,我们来深入探讨一下缺点。
计算密集型。TreeSHAP 在一定程度上解决了这个问题,但与我们讨论的大多数其他技术相比,它仍然很慢。KernelSHAP 速度很慢,对于大型数据集的计算变得不可行。(虽然有一些技术,如在计算 Shapely 值之前使用 K-means 聚类来减少数据集,但它们仍然很慢)
- SHAP 价值观可能会被曲解,因为它不是最直观的想法。它代表的不是预测中的实际差异,而是实际预测和平均预测之间的差异,这是一个微妙的细微差别。
- SHAP 和 T4 不会像莱姆一样创造稀疏的解释。人类更喜欢稀疏的解释,这些解释很好地符合心智模型。但是增加一个像 LIME 那样的正则化项并不能保证匀称的值。
- KernelSHAP 忽略特性依赖。就像排列重要性、LIME 或任何其他基于排列的方法一样,KernelSHAP 在试图解释模型时会考虑“不太可能”的样本。
- 额外收获:文本和图像
我们讨论的一些技术也适用于文本和图像数据。虽然我们不会深入探讨,但我会链接到一些笔记本,告诉你如何做。
图像分类上的石灰— INCEPTION_V3 — KERAS
渐变讲解者—SHAP—IMAGENET 中 VGG16 的中间层
最后的话
我们已经到达了可解释世界旅程的终点。可解释性和可解释性是商业采用机器学习(包括深度学习)的催化剂,我们从业者有责任确保这些方面得到合理有效的解决。人类盲目信任机器还需要很长一段时间,在那之前,我们将不得不用某种可解释性来取代出色的表现,以培养信任。
如果这一系列的博客文章能让你回答至少一个关于你的模型的问题,我认为我的努力是成功的。
我的 Github 中有完整的代码
博客系列
- 第二部分
- 第三部分
- 参考
Christoph Molnar,“可解释的机器学习:使黑盒模型可解释的指南”
- 马尔科·图利奥·里贝罗,萨米尔·辛格,卡洛斯·盖斯特林,“我为什么要相信你?:解释任何分类器的预测”,arXiv:1602.04938【cs。LG]
- 《n 人游戏的价值》对博弈论的贡献 2.28(1953):307–317
- trumbelj,e .,& Kononenko,I. (2013 年)。用特征贡献解释预测模型和个体预测。知识和信息系统,41 ,647–665。
- 斯科特·m·伦德伯格和李秀英。“解释模型预测的统一方法。”神经信息处理系统的进展。2017.
- Lundberg,Scott M .,Gabriel G. Erion,和 Su-In Lee。"树集合的一致个性化特征属性"arXiv 预印本 arXiv:1802.03888 (2018)。
- 原载于 2019 年 11 月 24 日 http://deep-and-shallow.com的* 。*
Originally published at http://deep-and-shallow.com on November 24, 2019.
可解释的人工智能或我如何学会停止担心和信任人工智能
内部 AI
构建健壮、公正的人工智能应用的技术
公众信任是人工智能被有效使用的重要条件。— 马克·沃尔波特爵士
[source]
仅在过去五年中,人工智能研究人员就在诸如图像识别、自然语言理解和棋盘游戏等领域取得了重大突破!随着公司考虑将医疗保健和金融等行业的关键决策交给人工智能,缺乏对复杂机器学习模型的理解将带来巨大问题。这种缺乏理解可能会导致模型传播偏见,我们已经在刑事司法、政治、零售、面部识别和语言理解中看到了不少这样的例子。
Kate Crawford on the Trouble with Bias at NeurIPS 2017
所有这些都对信任产生不利影响,从我的经验来看,这是公司抵制在整个企业中部署人工智能的主要原因之一。解释或诠释人工智能是一个热门的研究话题,因为现代机器学习算法是黑箱没有人真正理解它们是如何工作的。此外,现在有欧盟的规定来解释人工智能在 GDPR 的“解释权”。在这篇博文中,我将介绍一些技术,您可以将这些技术添加到您的数据科学武库中,以提高对模型的理解。
团队数据科学流程
但是首先,你按照什么过程来构建和部署一个人工智能应用程序?在微软,我们遵循一种称为团队数据科学过程 (TDSP)的敏捷迭代方法,这种方法从像 CRISP-DM 和 KDD 这样的过程中获得灵感。在这篇文章中,我将详细介绍这个过程的建模和部署阶段。
Zooming into Modeling and Deployment in TDSP
开发模型时,第一步是学习。您训练一个模型来从历史数据中检测模式,这需要经历多次迭代的训练和验证来挑选最佳模型。一旦你有了一个学习过的模型,下一步就是测试。这意味着在模型之前没有见过的盲数据集上评估模型。我写了一篇关于度量模型良好性的博文,你可以应用这些技术来量化商业价值,并与商业利益相关者分享。在证明商业价值之后,下一个逻辑步骤通常是将模型部署到生产中。部署后,一个非常常见的问题是模型不能按预期执行。这有两个主要原因:
- 数据/概念漂移 :当数据的分布随时间发生变化,或者用于训练模型的历史数据有偏差且不代表实际生产数据时,就会发生这种情况。
Data Leakage Example — KDD Cup 2008 [source]
- 数据泄露 :当训练和验证数据中的特征或属性无意中泄露了在推理时不会出现的信息时,就会发生这种情况。这方面的一个经典例子是 2008 年的 KDD 竞赛,关于早期乳腺癌检测,其中一个特征(患者 ID)被发现与目标类别高度相关。
在野外部署模型之前,我们可以通过引入一个额外的步骤让模型理解来规避这些问题。通过解释该模型,我们可以获得更深入的理解,并解决偏差、泄漏和信任等问题。
但是,什么是可解释性?
可解释性是人类可以持续估计模型将预测什么的程度,人类可以理解和遵循模型预测的程度,以及人类可以检测模型何时犯了错误的程度。
尽管可解释性对不同的人有不同的含义:
- 对于一个数据科学家,这意味着更好地理解模型,看到模型做得好或不好的案例以及原因。这种理解有助于数据科学家构建更可靠的模型。
- 对于一个商业利益相关者来说,这意味着更深入地理解为什么一个人工智能系统会做出一个特定的决定,以确保公平并保护其用户和品牌。
- 对于一个用户,这意味着理解为什么一个模型做出一个决定,并且如果模型犯了一个错误,允许有意义的挑战。
- 对于一个专家或监管者来说,这意味着审计人工智能系统并遵循决策轨迹,尤其是当事情出错时。
当你谈论可解释性和模型理解时,留意这些不同的人物角色是很重要的。
模型透明度
Model Complexity
模型的可解释性可通过学习的响应函数对输入特征的复杂程度来表征。上图显示了三种不同类型的响应函数:
- 线性、单调:这些是最容易解释的函数,因为输入特征的变化会导致目标变量在单一方向上成比例的变化(正或负)。这允许我们计算相对特征重要性度量和原因代码。原因代码有助于理解学习模型预测特定输入的高值或低值的原因。它为我们提供了输入特征的预测影响的定性度量,即它是强的、弱的、积极的还是消极的。
- 非线性,单调:机器学习算法学习到的大多数响应函数都是非线性的。单调性确保输入特征的相对变化导致目标变量在单一方向上的变化。非线性单调函数也是可解释的,因为它允许我们计算相对特征重要性度量和原因代码。
- 非线性、非单调:这些是现代机器学习算法学习到的最常见的函数,也是最难解释的。这是因为输入变量的变化会导致目标变量在任何方向上以不同的速率变化。对于这样的函数,我们可以计算的唯一可解释的度量是相对特征重要性。解释这些函数是本文的重点。
超越特性重要性
Feature Importance
现在让我们看一个具体的例子。问题是预测美国高中生的数学、阅读和写作成绩。我们得到了的历史数据,其中包括性别、种族/民族(匿名)、父母教育水平、学生是否吃了标准/免费/补贴午餐以及考试准备程度等特征。给定这些数据,我训练了一个多类随机森林模型[ 源代码 ]。
为了解释模型学到了什么,最简单的方法之一是查看相对的特性重要性。特征重要性衡量给定特征对预测结果的影响有多大。从上面的图表中,看起来两个最重要的特征是——父母的教育水平和种族/民族。这是有用的信息,但它没有告诉我们任何关于不同教育水平如何影响成绩以及种族和教育如何相互作用的信息。
回车,部分依赖图(PDP)!
PDP 向我们展示了特性对预测结果的边际效应。在 Python 中,您可以使用 scikit-learn 中的实现,它将您限制在梯度推进回归器/分类器。更好的实现是由江春·李开发的 PDPBox 。该库受 ICEBox 的启发,ice box 是 R 的 PDP 实现,支持所有 scikit-learn 机器学习模型。您可以按如下方式安装该库。
pip install pdpbox
Partial Dependency Plots for Parent Level of Education in predicting Math Grades A and F
现在让我们来看看 PDP 的运行情况。上图显示了不同教育水平对数学成绩 A 和 F 的影响。当你在 x 轴上从左到右,父母的教育水平增加,从高中一直到硕士学位。你会注意到,随着父母教育水平的提高,对预测 A 级的影响也在增加。F 级也有类似的下降趋势,即父母受教育程度越高,对 F 级的预测影响越小。该分析表明,父母受教育程度是一个有效特征。您可以使用下面的代码片段在 Python 中生成上面的图。
from pdpbox import pdppdp_parent = pdp.pdp_isolate(model=math_model, dataset=df, model_feature=features, feature='parent')
Interaction between Parent Level of Education and Ethnicity in predicting Math Grade A
现在让我们看看预测数学 A 级的特征交互。我在这里挑选了两个最重要的特征。父母的教育水平在 y 轴上,从下到上,教育水平会增加。学生的匿名种族或民族显示在 x 轴上,其中不同的点代表不同的种族-在这项研究中有 5 个不同的群体。请注意热图中的颜色,紫色/蓝色代表预测 A 级的低影响,绿色/黄色代表高影响。
在 0 组上边缘化,你可以看到随着父母教育水平的提高,对预测 A 级的影响也增加。这是有道理的,因为它表明教育水平比种族对成绩的影响更大。因此,该模型很好地学习了这种相关性。但是第五组是怎么回事呢?看起来不管教育水平如何,如果学生属于第 5 组,那么这对于预测 a 级有很大的影响。这在我看来很可疑,它暴露了—
- 可能存在采样偏差的数据问题,
- 模型有问题,和/或
- 社会中的系统性问题
事实证明,这里使用的 Kaggle 数据集是人为的,第 5 组没有得到正确的表示。不管怎样,主要的一点是,仅仅从特性的重要性来看,这些见解都是不可能的。上面的交互图可以用 Python 生成,如下所示。
from pdpbox import pdppdp_race_parent = pdp.pdp_interact(model=math_model, dataset=df, model_features=features, features=['race', 'parent'])
决策树侧边栏
Simple Decision Tree
我想揭穿一个关于决策树的常见误解——它们非常容易解释。让我们再来看一个具体的例子——鸢尾花数据集。问题是基于 4 个特征来预测给定的鸢尾花是刚毛鸢尾、杂色鸢尾还是海滨鸢尾——花瓣长度和宽度,以及萼片长度和宽度。我已经为这个分类任务训练了一个简单的决策树[ 源代码,你可以很容易地在 scikit-learn 中可视化训练好的模型,如上所示。当你沿着树的不同分支往下走时,你可以看到特征是如何影响模型的决策的,这对于一个外行来说是非常容易理解的。
现在让我们来看一个稍微有挑战性的问题。一家医院希望使用人工智能系统来早期检测乳腺癌。这是一个模型理解至关重要的例子,因为这是一个生死攸关的情况。在数据集中,我们被赋予了 30 种不同的特征。我再次为这个二元分类任务训练了一个简单的决策树[ 源代码。从下面的可视化图中,您可以看到随着特征数量的增加,决策树的复杂性也在增加,并且变得更加难以解释。
Complex Decision Tree
你可能会说,我们可以通过降维来减少特征空间的大小,这是完全正确的。但是你必须明白,你在这里是有所取舍的——你是在用准确性换取简单性。这可能不是正确的策略,尤其是对于这样一个关键的决定。因此,决策树不是解决可解释性问题的灵丹妙药。
事后解释
LIME: Local Interpretable Model-agnostic Explanations
让我们回到乳腺癌检测问题。由于准确性对于这样一个关键任务非常重要,如果我们训练一个更复杂的树集合(如随机森林或梯度增强树)甚至一个黑盒神经网络会怎么样?我们如何解释如此复杂的模型?
假设您训练的复杂模型学习了如上所示的决策函数,以将恶性细胞(红色)与良性细胞(蓝色)分开。解释这个复杂模型的一种方法是选择一个您想要解释的实例。然后训练一个简单的线性模型,该模型近似于该实例周围的复杂模型。这意味着我们用更简单的模型来解释一个实例,通过观察它周围的相似案例。因此,习得的表征是局部忠实的,而不是全局忠实的。这种事后解释技术被称为 LIME,它代表局部可解释的模型不可知解释。它是在 2016 年被提出的,此后获得了大量的人气(截至 2019 年 3 月 5 日, Github 上有 5343 位明星)。
Illustration of Surrogate Models
现在让我们换个角度来看一下。我们已经获得了想要分类的不同乳腺癌细胞的数据,在框图中表示为 x 。我们正在训练一个模型,它学习一个复杂的函数 f 来区分良性病例和恶性病例。然后,我们训练一个简单的线性代理模型 g ,它通过近似该点周围的复杂函数来解释一个实例x’。由那个更简单的模型学习到的参数就是解释。这在数学上显示如下。
Additive Feature Attribution Method
在上面的等式中,x’_i 是一个二元变量,用于对所选实例周围的实例进行采样,M 表示简化输入要素的数量。因此,LIME 是一种附加的特征归属方法。
Scott M. Lundberg 等人在 NeurIPS 2017 上提出了一个框架,该框架统一了包括 LIME 在内的各种附加特征归属方法。在本文中,SHAP(代表 SHapley 加法解释)值被用作特征重要性的统一度量。2017 年发布了 SHAP 的 Python 实现,统一了 LIME 和其他技术,如 DeepLIFT 和树解释器。该库自发布以来也越来越受欢迎(截至 2019 年 3 月 3 日, Github 上有 3909 颗星星)。您可以按如下方式安装 SHAP。
pip install shap
现在,对于乳腺癌检测问题,我已经训练了一个随机森林分类器[ 源代码 ],在坚持测试集上获得了 100%的平均精度——参见下面的 PR 曲线。
Precision-Recall Curve for Random Forest Breast Cancer Classifier
为了解释这个模型,我选择了一个恶性案例来运行 SHAP 树解释器。该模型预测该病例为恶性的概率为 0.9。该数据集中恶性肿瘤的基本比率为 0.6251。SHAP 提供的解释如下所示——红色代表积极影响,蓝色代表消极影响。您可以看到不同的特征值如何将基本预测推高到 90%的确定性。正面影响最大的要素是-最差面积、最差凹点和平均凹点。
SHAP Explanation for Malignant Case
对于良性情况也可以得到类似的解释。我挑选了一个良性细胞,该模型以 100%的确定性预测了该细胞,即它是恶性的可能性为 0%。从下面的解释可以看出,各种特征值是如何将恶性肿瘤的基本概率从 0.6251 降低到 0 的。负面影响最大的要素是-最差凹点、平均周长和最差半径。这个解释很棒,因为它让我们对模型如何得出最终预测有了更深刻的理解。
SHAP Explanation for Benign Case
上面的解释可以使用下面的代码片段生成——完整的源代码可以在这里找到。
import shapshap.initjson();explainer = shap.TreeExplainer(rf_model)
shap_values = explainer.shap_values(X_test)# Explanation for malignant case
shap.force_plot(explainer.expected_value[1], shap_values[1][0,:], X_test.iloc[0,:])# Explanation for benign case
shap.force_plot(explainer.expected_value[1], shap_values[1][1,:], X_test.iloc[1,:])
您还可以使用 SHAP 来显示每个要素在预测目标类时的平均影响。这由下面左边的图显示。你可以看到两个最重要的特征是——最差凹点和平均凹点。右边的图显示了这两个特征在预测恶性分类中的相互作用。
Left: SHAP Value Summary Plot for all Features | Right: SHAP interaction between the two most important features
SHAP 也可以用来解释黑盒深度学习模型。下面是 SHAP 解释在 MNIST 数据集上训练的卷积神经网络的例子。SHAP 的 DeepLIFT 实现被用来解释这些预测。红色像素表示对预测数字有很大影响。有趣的是,DeepExplainer 模型发现了一些很好的解释——例如,数字 0 的中间是空白的,数字 4 的两条垂直线之间没有连接。在 SHAP 资料馆还有更多很酷的例子。
SHAP DeepLift Explainer for Convolutional Neural Networks
MOAR 工具!
在本文中,我仅仅触及了皮毛,您还可以应用更多的可解释性技术,例如:
- 使用 RNN 语言模型生成文本解释
- 使用显著图来解释模型关注的是什么
- 使用表征学习和定性可视化技术,如 t-SNE
我在这个 Github 页面上添加了很多资源供进一步阅读。
透明度挑战
我想以一个警告作为结束。在由艾德里安·韦勒撰写的一篇有趣的论文中,他认为人工智能的透明性应该是达到目标的一种手段,而不是目标本身。韦勒博士利用多智能体博弈论来表明,更高的透明度可能导致对所有人不利的全球结果,并可能使人工智能受到恶意行为者的滥用。不言而喻,人工智能系统必须是安全的,能够抵御恶意攻击。这也是另一个活跃的研究领域,值得单独发表一篇博文!
感谢您花时间阅读本文。希望你喜欢。
更新[2020 年 11 月 4 日]:我和 Manning Publications 写了一本关于可解释人工智能的书,里面有更多的可解释技术,你可以把它们添加到你的武器库中。
可解释卷积神经网络
这篇论文 由美国加州大学洛杉机分校的张全世、吴英年和宋提出了一种将传统的卷积神经网络(CNN)修改为可解释的 CNN 的方法,以阐明 CNN 的高 conv 层中的知识表示。
Figure 1: Comparison of a filter’s feature maps in an interpretable CNN and those in a traditional CNN
问题:在没有任何额外的人工监督的情况下,我们能修改 CNN 以在其 conv 层获得可解释的知识表示吗?
Bau et al .【1】在 CNN 中定义了六种语义,即物体、零件、场景、纹理、材质、颜色。
实际上,我们可以大致将前两种语义认为是具有特定形状的对象-部分模式,将后四种语义概括为**没有清晰轮廓的纹理模式。**低 conv 层中的过滤器通常描述简单的纹理,而高 conv 层中的过滤器更可能表示对象部分。
他们的方法是在一个高 conv 层中训练每个滤波器来表示一个对象部分。在传统的 CNN 中,高层过滤器可以描述一个混合模式,即过滤器可以被猫的头部和腿部激活(图 1)。高 conv 层中的这种复杂表示大大降低了网络的可解释性。因此,他们的方法 迫使 可解释 CNN 中的滤波器被某个部分激活。
学习更好的表达方式
本文发明了一种通用损失来正则化滤波器的表示,以提高其可解释性。
该损失促使类别间激活的低熵和神经激活的空间分布的低熵,这意味着迫使 CNN 中层的特征图不被对象的不同区域随机激活,并且具有一致的激活分布。
滤镜必须由对象的单个部分激活,而不是重复出现在不同的对象区域。
他们假设不同区域上的重复形状更倾向于描述低级纹理(例如颜色和边缘),而不是高级部分。
如何做到这一点?
Figure 3
Figure 4
- 设 I 表示一组训练图像,其中 I_c ⊂ I 表示属于类别 c 的子集,( c = 1,2,.。。,C)。
- 在 ReLU 操作后,给滤波器 f 的特征图 x 增加一个损耗
- 特征图 x 是一个 n × n 矩阵, x_ij ≥ 0。
- f 对应的对象部分可能出现在不同图像的不同位置,为 f {T_ 1,…,T_ n } 设计 n 模板
- 每个模板 T_ i 也是一个 n × n 矩阵,它描述了当目标零件主要触发 x 中的 i-th 单元时,特征图 x 的激活的理想分布
- = argmax_[i,j] x_ij
- x^masked = max{x . T_,0}*
在他们的代码实现中,实际上他们在特征图中寻找最大值(有 2 种方法,但最简单的是最大值),然后创建一个类似高斯形状的掩码(如图 3)与特征图具有相同的形状(例如,特征图的大小为 6x6,然后模板掩码的大小为 6x6),然后与掩码执行元素乘法,并产生一个新的掩码特征图(图 4)。如果特征映射中的最大值为 0,则该模板被视为负模板,这意味着该过滤器不会为该对象激活。
注释
1.要素地图=图层中的过滤器。
2。本文中的训练数据每幅图像只包含一个零件/对象,如果有两个相同的对象,训练可能会失败?或者两个相同的对象可能有一点不同,因此被两个滤波器激活。
损失函数
我太年轻了,无法解释这个,只能说说我对损失函数的理解。请阅读原文,了解这些方程的更多细节。
Equation 1: the loss for f as the mutual information between X and T. The prior probability of a template is given as p(Tµ) = α n2 , p(T −) = 1 − α, where α is a constant prior likelihood.
Equation 2: The fitness between a feature map x and a template T is measured as the conditional likelihood p(x|T).
Equation 3: each filter in an interpretable conv-layer receives gradients w.r.t. its feature map x from both the final task loss L(ˆyk, y∗ k) and the local filter loss Lossf
Equation 4: compute gradients of Lossf w.r.t. each element xij of feature map x as follows
Equation 5: rewrite Equation 1, H(T) = − P T ∈T p(T) log p(T) is a constant, which denotes the prior entropy of part templates.
Equation 6: Low inter-category entropy
Equation 7: Low spatial entropy
TLDR: 所有这些方程对我来说仍然是清晰的,就我的理解而言,损失函数推动过滤器 f 来表示类别 c 的特定对象部分,并对 CNN 中的其他类别的图像和层的特征图保持沉默,以不被对象的不同区域随机激活,并具有一致的激活分布。
实验设置
为了简单起见,VGG
**三个基准数据集:**因为他们需要物体地标(部分)的地面实况注释来评估每个过滤器的语义清晰度,所以他们选择了三个带有地标/部分注释的基准数据集来进行训练和测试,包括 ILSVRC 2013 DET 动物部分数据集、cub 200–2011 数据集和 Pascal VOC 部分数据库。
实验结果
他们在零件可解释性和位置稳定性上取得了较好的成绩。普通 CNN 在单类别分类中表现更好。然而,对于多类别分类,可解释 CNN 表现出比普通 CNN更好的性能。在多类别分类中的良好表现可能是因为早期阶段的过滤器语义的澄清降低了后期阶段过滤器学习的难度。更多结果,请阅读原文。
The top four rows visualize filters in interpretable CNNs, and the bottom two rows correspond to filters in ordinary CNNs. They found that interpretable CNNs usually encoded head patterns of animals in its top conv-layer for classification.
与普通 CNN 相比,可解释 CNN 具有更一致和更容易理解的激活。我们可以确认顶部 conv 层中的特定滤镜代表特定动物的头部图案。
结论
- 提出了一种通用的方法来修改传统的细胞神经网络,以增强其可解释性
- 损失被设计成将高 conv 层中的过滤器推向对象部分的表示,而没有用于监督的附加注释
- 与传统的 CNN 相比,可解释的 CNN 在高 conv 层编码了更多语义上有意义的知识。
参考
代号:https://github.com/zqs1022/interpretableCNN
可解释的机器学习
从任何机器学习模型中提取人类可理解的见解
是时候摆脱黑箱,培养对机器学习的信任了
在他的书’ 可解释的机器学习 '中, Christoph Molnar 通过这个例子很好地概括了 ML 可解释性的本质:假设你是一名数据科学家,在你的空闲时间里,你试图根据你的脸书和推特数据预测你的朋友夏天会去哪里度假。现在,如果预言被证明是准确的,你的朋友可能会留下深刻印象,并认为你是一个能预见未来的魔术师。如果预测是错误的,它仍然不会给任何人带来伤害,除了你作为“数据科学家”的名声。现在,让我们说这不是一个有趣的项目,有投资参与。比方说,你想投资你的朋友可能去度假的房产。如果模型的预测出错,会发生什么?你会赔钱的。只要模型没有重大影响,它的可解释性就没那么重要,但当基于模型的预测有影响时,无论是金融还是社会影响,可解释性就变得重要了。
可解释的机器学习
解释的意思是用可理解的术语解释或陈述。在人工智能系统的背景下,可解释性是用可理解的术语解释或呈现给人类的能力
机器学习模型被许多人贴上了“黑箱”的标签。这意味着,尽管我们可以从中获得准确的预测,但我们无法清楚地解释或识别这些预测背后的逻辑。但是我们如何从模型中提取重要的见解呢?要记住什么,我们需要什么特性或工具来实现它?当提出模型可解释性的问题时,这些是浮现在脑海中的重要问题。
可解释性的重要性
一些人经常问的问题是,为什么我们不仅仅满足于模型的结果,为什么我们如此执着于了解为什么会做出一个特定的决定?这很大程度上与模型在现实世界中可能产生的影响有关。因为仅仅是用来推荐电影的模型远不如那些用来预测药物效果的模型有影响力。
问题在于,单一指标(如分类准确率)无法完整描述大多数现实任务(多希-维勒兹和金 2017 )
这是一个可解释的机器学习的大图。在某种程度上,我们通过收集原始数据来捕捉世界,并使用这些数据来进行进一步的预测。本质上,可解释性只是模型的另一层,帮助人类理解过程。
The big picture of explainable machine learning.
可解释性带来的一些好处是:
- 可靠性
- 调试
- 通知特征工程
- 指导未来的数据收集
- 通知人类决策
- 建立信任
模型解释技术
理论只有在我们能付诸实践时才有意义。如果你想真正掌握这个话题,你可以试试 Kaggle 的机器学习可解释性速成班。它有适当数量的理论和代码来将概念放入透视图中,并帮助将模型可解释性概念应用到实际的、真实世界的问题中。
点击下方截图,直接进入课程页面。如果你想先对内容有一个简要的概述,你可以继续往下读。
可以从模型中提取的见解
为了解释模型,我们需要以下见解:
- 模型中的特性是最重要的。
- 对于模型中的任何单个预测,数据中的每个特征对该特定预测的影响。
- 每个特征对大量可能预测的影响
让我们讨论一些有助于从模型中提取上述见解的技术:
1.排列重要性
一个模特认为什么特征是重要的?哪些功能可能比其他功能对模型预测的影响更大?这个概念被称为特征重要性,而排列重要性是一种广泛用于计算特征重要性的技术。这有助于我们看到我们的模型何时产生违反直觉的结果,也有助于向其他人展示我们的模型何时如我们所愿地工作。
排列重要性适用于许多 scikit-learn 估计器。这个想法很简单:随机置换或打乱验证数据集中的单个列,而保持所有其他列不变。如果模型的精度下降很多并导致误差增加,则特征被认为是“重要的”。另一方面,如果改变一个特征的值不会影响模型的准确性,那么这个特征就被认为是“不重要的”。
工作
考虑一个基于某些参数预测足球队是否会有“足球先生”赢家的模型。表现最好的玩家被授予这个称号。
排列重要性是在模型拟合后计算的。因此,让我们在训练数据上训练并拟合一个 RandomForestClassifier 模型,表示为 my_model 。
使用 ELI5 库计算排列重要性。 ELI5 是一个 Python 库,允许使用统一的 API 可视化和调试各种机器学习模型。它内置了对几种 ML 框架的支持,并提供了一种解释黑盒模型的方法。
使用 eli5 库计算和显示重要性:
(此处val_X,val_y
分别表示验证集)
import eli5
from eli5.sklearn import PermutationImportanceperm = PermutationImportance(my_model, random_state=1).fit(val_X, val_y)
eli5.show_weights(perm, feature_names = val_X.columns.tolist())
释义
- 顶部的特性最重要,底部的最不重要。对于这个例子,进球得分是最重要的特征。
- 后面的数字表示从一次重组到下一次重组的绩效变化。
- 有些权重是负数。这是因为在那些情况下,对混洗数据的预测被发现比真实数据更准确。
练习
现在,为了获得完整的示例并测试您的理解,请点击下面的链接进入 Kaggle 页面:
2.部分相关图
部分相关性图(短 PDP 或 PD 图)显示了一个或两个特征对机器学习模型的预测结果的边际效应( J. H. Friedman 2001 )。PDP 显示一个特性如何影响预测。PDP 可以通过 1D 或 2D 图显示目标和所选特征之间的关系。
工作
PDPs 也是在模型拟合后计算的。在我们上面讨论的足球问题中,有许多特征,如传球、射门、进球等。我们从考虑单行开始。假设这一行代表一支 50%时间有球、传球 100 次、射门 10 次、进球 1 次的球队。
我们继续拟合我们的模型,并计算一个球队有一名球员赢得“最佳球员”的概率,这是我们的目标变量。接下来,我们将选择一个变量并不断改变它的值。例如,如果球队进了 1 个球、2 个球、3 个球等等,我们将计算结果。所有这些值都被绘制出来,我们得到了一个预测结果与得分的图表。
用于绘制 PDP 的库被称为 python 部分依赖绘图工具箱或简称为 PDPbox 。
from matplotlib import pyplot as plt
from pdpbox import pdp, get_dataset, info_plots*# Create the data that we will plot*
pdp_goals = pdp.pdp_isolate(model=my_model, dataset=val_X, model_features=feature_names, feature='Goal Scored')*# plot it*
pdp.pdp_plot(pdp_goals, 'Goal Scored')
plt.show()
解读
- Y 轴表示预测值相对于基线值或最左侧值的变化。
- 蓝色区域表示置信区间
- 对于“进球得分”图表,我们观察到进球得分增加了获得“本场最佳”奖的可能性,但过了一会儿就饱和了。
我们也可以使用 2D 部分图同时显示两个特征的部分相关性。
练习
3.SHAP 价值观
SHAP 代表着Shapley****Aadditive exP解释有助于分解预测,以显示每个特征的影响。它基于 Shapley 值,这是一种在博弈论中使用的技术,用于确定合作游戏中的每个玩家对其成功做出了多少贡献。通常情况下,在准确性和可解释性之间取得平衡可能是一个困难的平衡行为,但 SHAP 价值观可以同时实现这两者。
工作
再一次,以足球为例,我们想要预测一个球队有一名球员赢得“比赛最佳球员”的概率。SHAP 值解释了给定特征具有某个值与如果该特征具有某个基线值时我们所做的预测相比的影响。
SHAP 值是使用 Shap 库计算的,该库可以很容易地从 PyPI 或 conda 安装。
Shap 值显示给定特征改变我们预测的程度(与我们在该特征的某个基线值进行预测相比)。假设我们想知道当球队进了 3 个球而不是某个固定的基线数字时,预测是什么。如果我们能够回答这个问题,我们可以对其他特征执行相同的步骤,如下所示:
sum(SHAP values for all features) = pred_for_team - pred_for_baseline_values
因此,预测可以分解成如下图:
Here is a link for a larger view
释义
上面的解释显示了将模型输出从基础值(我们传递的训练数据集的平均模型输出)推送到模型输出的每个功能。将预测值推高的要素显示为红色,将预测值推低的要素显示为蓝色
- 这里的 base_value 是 0.4979,而我们的预测值是 0.7。
Goal Scored
= 2 对增加预测的影响最大,而ball possession
该特征在降低预测方面具有最大的效果。
练习
SHAP 价值观有比我在这里解释的更深层次的理论。请务必通过下面的链接获得完整的理解。
4.SHAP 价值观的高级应用
聚合许多 SHAP 值可以提供对模型更详细的了解。
- SHAP 概要剧情
为了了解哪些特征对模型最重要,我们可以绘制每个样本的每个特征的 SHAP 值。汇总图显示了哪些要素最重要,以及它们对数据集的影响范围。
Summary Plot
对于每个点:
- 垂直位置显示了它所描绘的特征
- 颜色显示该特征对于数据集的该行是高还是低
- 水平位置显示该值的影响是否会导致更高或更低的预测。
左上角的点是一支进球很少的球队,将预测值降低了 0.25。
- SHAP 依赖贡献图
SHAP 汇总图给出了每个特征的总体概述,而 SHAP 依赖图显示了模型输出如何随特征值而变化。SHAP 依赖贡献图为 PDP 提供了类似的见解,但它们添加了更多的细节。
Dependence Contribution plots
上面的依赖贡献图表明,有球增加了球队让他们的球员赢得奖项的机会。但是如果他们只进了一个球,这种趋势就会逆转,裁判可能会因为他们得了那么多球而处罚他们。
实践
结论
机器学习不必再是黑匣子了。如果我们不能向他人解释结果,那么好的模型有什么用呢?可解释性和创建模型一样重要。为了在人群中获得更广泛的接受,机器学习系统能够为他们的决定提供令人满意的解释是至关重要的。正如阿尔伯特·爱因斯坦所说,“如果你不能简单地解释它,你就理解得不够好”。
参考资料:
[可解释的机器学习:使黑盒模型可解释的指南。克里斯托夫·莫尔纳尔](http://Christoph Molnar)
机器学习可解释性微课:Kaggle