每个程序员都应该知道的 40 个算法(四)(3)

简介: 每个程序员都应该知道的 40 个算法(四)

每个程序员都应该知道的 40 个算法(四)(2)https://developer.aliyun.com/article/1506367

第十四章:实际考虑

本书中介绍的一堆算法可以用于解决现实世界问题。本章是关于本书中介绍的算法的一些实际考虑。

本章的组织如下。我们将从介绍开始。然后,我们将介绍算法可解释性的重要主题,即算法内部机制能否以可理解的方式解释的程度。接下来,我们将介绍使用算法的道德和在实施时可能产生偏见的可能性。然后讨论处理 NP 难问题的技术。最后,我们将探讨在选择算法之前应考虑的因素。

在本章结束时,您将了解在使用算法时需要牢记的实际考虑。

在本章中,我们将涵盖以下主题:

  • 介绍实际考虑
  • 算法的可解释性
  • 理解伦理和算法
  • 减少模型中的偏见
  • 解决 NP 难问题
  • 何时使用算法

让我们从介绍开始,

介绍实际考虑

除了设计、开发和测试算法外,在许多情况下,考虑开始依赖机器解决现实世界问题的某些实际方面也很重要,因为这会使解决方案更有用。对于某些算法,我们可能需要考虑可靠地整合预计会在部署算法后继续变化的新重要信息的方法。整合这些新信息会以任何方式改变我们经过良好测试的算法的质量吗?如果是,我们的设计如何处理?然后,对于一些使用全局模式的算法,我们可能需要关注捕捉全球地缘政治局势变化的实时参数。此外,在某些用例中,我们可能需要考虑在使用时强制执行的监管政策,以使解决方案有用。

当我们使用算法解决现实世界问题时,我们在某种程度上依赖机器进行问题解决。即使是最复杂的算法也是基于简化和假设的,并且无法处理意外情况。我们甚至还远远没有完全将关键决策交给我们设计的算法。

例如,谷歌设计的推荐引擎算法最近面临欧盟的监管限制,原因是隐私问题。这些算法可能是其领域中最先进的。但如果被禁止,这些算法实际上可能会变得无用,因为它们无法用于解决它们本应解决的问题。

事实上,不幸的是,算法的实际考虑仍然是在初始设计阶段通常不考虑的事后想法。对于许多用例来说,一旦算法部署并且提供解决方案的短期激动感过去后,使用算法的实际方面和影响将随着时间的推移被发现,并将定义项目的成功或失败。

让我们看一个实际例子,其中不注意实际考虑导致了一家世界顶尖 IT 公司设计的备受关注的项目失败。

一个 AI Twitter 机器人的悲伤故事

让我们来看看 Tay 的经典例子,它是微软于 2016 年创建的第一个 AI Twitter 机器人。由 AI 算法操作,Tay 应该从环境中学习并不断改进自己。不幸的是,在网络空间生活了几天后,Tay 开始从不断发出的种族主义和粗鲁的推文中学习。它很快开始发表冒犯性的推文。尽管它表现出了智能,并迅速学会根据实时事件创建定制推文,但同时,它严重冒犯了人们。微软将其下线并尝试重新调整,但没有成功。微软最终不得不终止该项目。这是一个雄心勃勃的项目的悲伤结局。

请注意,尽管微软内置的智能令人印象深刻,但该公司忽视了部署自学习 Twitter 机器人的实际影响。NLP 和机器学习算法可能是最好的,但由于明显的缺陷,这实际上是一个无用的项目。如今,Tay 已成为忽视允许算法在飞行中学习的实际影响而导致失败的典型案例。Tay 的失败所带来的教训肯定影响了后来几年的 AI 项目。数据科学家也开始更加关注算法的透明度。这将引出下一个主题,探讨使算法透明的需求和方法。

算法的可解释性

黑匣子算法是指其逻辑由于复杂性或逻辑以混乱的方式表示而无法被人类解释的算法。另一方面,白匣子算法是指其逻辑对人类可见和可理解的算法。换句话说,可解释性帮助人类大脑理解算法为何给出特定结果。可解释性的程度是特定算法对人类大脑可理解的程度。许多类别的算法,特别是与机器学习相关的算法,被归类为黑匣子。如果算法用于关键决策,了解算法产生结果的原因可能很重要。将黑匣子算法转换为白匣子算法还可以更好地了解模型的内部工作。可解释的算法将指导医生哪些特征实际上被用来将患者分类为患病或非患病。如果医生对结果有任何疑问,他们可以回头检查这些特定特征的准确性。

机器学习算法和可解释性

算法的可解释性对于机器学习算法非常重要。在许多机器学习应用中,用户被要求相信模型能帮助他们做出决策。在这种情况下,可解释性在需要时提供透明度。

让我们深入研究一个具体的例子。假设我们想使用机器学习来预测波士顿地区房屋价格,基于它们的特征。还假设当地的城市法规只允许我们使用机器学习算法,只要我们能在需要时提供任何预测的详细信息来进行辩解。这些信息是为了审计目的,以确保房地产市场的某些部分不会被人为操纵。使我们的训练模型可解释将提供这些额外信息。

让我们看看实现我们训练模型可解释性的不同选项。

提供可解释性策略

对于机器学习,基本上有两种策略可以为算法提供可解释性:

  • 全球可解释性策略:这是为了提供模型整体的制定细节。
  • 局部可解释性策略: 这是为我们训练模型所做的一个或多个个体预测提供理由。

对于全局可解释性,我们有诸如概念激活向量测试TCAV)之类的技术,用于为图像分类模型提供可解释性。TCAV 依赖于计算方向导数来量化用户定义的概念与图片分类之间的关系程度。例如,它将量化将一个人分类为男性的预测对图片中面部毛发的敏感程度。还有其他全局可解释性策略,如部分依赖图和计算排列重要性,可以帮助解释我们训练模型中的公式。全局和局部可解释性策略都可以是特定于模型的或模型不可知的。特定于模型的策略适用于某些类型的模型,而模型不可知的策略可以应用于各种模型。

以下图表总结了机器学习可解释性的不同策略:

现在,让我们看看如何使用这些策略之一来实施可解释性。

实施可解释性

局部可解释模型不可知解释LIME)是一种模型不可知的方法,可以解释训练模型所做的个体预测。作为模型不可知,它可以解释大多数类型的训练机器学习模型的预测。

LIME 通过对每个实例的输入进行微小更改来解释决策。它可以收集该实例的局部决策边界的影响。它迭代循环以提供每个变量的详细信息。通过查看输出,我们可以看到哪个变量对该实例的影响最大。

让我们看看如何使用 LIME 使我们的房价模型的个体预测变得可解释:

  1. 如果您以前从未使用过 LIME,您需要使用pip安装该软件包:
!pip install lime
  1. 然后,让我们导入我们需要的 Python 软件包:
import sklearn as sk
import numpy as np
from lime.lime_tabular import LimeTabularExplainer as ex
  1. 我们将训练一个能够预测特定城市房价的模型。为此,我们将首先导入存储在housing.pkl文件中的数据集。然后,我们将探索它具有的功能:

基于这些功能,我们需要预测房屋的价格。

  1. 现在,让我们训练模型。我们将使用随机森林回归器来训练模型。首先,我们将数据分为测试和训练分区,然后使用它来训练模型:
from sklearn.ensemble import RandomForestRegressor
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(
    housing.data, housing.target)
regressor = RandomForestRegressor()
regressor.fit(X_train, y_train)
  1. 接下来,让我们识别类别列:
cat_col = [i for i, col in enumerate(housing.data.T)
                        if np.unique(col).size < 10]
  1. 现在,让我们使用所需的配置参数实例化 LIME 解释器。请注意,我们正在指定我们的标签是'price',表示波士顿房屋的价格:
myexplainer = ex(X_train,
    feature_names=housing.feature_names,
    class_names=['price'],
    categorical_features=cat_col,
    mode='regression')
  1. 让我们尝试查看预测的详细信息。首先让我们从 matplotlib 中导入绘图器。
exp = myexplainer.explain_instance(X_test[25], regressor.predict,
        num_features=10)
exp.as_pyplot_figure()
from matplotlib import pyplot as plt
plt.tight_layout()
  1. 由于 LIME 解释器适用于个体预测,我们需要选择要分析的预测。我们已要求解释器解释索引为135的预测的理由:

让我们尝试分析 LIME 的上述解释,它告诉我们以下内容:

  • 个体预测中使用的功能列表:它们在前面的截图中显示在y轴上。
  • 决策中功能的相对重要性: 条形的长度越长,重要性越大。数字的值在x轴上。
  • 每个输入功能对标签的正面或负面影响: 红色条表示负面影响,绿色条表示特定功能的正面影响。

每个程序员都应该知道的 40 个算法(四)(4)https://developer.aliyun.com/article/1506369

相关文章
|
2月前
|
负载均衡 监控 算法
每个程序员都应该知道的 6 种负载均衡算法
每个程序员都应该知道的 6 种负载均衡算法
226 2
|
3月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
60 1
|
4月前
|
算法 搜索推荐 程序员
程序员常用算法详细讲解
每一种算法都有其适用场景,了解并熟悉这些常用算法的策略和实现,对于解决实际编程问题具有重要的意义。需要注意的是,理论知识的重要性虽然不言而喻,但真正的理解和掌握,还需要在实践中不断地尝试和错误,以达到深入理解的目的。
41 1
|
4月前
|
机器学习/深度学习 算法 搜索推荐
程序员必须掌握的算法
作为一名程序员,掌握一些重要的算法是必不可少的。算法是解决问题的方法和步骤,对于程序员来说,熟悉和掌握一些常见的算法可以提高编程能力,解决复杂的计算问题。与此同时,算法是计算机科学中的核心概念,对于程序员来说,掌握一些基本的算法是非常重要的。
53 1
|
6月前
|
算法 程序员
程序员必知:XGB算法梳理
程序员必知:XGB算法梳理
34 0
|
6月前
|
算法 JavaScript 程序员
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
35 0
|
7月前
|
机器学习/深度学习 算法 数据挖掘
每个程序员都应该知道的 40 个算法(四)(4)
每个程序员都应该知道的 40 个算法(四)
51 1
|
7月前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
18天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。