TowardsDataScience 博客中文翻译 2021(四百六十五)
在本教程中,我将向您展示如何在一个非常流行的 ETL 工具Alteryx中使用PyCaret来训练和部署机器学习管道,PyCaret 是一个用 Python 编写的开源、低代码的机器学习库。本教程的学习目标是:👉PyCaret 是什么,如何入门?👉什么是 Alteryx Designer,如何设置?👉在 Alteryx Designer 中训练端到端机器学习管道,包括数据准备,如缺失值插补、
机器学习走向量子化:令人兴奋的范式转变一瞥

来源。
革命性的传统迁移学习,k-手段,和 CNN
量子计算是一个已经被广泛使用的时髦词汇。不幸的是,尽管它在流行文化和准科学的互联网社区中传播,它的能力仍然非常有限。
作为一个非常新的领域,量子计算向传统的经典计算模型提出了一个完全的范式转变。经典比特——可以是 0 或 1——在量子计算中被量子比特所取代,后者保存概率值。
依靠物理学在非常非常小的水平上的怪癖,一个量子位在每次被测量时,都以一定的概率被强制进入 0 或 1 的状态。例如,如果一个量子位处于0.85:0.15状态,我们会期望它在大约 85%的时间里测量为零,而在 15%的时间里测量为零。
虽然量子计算还有很长的路要走,但是机器学习是一个特别有前途的潜在途径。为了简单了解量子计算能够提供的计算能力,请考虑以下情况:
- 一个量子位可以同时包含 0 和 1。因此,两个量子位可以一起保存四个值——状态 00、01、10 和 11 的值——而三个量子位可以保存八个,以此类推。
- 因此——至少在理论上——需要 2 个 ⁿ 位来代表存储在 n 个量子位中的信息。
除此之外,量子电路的流体概率性质可能为深度学习提供独特的优势,深度学习通过网络从信息的概率流动和转换中获得力量。
量子机器学习正在流行。谷歌广受欢迎的深度学习框架 TensorFlow 最近推出了 TensorFlow Quantum 。
本文将介绍量子变异的三种机器学习方法和算法:迁移学习、 k 均值和卷积神经网络。它将试图用尽可能少的量子知识来做到这一点,并展示在设计机器学习的量子应用时的一些重要考虑。
量子迁移学习
迁移学习可能是深度学习最大的成功之一。鉴于深度学习模型需要大量的时间来训练,迁移学习提供了一种加快训练时间的宝贵方法。此外,与从头开始训练相比,使用转移解决方案的模型通常会得到更好的解决方案。
作为一个想法,迁移学习是相对简单的——一个“基础模型”,将被表示为 A ,在一个通用任务上被训练。然后,将表示为 B 的附加层块附加到 A 上。通常情况下,在添加 B 之前, A 的最后几层会被砍掉。然后,在特定数据集上“微调”该模型,其中A’(修改后的 A )为 B 提供了各种过滤器,以提取与手头特定任务相关的有意义的信息。
我们可以将为迁移学习构建“混合神经网络”的想法形式化如下:
- 在通用数据集上训练通用网络 A 以执行通用任务(预测某个标签)。
- 取通用网络 A 的一段A’,在*A’*上附加一个新块 B 。 A’ 是预训练的,因此应该被冻结(使其不可训练),而 B 是可训练的。
- 在特定数据集上训练这个A’b混合模型来执行特定任务。

来源。
假设有两个组件,*A’*和 B ,并且每个组件都可以是经典或量子网络,那么混合神经网络就有四种可能的类型。
- 古典到古典 (CC)。传统的迁移学习观。
- 经典到量子 (CQ)。经典的预训练网络充当量子网络使用的过滤器。这种方法的实用性特别吸引人。
- 量子到经典 (QC)。量子预训练网络充当过滤器供经典网络使用。或许这在未来量子计算发展更多的时候会更有可能。
- 量子对量子 (QQ)。一个完全量子混合网络。在可行的层面上,现在可能不太可能,但以后可能会有希望。
经典到量子网络特别有趣和实用,因为大量的输入样本被预处理和细化到只有最重要的特征。这些信息特征可以由量子电路进行后处理,在目前的发展阶段,量子电路可以吸收比经典网络少得多的特征。
另一方面,量子转经典网络将量子系统作为特征提取器,一个经典网络用于进一步后处理这些提取的特征。QC 网络有两种使用情况。
- 数据集由量子态组成。例如,如果需要预测量子态的某些信息,量子特征提取器似乎是处理输入的正确工具。或者,像分子和超导体这样的量子力学系统可以从量子特征提取器中受益。
- 一台非常好的量子计算机胜过经典的特征提取器。
在测试中,作者发现这些量子经典混合模型可以获得与标准完全经典网络相似的分数。鉴于量子计算的早期阶段,这确实是一个有希望的消息。
量子卷积神经网络
卷积神经网络在图像识别以及信号处理等其他用例中已经变得很常见。然而,这些网络的规模在继续增长,量子计算可以大大加快经典机器学习方法的速度。
QCNN 算法与经典的 CNN 算法非常相似。然而,看到一些其他的考虑和改变被实现来允许量子方法是很有趣的。
首先,注意量子电路需要量子随机存取存储器,或 QRAM。这类似于 RAM,但是地址和输出寄存器由量子位组成,而不是位。它被开发成插入、更新或删除存储器中任何条目的时间是*O*(log²(*n*))。
考虑设计的卷积“块”的前向传递,它类似于经典 CNN,但略有不同。
- 执行量子卷积。这就是量子操作发生的地方。这是在 QRAM 完成的,并且应用了非线性。
- 量子采样。执行采样,以便在很大概率已知所有位置和值的精确值的情况下,可以获得所有位置和值。因此,概率量子位值被“转换”成经典形式。这就是所谓的量子层析成像。
- QRAM 更新和汇集。需要更新 QRAM,并且在 QRAM 结构中完成池化(像卷积一样)。
采样步骤是经典向前步骤和量子向前步骤之间的主要区别——在量子算法中,出于性能(因为量子计算容易改变且敏感)和速度的实际目的,通常需要采样。
与经典细胞神经网络相比,量子细胞神经网络前向传递的加速是—
- 内核数量呈指数增长
- 输入维数的二次函数
这是一个很大的加速!
然而,这个采样步骤受到非线性函数必须有界的限制——很难从无限大的可能空间中采样,尤其是在量子世界中。因此,ReLU 函数可能被重新定义为上限为 y = 1,这样它看起来更像 sigmoid 函数的平面版本。
这确实是取样的一个缺点,也是使用量子算法时权衡利弊的有趣证明。
q 均值
首先,未标记的数据正以前所未有的速度充斥着数据空间。标签贵;需要以有效且高效的方式处理未标记的数据。与传统的经典无监督学习算法相比,量子计算可以提供显著的加速,这对于处理这种无监督信息流具有很大的意义。
传统的经典 k -means 算法常用于聚类。使用两个步骤之间的重复交替,该算法返回“质心”(每个聚类的中心)的位置:
- *标签分配。*每个数据点都被分配了最近质心的标签。(质心位置最初是随机设置的。)
- *质心估计。*将每个质心更新为分配给相应聚类的数据点的平均值。
现在,考虑δ- k -means,它可以被认为是kmeans 的一个嘈杂但仍然经典的版本。假设δ是预设参数。该算法在相同的两个步骤之间交替进行,但增加了一些噪声:
- 标签分配。每个数据点被分配一个距离小于δ的随机质心。也就是说,任何距数据点的距离小于阈值的质心都有相等的分配机会。
- 质心估计。在计算每个质心的位置期间,添加δ/2 高斯噪声。
最后,考虑一下 q -means,它是 k -means 的真正量子变体。作为一个快速的先决条件,回想一下量子位包含概率;与 bit 相比,这使得它们特别容易受到测量误差和环境噪声的影响。
- *标签分配。*通过量子方法估计每个数据点到质心的距离。因为噪声,这个量子距离估计会有一定程度的噪声。然后,将每个数据点分配给一个质心。
- 质心估计。使用在 QCNN 方法的采样步骤中讨论的相同的量子层析成像思想,可以以高概率正确测量的状态被“转换”成经典形式。同样,这种操作本身也有一定程度的噪声。
q-的意思好像和k-的意思很像。然而,不同之处在于噪音;引入δ-k-意味着作为 q 的“经典版本”,意味着捕捉噪声元素。 q -means 背后的提议者证明,分析δ- k -means 可以揭示关于 q -means 算法如何运行的信息。
例如,当δ的(非零)值被适当地选择时,δ-k-均值算法通常收敛到达到类似于(如果不是更好的话)T2 k-均值算法的准确度的聚类。因此——尽管在量子变体中选择噪声量的自由度更小——人们可以期望 q 均值比 k 均值表现得更好。
类似地,δ- k -means 算法在其运行时间上是多对数的。那么, q -means 算法也是多对数的,是对 k -means 算法的加速,允许引入一些误差并放宽更严格和更精确的计算。
目前, q -means 太复杂,量子模拟器和量子计算机都无法测试。然而,通过δ-k-均值算法,有经验证据表明q-均值可以在与k-均值相似的水平上执行。
那么,量子集群的目的是什么呢?进一步的研究可能会考虑量子状态或数据的聚类,以及分子和其他非常小的现象的空间聚类——这是一项非常重要的任务。总的来说,在传统任务中,量子方法似乎也有超越经典方法的潜力。
感谢阅读!
你可能也会觉得这些文章很有趣。
</5-exciting-deep-learning-advancements-to-keep-your-eye-on-in-2021-6f6a9b6d2406> https://medium.com/mlearning-ai/mlearning-ai-submission-suggestions-b51e2b130bfb
🟠 成为作家
机器学习和国际象棋
我如何编写自己的 python 象棋引擎

快速介绍:
2020 年末,网飞发布了《女王的策略》,这是一部发生在 20 世纪 50 年代的电视节目,我们跟随一个年轻女性成长为最好的棋手的旅程。
然而,与主角贝丝·哈蒙不同,象棋并不是我最擅长的。所以我做了退而求其次的事情,构建了自己的 python 象棋引擎来弥补我糟糕的象棋技巧。
**第一集:**策略
当涉及到构建任何棋盘游戏引擎时,有多种策略:
- 强化学习
- 极大极小
- 基于人类知识训练的 ML 模型
- …
我选择了第二种和第三种策略的混合:作为一名数据科学家,我喜欢处理大型数据集和机器学习模型。此外,尽管有点慢,极大极小算法是一个相当可靠的算法,并在捕捉敌人的作品做得很好。强化学习简直太复杂了。
我的策略很简单:
- 首先,使用机器学习模型,引擎将驳回给定棋盘的 50%的可能走法。它通过找到一步棋是“好棋”的概率来做到这一点。所有的移动都按照这个概率排序,只剩下第 50 个百分位数。
- 其次,引擎将对剩余的移动执行最小最大算法。根据棋盘的复杂程度,搜索树会达到一定的深度。
**第二集:**数据
为了做出准确的预测,我们需要大量的数据。对于这个项目,我将使用我在 Kaggle 上找到的数据集。这个数据集是国际象棋大师以.pgn格式(可移植游戏符号)进行的数千场游戏的集合。
下一步是从所有的游戏中提取所有的招式,并标记为好或坏。
在我看来,‘好棋’是赢家在游戏过程中的某个时刻走的一步棋。“坏棋”是赢家选择不走的合法棋。
这个 python 脚本完成了工作,给我留下了一个全新的.csv数据集。
你可以在 Kaggle 和 Github 上找到我的数据集:
https://www.kaggle.com/ethanmai/chess-moves https://github.com/iAmEthanMai/chess-games-dataset
然后,我们需要将数据帧导入我们的 Jupyter 笔记本。我们可以简单地在第一个代码单元中运行以下命令:
In[1]: import pandas as pd
df = pd.read_csv('data.csv')
print(df.shape)Out: (1600000,193)
数据框架的列如下:
- 前 64 列代表当前棋盘的 64 个方块。
- 从 65 到 128 的列代表移动的开始位置:如果一个棋子从那个方块移动,则为 1.0,否则为 0.0。
- 从 130 到 192 的列代表移动的结束位置:如果一个棋子移动到那个方块,则为 1.0,否则为 0.0。
- 最后一列是标签:如果这是一步好棋,则为真,否则为假。
In[2]: df.head()
df.head()
**第三集:**模特
在这个项目中,我将使用 tensorflow 线性分类器。这是一个非常常见的模型,因为它被很好地记录下来并且非常有性能。
In[3]: linear_est = tf.estimator.LinearClassifier(feature_columns)
**第四集:**训练
要训练估计器,我们可以简单地运行以下命令:
In[4]: linear_est.train(input_function)
关于这个项目的机器学习部分的更多细节,请确保查看我的 Colab 笔记本,在那里你可以找到所有的源代码。
第五集: Minimax
极大极小算法将探索合法移动的递归树直到某一深度,并使用评估函数评估叶子。
然后,我们可以根据回合将最大或最小的子节点值返回给父节点。这允许我们最小化或最大化树的每一层的结果值。点击了解更多关于 Minimax 的信息。
评估功能寻找两个标准:
- 一块的类型。例如,骑士比卒更有价值。
- 棋子的位置。例如,一个骑士在棋盘中间很强,而国王很脆弱。
评价函数算法
**第六集:**游戏处理
为了获得合法的移动和显示棋盘,我使用了 python-chess 库。您可以通过运行以下命令用 pip 安装它。
!pip3 install python-chess
这个库让事情变得非常方便,因为它消除了硬编码国际象棋规则和微妙之处的麻烦。
**第七集:**播放
剩下唯一的事情就是玩游戏。如果你想试一试,运行所有的代码单元,你应该可以开始了…祝你好运!
python-chess-engine.ipynb](https://colab.research.google.com/github/iAmEthanMai/chess-engine-model/blob/main/python_chess_engine.ipynb#scrollTo=dsacAJ-5gkN0)
结论:
谢谢你留下来,我希望你喜欢这个项目。
欢迎在 Github 、 Kaggle 和 Linkedin 上与我联系。
用 PyCaret 在 Alteryx 中进行机器学习
使用 PyCaret 在 Alteryx Designer 中训练和部署机器学习模型的分步教程

介绍
在本教程中,我将向您展示如何在一个非常流行的 ETL 工具 Alteryx 中使用 PyCaret 来训练和部署机器学习管道,PyCaret 是一个用 Python 编写的开源、低代码的机器学习库。本教程的学习目标是:
👉PyCaret 是什么,如何入门?
👉什么是 Alteryx Designer,如何设置?
👉在 Alteryx Designer 中训练端到端机器学习管道,包括数据准备,如缺失值插补、一键编码、缩放、转换等。
👉部署经过训练的管道,并在 ETL 期间生成推理。
PyCaret
PyCaret 是一个开源、低代码的机器学习库和端到端的模型管理工具,内置于 Python 中,用于自动化机器学习工作流。PyCaret 以其易用性、简单性以及快速高效地构建和部署端到端机器学习管道的能力而闻名。要了解更多关于 PyCaret 的信息,请查看他们的 GitHub 。
Alteryx 设计器
Alteryx Designer 是由 Alteryx 开发的专有工具,用于自动化分析的每个步骤,包括数据准备、混合、报告、预测分析和数据科学。您可以访问任何数据源、文件、应用程序或数据类型,并体验包含 260 多个拖放构建块的自助服务平台的简单性和强大功能。你可以从这里下载 Alteryx Designer 的一个月免费试用版。

教程先决条件:
对于本教程,您将需要两件东西。第一个是 Alteryx 设计器,这是一个桌面软件,你可以从这里下载。第二,你需要 Python。获得 Python 最简单的方法是下载 Anaconda 发行版。要下载,点击这里。
👉我们现在准备好了
打开 Alteryx Designer,点击文件→新建工作流

Alteryx 设计器中的新工作流
在顶部,有一些工具,您可以在画布上拖放,并通过将每个组件相互连接来执行工作流。
资料组
对于本教程,我使用 PyCaret 的存储库中的一个名为 insurance 的回归数据集。你可以从这里下载数据。

样本数据集
我将创建两个独立的 Alteryx 工作流。第一个用于模型训练和选择,第二个用于使用训练好的管道对新数据进行评分。
👉模型训练和选择
让我们首先从输入数据工具读取 CSV 文件,然后是 **Python 脚本。**在 Python 脚本内部执行以下代码:
**# install pycaret** from ayx import Package
Package.installPackages('pycaret')**# read data from input data tool**
from ayx import Alteryx
data = Alteryx.read("#1")**# init setup, prepare data**
from pycaret.regression import *
s = setup(data, target = 'charges', silent=True)**# model training and selection** best = compare_models()**# store the results, print and save**
results = pull()
results.to_csv('c:/users/moezs/pycaret-demo-alteryx/results.csv', index = False)
Alteryx.write(results, 1)**# finalize best model and save**
best_final = finalize_model(best)
save_model(best_final, 'c:/users/moezs/pycaret-demo-alteryx/pipeline')
该脚本从 pycaret 导入回归模块,然后初始化setup函数,该函数自动处理 train_test_split 和所有数据准备任务,如缺失值插补、缩放、特征工程等。compare_models使用 kfold 交叉验证训练和评估所有估计器,并返回最佳模型。
pull函数以数据帧的形式调用模型性能指标,然后保存为驱动器上的results.csv,并写入 Alteryx 中 Python 工具的第一个锚点(以便您可以在屏幕上查看结果)。
最后,save_model将包括最佳模型在内的整个转换管道保存为 pickle 文件。

培训工作流程
当您成功执行该工作流时,您将生成pipeline.pkl和results.csv文件。您还可以在屏幕上看到最佳模型的输出及其交叉验证的指标。

这就是results.csv包含的内容:

这些是所有模型的交叉验证指标。在这种情况下,最好的模型是 梯度推进回归器 。
👉模型评分
我们现在可以使用我们的pipeline.pkl对新数据集进行评分。由于我没有标签为 , 的 insurance.csv 的单独数据集,我要做的是删除目标列,即 费用 ,,然后使用训练好的管道生成预测。

评分工作流程
我已经使用选择工具移除目标列,即charges。在 Python 脚本中执行以下代码:
**# read data from the input tool**
from ayx import Alteryxdata = Alteryx.read("#1")**# load pipeline** from pycaret.regression import load_model, predict_model
pipeline = load_model('c:/users/moezs/pycaret-demo-alteryx/pipeline')**# generate predictions and save to csv** predictions = predict_model(pipeline, data)
predictions.to_csv('c:/users/moezs/pycaret-demo-alteryx/predictions.csv', index=False)**# display in alteryx** Alteryx.write(predictions, 1)
当您成功执行该工作流时,它将生成predictions.csv。

预测. csv
即将推出!
下周我将深入探讨 PyCaret 的更多高级功能,您可以在 Alteryx 中使用这些功能来增强您的机器学习工作流。如果你想自动收到通知,你可以在媒体、 LinkedIn 和 Twitter 上关注我。

PyCaret —作者图片

PyCaret —作者图片
使用 Python 中的这个轻量级工作流自动化库,您可以实现的目标是无限的。如果你觉得这很有用,请不要忘记给我们 GitHub 库上的⭐️。
想了解更多关于 PyCaret 的信息,请关注我们的 LinkedIn 和 Youtube。
加入我们的休闲频道。此处邀请链接。
重要链接
文档
博客
GitHub
stack overflow
安装 PyCaret 笔记本教程 贡献于 PyCaret
更多 PyCaret 相关教程:
[## 使用 PyCaret 编写和训练您自己的自定义机器学习模型
towardsdatascience.com](/write-and-train-your-own-custom-machine-learning-models-using-pycaret-8fa76237374e)
医学中的机器学习——期刊俱乐部
思想和理论
对临床文献中使用机器学习技术的批判性评价
呼吁建立科学期刊中报告机器学习模型的文档标准

简介
过去几年,机器学习技术在生物医学研究中的使用呈爆炸式增长,PubMed 上以“机器学习”一词为索引的期刊论文数量从 2015 年的 3200 篇激增至 2020 年的 18000 篇。虽然由于机器学习,重大的科学进步已经成为可能,但大多数机器学习算法的内部工作对许多临床医生来说仍然是陌生的,他们中的大多数人非常熟悉传统的统计方法,但几乎没有接受过高级计算机算法的正式培训。不幸的是,期刊审稿人和编辑有时满足于接受机器学习作为一种黑箱操作,并且无法以应用于其他临床和基础科学研究的相同审查水平来分析机器学习模型产生的结果。

pubmed.gov 上被索引为“机器学习”的期刊文章数量。图片作者。
这个期刊俱乐部的目标是帮助读者发展必要的知识和技能,以消化和评论涉及使用机器学习技术的生物医学期刊文章。如果评审者不理解这些算法是如何工作的,他/她很难知道该问什么问题。我们不会关注研究的内容或临床意义,而是关注与机器学习技术相关的方法和技术细节。我们希望强调研究人员在临床研究中结合机器学习时犯的一些陷阱和常见错误,并加强科学研究出版物中批判性评估的重要性。
条
我们选择了这篇最近发表在《美国胃肠病学杂志》上的论文作为我们杂志俱乐部的第一篇文章,因为它强调了建立一个正式标准的必要性,或者至少是一个被广泛接受的惯例,以记录机器学习模型,就像大多数系统综述或元分析报告他们的方法和发现一样。
对于那些不熟悉胃肠病学领域的人来说,美国胃肠病学杂志是美国胃肠病学学会的官方杂志,该学会本身就是该领域的顶级专业学会。该期刊被广泛认为是该领域的顶级期刊之一,2018 年的影响因子为 10.241。
背景
与普通人群相比,肝硬化患者出院后再次入院和死亡的风险更高,这可能归因于疾病的复杂性以及该患者群体特有的其他社会心理/社会经济因素。能够客观地评估单个患者的再入院和死亡风险在出院计划和护理过渡方面具有临床意义。
终末期肝病模型(MELD)最初被开发用于预测接受选择性经颈静脉肝内门体分流术的患者的 3 个月死亡率,现已被广泛研究并在外部被验证为肝硬化患者死亡率的预测因子。

MELD 分数。图片作者。
尽管 MELD 评分是最广泛使用的肝病严重程度的客观指标,但它远非完美。它在低范围内的辨别能力(<15) is very poor, as demonstrated by the nearly flat mortality curve in Figure 5 of 本文)。我们还知道,MELD 评分的区分能力取决于肝病的潜在病因,如本文的表 1 所示,以及 MELD 评分未涵盖的其他临床变量。
假设和具体目标
在这篇文章中,作者假设机器学习模型可以用来预测这些风险,并且这些模型将优于“传统的临床数据和生物统计学”。
该论文的具体目的是使用机器学习“预测多中心北美住院肝硬化队列中 30 天和 90 天的再入院和死亡”。
方法
- 研究形式——多中心回顾性观察队列研究。
- 研究人群——北美终末期肝病研究联盟(NASCELD)中的受试者,包括 14 家三级医院。
- 纳入标准——非选择性入院的确诊肝硬化患者。
- 排除标准——HIV 感染和既往器官移植。
- 研究期——出院后 90 天。
数据收集
入院变量——人口统计学、肝硬化严重程度、MELD、MELD-Na 和 Child-Pugh 评分、入院时的全身炎症反应综合征、入院时的药物治疗和入院原因。
医院病程变量——继发感染、个体器官衰竭和慢加急性肝衰竭。
出院变量——实验室值和肝硬化严重程度,如 MELD 和药物。
模型开发
本文包括三种不同的机器学习技术,包括逻辑回归、支持向量机和随机森林。
逻辑回归(LR)
支持向量机(SVM)
- sklearn.svm.SVC 使用默认的 RBF 核和默认的逆正则化强度 1.0。
随机森林(RF)
- 仅使用 20 个估计器和最大深度 5。所有的超参数都被假定为默认值。
有趣的是,作者使用 10 重交叉验证,仅将显著不同的特征纳入模型(p <0.05) between subjects with positive outcomes and subjects with negative outcomes. The rationale for this decision was not mentioned in the paper.
Model performance was evaluated based on the area under the 受试者工作特征曲线 (AUC)。
结果
最终分析包括 2170 名受试者,平均年龄为 57 岁,大多数(61%)为男性,大多数(79%)为白人。平均 MELD-Na 得分为 20.7 分。30 天再入院率为 28%,90 天再入院率为 47%。90 天死亡率为 13%。
尽管论文的很大一部分致力于讨论所获得的各种临床变量,但论文中只有表 4-6 与机器学习相关,这里复制了一部分用于讨论。

表 4–6 的部分内容。图片作者。
作者得出结论,LR 模型和 RF 模型表现最好。他们认为,这两个类别之间的许多临床变量可能有显著的重叠(再入院与非再入院,死亡与非死亡),使得算法难以定位最佳超平面。他们还提出,LR 模型和 SVM 模型的性能可能受到许多分类特征的影响。最重要的是,作者得出结论,所有三种机器学习技术创建的完整模型仅比仅使用 MELD-Na 分数创建的模型略好,并且“多种人工智能技术通过机器学习的预测能力不是最理想的”。
文章评论
在我们深入研究文章内容之前,值得注意的是,“机器学习”这个术语在文章的正文中只使用了一次,在下面的句子中:“我们需要机器学习和人工智能(AI)技术等其他方法来预测这些结果”。在整篇文章中,作者将机器学习模型称为“AI 模型”。虽然“人工智能”和“机器学习”之间的区别纯粹是语义上的,但它在一篇发表在顶级 GI 期刊上的文章中的误用引起了人们的怀疑,即作者和编辑可能对该主题不是非常熟悉。想象一下,如果我们正在阅读一篇关于氩等离子体凝固术在动静脉畸形治疗中的应用的文章,但作者一直将其称为电外科手术。根据记录,人工智能是一个总括术语,用于描述使用技术模仿自然智能。机器学习是人工智能的应用之一。其他应用包括机器人、计算机视觉、语音识别和自然语言处理。

人工智能领域。图片作者。
绩效指标
让我们从文章的主要结论开始分析,即机器学习模型对肝硬化患者的再入院或死亡的可预测性较低。如果我们仔细查看表 4、5 和 6 中报告的数字数据,我们可以看到,在所有三种结果(30 天、90 天再入院和 90 天死亡率)、所有三种机器学习技术(LR、SVM 和 RF)以及两种性能指标(准确性和 AUC)方面,完整模型和仅 MELD-Na 模型之间没有统计学上的显著差异。事实上,所有三种机器学习技术的性能指标彼此非常接近,尽管这些模型都是使用默认的超参数构建的,没有经过优化。我们怀疑这种奇怪的观察结果可能是由于性能指标选择不当造成的。
这里一个重要的学习点是,准确性和 AUC 不应该在结果不平衡的数据集中用作性能指标。使用准确性更容易证明这个缺陷。想象一下,我们正在建立一个模型来预测一种患病率为 99%的罕见疾病,尽管在实践中完全没有用。事实上,我们可以看到 30 天再入院模型和 90 天死亡率模型的准确性非常接近 30 天未再入院率(100%-28% = 72%)和 90 天生存率(100%-13%=87%)。如本文所述,AUC 在面对高度不平衡的数据集时也会遇到同样的问题。从本质上讲,表 4、5 和 6 中的结果并没有告诉我们这些模型的性能,只是基础数据集非常不平衡。作者应该做的是使用一条精确回忆曲线和 F-1 分数,它们不受班级不平衡的影响。

ROC 曲线和 PR 曲线。图片作者。
文章中使用这两个性能指标的方式还有另一个问题。请记住,机器学习模型的输出是一个数值,代表某个主题属于某个类别的概率。ROC 曲线和 PR 曲线本质上是各种性能指标(ROC 的 TPR 和 FPR,PRC 的精度和召回)随着概率从 0 增加到 1 的变化的图形表示。因此,这些曲线下的面积对应于模型的内在鉴别能力。在我们可以在临床实践中实际应用该模型之前,我们必须首先确定一个适当的概率阈值,该阈值取决于不同错误分类的相对成本(例如,结肠镜检查中遗漏癌症诊断的成本与进行不必要的活检的成本)。包括准确度和 F-1 分数在内的某些性能指标特定于特定的概率阈值(即,它们代表曲线上的单个点)。它们不应该用于比较不同机器学习模型的性能。在这篇文章中,作者没有披露与准确性相关的概率阈值是如何确定的(假设他们只是使用默认值 0.5),他们似乎也使用准确性作为模型区分能力的替代措施。
超参数调谐
这篇文章最奇怪的部分是,所有三个机器学习模型本质上都是使用默认的超参数(除了随机森林模型的树计数和树深度)构建的。这些默认超参数不太可能产生最佳模型,尤其是考虑到特征的复杂性。没有解释为什么作者为随机森林模型选择如此低的树数 20 和相对浅的树深 5。这个缺陷是为什么应该有一个正式标准来记录机器学习模型开发过程的明显例子。作者评估的超参数范围应明确记录。理想情况下,补充材料中应有图表显示与每个超参数相关的模型性能变化。应该清楚地解释选择异常高或异常低的超参数的理由。对于 LR 模型,应该使用逐步特征选择进行特征选择,并且应该清楚地报告过程中每一步的相关统计测量。对于 RF 模型,应报告基于杂质的特征重要性,以确保所包含的特征确实有助于最终模型。底线是,应该向文章的评论者和读者提供足够的信息,以便在必要时复制和验证作者的主张,就像任何其他基础科学和临床研究论文一样。
数据预处理
本文的另一个主要问题是缺少关于数据预处理的文档。作者在补充内容中提到“预处理包括两个主要步骤:清理数据集,然后挖掘新特征。清理数据集涉及处理数据中不正确、冗余或缺失的值,而特征挖掘涉及从数据中识别新特征”。在这些数据预处理步骤中进行的详细操作,如发现缺失数据的比例和使用的插补方法,没有披露。因为特征由各种范围和基数的数字和分类特征组成,所以在应用于模型之前,可能需要对数字特征进行归一化,并对分类特征进行编码。如上所述,应该公开准确的标准化参数和编码方案,以便审查者和读者在必要时可以复制模型。
总结
本文试图解决一个临床上重要的问题,即使用机器学习技术预测肝硬化患者的再住院和死亡率。由于该任务本质上是一个简单的分类问题(readmit vs. not,death vs. not),因此使用简单的机器学习分类模型,包括逻辑回归、支持向量机和随机森林,似乎是合适的。作者能够从一个完善的多中心队列中收集大量高质量的训练数据,这有助于最大限度地提高该研究的外部有效性。
不幸的是,这篇文章被机器学习模型的实现和分析中的几个主要问题所困扰。缺少关于数据预处理和模型开发步骤的重要文档,使得评审者和读者几乎不可能重现/验证研究结果。模型没有完全优化(或者至少没有优化过程的文档)。使用的性能指标,即准确性和 AUC,不适合本文的目的(请记住,准确性是一个取决于概率阈值的点测量,而 AUC 在高度不平衡的数据集中是不准确的)。
尽管发表在顶级 GI 期刊之一,但这篇文章在应用机器学习技术方面包含足够多的缺陷,足以使其发现和结论无效。应该鼓励研究人员尝试建立其他机器学习模型来预测肝硬化患者的再入院和死亡率。
学习要点
- 在高度不平衡的数据集中,接收器操作特征曲线下的面积和精确度可能不合适。
- 应清楚记录与机器学习模型开发流程相关的详细信息,包括缺失值插补、标准化、编码和超参数调整。
医学中的机器学习——期刊俱乐部 II
对临床文献中使用机器学习技术的批判性评价
当心那些将苹果比作橙子,或将客机比作汽车的说法。

介绍
欢迎来到医学杂志俱乐部的机器学习的另一个入口。让我们提醒大家,这个期刊俱乐部的目标是帮助读者发展必要的知识和技能,以消化和评论涉及使用机器学习技术的生物医学期刊文章。尽管它的一些术语和概念听起来可能很奇怪,但机器学习不是魔法,我们应该像对待任何其他临床研究一样,以同样的怀疑态度评估这些技术的使用所带来的发现。为了这个期刊俱乐部的目的,我们将不会关注研究的内容或临床意义,而是关注与机器学习技术相关的方法和技术细节。一路上,我们希望强调一些陷阱和常见错误,并消除一些与机器学习相关的常见误解。
文章
为了继续我们上一篇期刊俱乐部条目中的肝硬化主题,我们选择了 PLoS One 最近发表的这篇论文,因为这篇文章的作者旨在使用类似的技术回答上一篇文章提出的相同问题,但他们的结论完全相反。我们应该试着理解这些作者的不同做法导致了不同的结果。
《公共科学图书馆·综合》是一个同行评审、开放获取的在线期刊,旨在让所有人都能免费获取科学出版物。该杂志发表科学、工程、医学和社会科学所有领域的研究。尽管该杂志没有公布其影响因子,但它被认为是医学领域中声誉卓著且具有合理选择性的杂志。
背景
肝硬化患者在首次诊断时通常具有很少症状的亚临床疾病。这种疾病通常会经历多年缓慢和惰性的过程,但在一小部分患者中,疾病可能会发展,这些患者可能会在没有警告的情况下迅速失代偿。能够预测单个患者的死亡风险在预防失代偿事件和对住院和门诊患者管理进行分类方面具有临床意义。
终末期肝病模型(MELD)最初被开发用于预测接受选择性经颈静脉肝内门体分流术患者的 3 个月死亡率,现已被广泛研究和外部验证为肝硬化患者死亡率的预测因子。

MELD 分数。图片作者。
尽管 MELD 评分是最广泛使用的肝病严重程度的客观指标,但它远非完美。它在低范围内的辨别能力(<15) is very poor, as demonstrated by the nearly flat mortality curve in Figure 5 of 本文)。我们还知道,MELD 评分的区分能力取决于肝病的潜在病因,如本文的表 1 所示,以及 MELD 评分未涵盖的其他临床变量。因为最初的模型仅被验证用于预测 90 天的死亡率,所以它在预测长期死亡率方面的表现是不确定的。
假设和具体目标
在这篇文章中,作者假设机器学习模型在预测肝硬化患者的短期和长期死亡率方面优于 MELD 评分
本文的具体目的是使用机器学习来预测一个大型学术肝移植中心肝硬化队列中 90 天、180 天和 365 天的死亡率。
方法
- 研究形式——单一回顾性观察队列研究。
- 研究人群——医院电子病历系统中包含的受试者。
- 纳入标准-在 2021 年 1 月 1 日至 2019 年 12 月 31 日之间添加了初始诊断代码为肝硬化的成年患者。
- 排除标准—无。
- 研究期——任何肝硬化相关诊断代码首次出现后的 365 天。
- 结果——90 天、180 天和 365 天的全因死亡率。
- 特征-人口统计、首次诊断代码时或之前测量的实验室数据,以及与初次诊断相遇相关的信息(例如,相遇类型、确切诊断等。)
数据预处理
与前一篇文章不同,本文作者更详细地描述了数据预处理步骤。缺失值超过 10%的特征不包括在模型中。否则,多重插补(大概是sk learn . impute . iterative impute r)用于数字特征,而模式插补用于分类特征。作者还使用均值插补而不是多重插补建立了单独的模型,并在文章的补充内容中提供了结果。
作者还承认,由于整体死亡率较低,训练数据集非常不平衡。为了解决这种类别不平衡,作者采用了合成少数过采样技术(SMOTE) 来生成在模型训练阶段使用的合成样本。

合成少数过采样技术。图片作者。
车型开发
本文包括三种不同的机器学习技术,包括逻辑回归、随机森林和深度神经网络
逻辑回归
- 大概是用 sklearn.linear_model 实现的。L2 正则化和反正则化强度为 1.0 的逻辑回归。
- 正则化优化:L1 和 L2 正则化和 10 个不同的正则化强度之间的 0 和 4。
随机森林(RF)
- 假设使用具有 500 个估计器的sk learn . ensemble . randomforestclassifier实现,并且每个估计器的特征数量被设置为特征总数的平方根。所有的超参数都被假定设置为默认值
- 树计数优化:200、500 和 700 估计器
- 最大功能数优化:自动、平方根和 log2
深度神经网络(DNN)
- 大概是用 keras.models.Sequential 和 keras.layers.Dense 实现的,每层有 4 个隐藏层和 128 个节点。Sigmoid 函数用于输出层,ReLu 函数用于隐藏层。使用二值交叉熵损失作为损失函数。Adam optimizer 用于 512 的小批量。
- 网络深度优化:2 至 8 层
- 层维度优化:128 和 256 个节点
- 批量优化:64、128 和 512。
基于受试者操作特征(ROC) 曲线下面积(AUC)、总体准确性和使用 5 重交叉验证的 F1 得分,对模型性能进行评估。
结果
最终分析包括 34,575 名受试者,平均年龄为 60.5 岁,性别分布均匀,大多数(77.5%)为白人。入院时平均 MELD-Na 评分为 11.5 分。90 天、180 天和 365 天的死亡率分别为 5.2%、6.4%和 8%。
最终,41 个特征被包含在完整的模型中。作者还创建了仅使用钠、肌酐、总胆红素和 INR(MELD-Na 评分的组成部分)的部分模型。

图片由郭等人提供。艾尔。PLoS One 。根据知识共享署名许可转载。
文章的图 2 显示了三个完整模型和三个部分模型在预测 90 天、180 天和 365 天死亡率方面的性能。任何敏锐的读者都会立即注意到图 2a、2b 和 2c 看起来几乎一模一样。在所有三个结果中,每个模型的 AUC 值也非常接近。
作者基于 F1 分数认为,在所有三个结果中,完全 RF 模型和完全 DNN 模型比完全 LR 模型表现更好。

三款车型的 F1 成绩。图片作者。
使用相同的性能指标,作者还认为三个完整模型优于三个部分模型。作者通过计算三个完整模型的特征重要性,进一步研究了每个特征的贡献。作者总结说,虽然 MELD-Na 变量非常重要,但其他特征和实验室值也“在预测中发挥着重要作用”
文章批判
我们将从表扬作者做得对的事情开始我们的评论。与以前的文章不同,这篇文章在方法部分提供了更多的细节,以允许评审者和读者重现模型。作者甚至提供了联系信息,以便索取原始数据集的副本。唯一可以做得更好的是在补充材料中提供生成模型的原始代码。在没有原始代码的情况下,我们必须做出某些假设,例如用于生成这些模型的默认超参数值。
我们还应该赞扬作者描述了对模型所做的优化。这当然表明作者已经做出了合理的努力来最大化他们模型的性能,超参数是基于系统分析选择的,而不是凭空捏造的。这对于 DNN 模型尤其重要,因为人工网络的性能可能会因所使用的超参数而有很大差异。如果我们吹毛求疵,我们可能会要求对 RF 模型的树深度超参数进行额外的优化,这通常会产生额外的性能改进。我们可能还会要求对 Adam 优化器设置进行额外的优化,这在大多数情况下也会影响模型的性能。理想情况下,作者将在文章的补充材料中包括这些优化的结果,以表明最终的超参数值确实与每个模型的峰值性能相关。
最后,我们应该赞扬作者在训练阶段通过使用 SMOTE 技术来解决班级不平衡的努力。SMOTE 和其他过采样技术,如 AdaSyn、Borderline SMOTE 和 SVM-SMOTE,被广泛认为是处理类别不平衡的最先进技术,而已被证明可以改善学习。
车型对比
我们对这篇文章的主要批评源于论文结论部分的一句话,即“机器学习和深度学习模型优于肝硬化患者风险预测的当前标准”。作者声称,他们的机器学习模型在预测短期和长期死亡率方面优于 MELD-Na 评分,MELD-Na 评分是肝硬化患者风险预测的当前标准。论文的引言部分也多次提到 MELD-Na 评分的局限性。然而,如果我们花点时间仔细考虑方法部分和结果部分,我们会意识到该研究从未被设计成直接比较机器学习模型的性能和 MELD-Na 分数的性能。作者所做的是将包含 41 个特征的完整模型与仅包含 4 个特征的部分模型进行比较。除非额外的 37 个特征都是由随机生成的值组成的,否则完整模型比部分模型表现得更好就不足为奇了。支持作者声称机器学习模型优于 MELD-Na 评分的唯一方法是将模型应用于一个原始数据集,该数据集验证了 MELD 评分作为肝硬化患者的死亡率预测指标。不幸的是,这篇论文没有这样做。作者可能声称他们的完整模型在 F1 分数的基础上表现相当好,但他们不能声称他们优于 MELD-Na 分数,除非他们能够证明他们的部分模型与 MELD-Na 分数相当。
我们也反对作者声称 RF 模型和 DNN 模型基于 F1 分数优于 LR 模型。我们将在后面讨论性能指标的问题,但我们必须首先强调直接比较不同建模技术的性能是徒劳的,这在最近的生物医学文献中不幸地变得相当常见,例如这个、这个和这个。决策树模型,如随机森林和梯度提升机器,受到每个决策点一次只能考虑一个特征的限制。逻辑回归模型受限于特征变量和结果变量的对数优势之间的线性关系。神经网络不受这些限制。给定足够数量的神经元和层,理论上,人工神经网络可以逼近任何连续函数。因此,一个适当调整的神经网络可以胜过其他机器学习技术开发的模型一点也不奇怪。然而,在选择机器学习技术时,除了原始精度之外,我们还必须考虑许多实际因素。例如,逻辑回归模型可以通过数学公式简明地捕获,并在任何生产环境中轻松实现,而随机森林模型或神经网络必须在可编程环境中实现。与决策树模型相比,训练神经网络需要更大的计算能力,并且通常需要大的训练数据集。发表一篇论文称,在同一数据集上进行训练后,神经网络在预测某一临床结果方面的表现优于逻辑回归模型,这与声称客机在地球上两个地方之间的行驶速度比汽车快一样没有意义。作为一个社区,我们需要停止这些毫无意义的比较。
性能指标
让我们继续讨论本文中性能指标的使用。正如我们在之前的 journal club 条目中所讨论的,准确度和 F1 分数(以及灵敏度/召回率/真阳性率、特异性/选择性/真阴性率、精确度/阳性预测值、阴性预测值)是分类模型性能的点估计。它们的值取决于用于分类的特定阈值。通常基于做出正确预测的成本与不正确预测的成本之间的平衡来选择适当的阈值。曲线下面积(AUC)衡量模型在分类阈值范围内的表现,因此是对模型内在区分能力的评估。本文作者在图 2 中正确地报告了作为主要性能指标的 AUC,但不幸的是忽略了一个事实,即他们应该使用精确召回曲线下面积(AUPRC)而不是 ROC 曲线下面积(AUROC)。记住 ROC 曲线容易受到类别不平衡的影响,而精确召回曲线则不会。由于 SMOTE 技术仅应用于训练数据集,而不是验证数据集,使用 AUROC 作为性能度量将导致由负面结果主导的扭曲估计。虽然我们已经指出在不同的机器学习技术之间进行性能比较是徒劳的,但我们也应该指出,根据 F1 分数进行这样的比较,而不指定每个模型的最佳 F1 分数是如何确定的,这甚至更糟。请记住,模型的 F1 分数可能会随着精确度-召回曲线的变化而显著变化,默认阈值 0.5 通常不是最佳阈值。

班级失衡与绩效指标。图片作者。
网络架构
最后,我们想评论一下本文中使用的神经网络模型。作者使用了一个多层感知器(这可能是一个比深度神经网络更准确、更简单的描述),它包含 4 个隐藏层,每个隐藏层包含 128 个节点。对于一个简单的二进制分类任务来说,这是一个相当大的网络。作者在方法部分指出,他们在优化过程中测试了两种配置(128 个节点,256 个节点),但不清楚他们为什么选择 128 个节点作为起点。虽然在神经网络体系结构上没有严格的规则,但一个经验法则是将隐藏层中的神经元数量设置为输入层(本例中为 41)和输出层(本例中为 1)之间的某个值。我们想知道作者是否可以用一个更有效设计的网络获得类似(甚至更好)的结果。作者似乎也没有对 Adam 优化器设置或历元计数执行任何优化,所有这些都会显著影响模型的性能。作者还应在方法部分指定用于预处理数值和分类值的标准化和编码方案,因为它们是评审者和读者重现模型所必需的。
总结
这篇文章试图解决 MELD-Na 评分的缺点,即它在低范围内的辨别能力差,以及它不能使用机器学习技术预测长期死亡率。给定二元分类任务,选择逻辑回归模型、随机森林模型和人工神经网络是合适的。作者在方法部分提供了足够的细节来帮助评论者和读者重现模型。作者通过实现 SMOTE 技术考虑了类不平衡的问题。不幸的是,这篇文章的总体结论,即机器学习模型在预测死亡率方面优于 MELD-Na 评分,实际上并没有得到这项研究结果的支持。这篇文章还根据可能不太理想的 F1 分数,对三种建模技术的性能进行了一些不相关且未经证实的比较。总的来说,这篇文章能够成功地证明使用机器学习模型预测肝硬化患者的短期和长期死亡率,具有合理的区分能力。其他研究人员应该尝试通过将这些模型应用于其他数据集来从外部验证这些模型。
学习要点
- 如果两个模型都进行了适当的优化,完整模型(由所有可用特征构成的模型)的性能将至少与部分模型(仅由特征子集构成的模型)一样好。
- 机器学习建模技术的选择除了结果模型的辨别能力之外,还基于许多因素。比较使用不同技术构建但在相同数据集上训练的不同模型的性能不会增加任何科学价值。
- 某些性能指标,如 ROC 曲线下面积和准确度会受到类别不平衡的不利影响,而其他指标,包括精确度-召回曲线下面积、平衡准确度和 F1 分数,则不受影响。
医学中的机器学习——第一部分
针对医生和医疗保健专业人员的机器学习技术实践入门课程。
概述/数据准备

国家癌症研究所的图片来自 Unsplash
介绍
过去几年,机器学习、深度学习和人工智能已经成为包括医疗保健在内的所有行业的最新流行语。很多人乐观地认为,机器学习可以帮助医生建立更早、更准确的诊断,并为复杂疾病(如癌症)提供更有效、更个性化的治疗。也有希望利用机器学习来提高医疗服务的效率,降低医疗成本。
不幸的是,对于大多数受过传统培训的医疗保健专业人员来说,机器学习仍然是一个相对模糊的概念。只有一小部分人消息灵通,足以批判性地评价关于这个主题的期刊文章,更少的人能够在他们的研究中利用这些技术。这门入门课程的目标是揭开机器学习的黑箱,揭示这些算法的内部工作原理,并介绍实现它们所必需的工具。
虽然网上肯定不缺乏机器学习教程,但预测花瓣大小和房价与诊断癌症并不完全一样。因此,在本课程中,我们将使用健康结果相关的数据集来解决实际的临床问题。在此过程中,我们将尝试强调在使用机器学习技术设计临床研究时必须考虑的重要决策。
先决条件
本课程的目标受众包括医学生、医生和其他医疗保健专业人员。假定读者对常见的统计学概念(例如,平均值、标准偏差、置信区间、相关系数)有基本的了解,并且熟悉制定临床问题的过程。
还假设读者对 JavaScript 编程有操作上的理解(例如变量声明、数组操作、函数调用等)。虽然 JavaScript 编程不是标准医疗培训的一部分,但对于任何初学者来说,它肯定是最简单的编程语言之一(他们向五年级和六年级的学生教授它)。网上有很多免费的 JavaScript 入门课程,包括来自 Codecademy 、 Learn-JS 和 Mozilla 的课程。
最后,为了跟随实践教程,读者应该能够访问现代 JavaScript 引擎(例如 Google Chrome )和文本编辑器(例如 Visual Studio 代码或括号)。
课程内容
- 第一部分——概述/数据准备
- 第二部分—数据探索
- 第三部分—线性/逻辑回归
- 第四部分-K-最近邻
- 第五部分——集成决策树
- 第六部分—神经网络
- 第七部分—待定
基本术语
在本课程中,我们将试图掩盖机器学习的许多枯燥的理论方面,并专注于机器学习技术的实际应用。然而,回顾一些基本术语是很重要的,这样我们才能理解这些不同的技术是如何相互联系的。
- 人工智能(AI):用计算机算法模拟自然智能。流行的人工智能算法正在模拟的自然智能的一些方面包括视觉感知、自然语言识别和机器学习。
- 机器学习(ML):人工智能领域的一个子域,专注于构建模型来表示现实世界的知识和经验。已经设计了各种机器学习技术,并且它们可以大致分为监督学习、非监督学习和半监督学习。
- 监督学习:一组机器学习技术,通过分析一组训练样本来模拟输入和输出之间的关系。监督学习技术的例子包括线性/逻辑回归、决策树、k-最近邻和神经网络。
- 无监督学习:一组机器学习技术,基于自组织从未标记数据中识别模式。无监督学习技术的例子包括主成分分析、聚类分析和神经网络。
- 神经网络(NN):也称为人工神经网络(ANN),是一种模仿生物神经网络的机器学习技术。神经网络通常由相互连接的节点的集合组成,这些节点松散地模仿生物神经网络中的神经元。
- 深度学习:一组基于神经网络的机器学习技术,使用多层和大量神经元,以达到更高的抽象水平。
项目设置
在整个课程中,我们将探索一个公共领域数据集,名为 500 个城市:改善健康的地方数据,2019 年发布,由疾病控制和预防中心(CDC)提供。该数据集包括与不健康行为(5)、健康结果(13)和预防服务使用(9)相关的 27 种慢性病指标的估计值,这些指标来自美国 500 个最大的城市以及这些城市中大约 28,000 个人口普查区。
我们还将使用一个名为 Toolkit 的开源 JavaScript 库,使用基于 ECMAScript 的统计数据进行研究(DRESS Kit) 来用 JavaScript 实际创建我们的机器学习模型。这个库是用普通的 JavaScript 编写的,可以在任何装有现代浏览器的计算机上运行,不需要任何特殊的软件。与其他流行的机器学习库相比,它的学习曲线要浅得多,例如 Keras 或 TensorFlow ,但它相当快速和强大。
为准备本课程的后续部分,读者应完成以下任务:
1 -创建项目文件夹。
2 -从美国疾病预防控制中心网站下载 500 个城市:改善健康的地方数据,2019 年发布。点击右上角的导出按钮,然后点击 CSV 按钮。将文件另存为项目文件夹中的单独文件夹/data中的data.csv。
3 -从 GitHub 下载礼服套装。点击右侧的版本部分,然后从版本 1.0.1 下载 dress.zip 。将 ZIP 文件中的/js文件夹和/css文件夹复制到项目文件夹中。

作者图片

作者图片
此时,您的项目文件夹中应该有以下文件/文件夹:
数据准备
任何研究项目的数据分析过程的第一步,无论是否与机器学习有关,都是数据准备。这意味着清理数据集,移除不必要的或错误的数据,并将数据文件转换为与所使用的数据分析工具兼容的格式。
整个 500 个城市的数据集超过 200MB,包含 810,000 行数据和 24 列,其中许多是冗余的。我们将通过删除不需要的行和列来精简数据集。我们首先检查与数据集相关联的数据字典。我们可以看到,该数据集包含 28,000 个人口普查区域以及美国 500 个最大城市和整个美国的数据点。出于我们研究项目的目的,我们希望将每个人口普查区域视为一个单独的研究主题。我们就忽略那些市级和国家级的数据点。我们还可以看到,数据集包含每个数据点的粗略患病率和年龄调整后的患病率。为了这个项目的目的,我们将使用粗患病率。

作者图片
1 -通过复制以下代码,在项目文件夹中创建一个名为part1_1.htm的新 HTML 文件。
这个 HTML 文件只是从 DRESS Kit 中加载必要的 JavaScript 库以及我们自己的 JavaScript 文件。
2 -通过复制以下代码,在项目文件夹中创建一个名为part1_1.js的新 JavaScript 文件:
让我们详细地看一下 JavaScript 代码。我们首先使用名为DRESS.local的函数加载data.csv文件。这个函数实际上并不自动加载文件,但是它在 HTML 文件上显示了一个文件输入元素。在用户点击文件输入并选择合适的文件后,回调函数processCSV被调用。最后一个参数设置为false,这样DRESS.local函数就不会试图将内容解析为 JSON 文件。data.csv文件的内容(整个 500 个城市的数据集)作为名为csv的参数传递给processCSV函数。
接下来,我们需要将数据集从 CSV 格式转换成本地 JavaScript 数组。幸运的是,礼服工具包附带了一个专门为此设计的简洁的小功能,它被方便地命名为DRESS.fromCSV。我们只需将csv变量作为参数传递给函数,瞧,数据集就是一个对象数组。
之后,我们通过只选择包含普查区域级别数据和粗略患病率数据的行来过滤数组。正如我们所见,DRESS.fromCSV做的一件好事是将 CSV 文件的每一行转换成一个单独的 JavasScript 对象。我们可以使用相应的头作为属性名,将每个数据点作为对象的属性直接访问,例如row.GeographicLevel。
3 -如上所述,我们希望将每个人口普查区域作为研究对象。理想情况下,我们希望每个主题由一个对象来表示。不幸的是,这 27 种慢性病的每一种都记录在数据集中单独的一行中。我们需要一种方法来将每个普查区域的这 27 个度量值合并到一个对象中。如果我们要在其他预建的统计软件中处理数据集,这样的任务会非常困难,但是因为我们是在一个可编程的环境中工作,所以我们可以用几行代码轻松完成。
因为我们知道每个人口普查区域由一个唯一的标识符标识,所以我们可以使用它将相关的数据点分组到一个对象中。我们还利用这个机会丢弃那些不必要的列。此外,根据对数据集描述的阅读,我们知道不为人口数量少于 50 的人口普查区域提供数据,但由于某些原因,这些人口普查区域仍包含在数据集中。我们需要扔掉那些人口普查小册子。接下来,我们想要将数值,比如PopulationCount和Data_Value转换成数字,这可以在 JavaScript 中通过在变量前加上+符号来轻松完成,记住丢失的数据点由空字符串表示。最后,我们希望将新创建的主题数组保存到一个文件中,以备将来使用。这可以通过使用DRESS.save函数将内容和文件名作为参数传递来轻松完成。
4 -如果我们按原样运行代码,很可能会导致长时间运行的脚本错误。尽管效率很高,但使用 JavaScript 处理超过 200MB 的数据需要一定的时间。为了防止浏览器窗口冻结,我们将利用另一个名为DRESS.async的很酷的小函数,它允许礼服工具包中的任何函数异步执行。该函数返回一个承诺,它将最终解析为异步执行函数的输出。我们可以将 Promise 传递给另一个名为DRESS.print的函数,它用于在 HTML 上显示文本,以便在数据集被处理时显示一个计时器。
以下是最终代码:
在浏览器中打开part1_1.htm,点击文件输入按钮,选择data.csv文件,最后将data.json从浏览器默认下载文件夹复制到项目文件夹内的/data文件夹。
5 -我们选择使用MeasureId来确定慢性病的每一个衡量标准,因为它们很短,但有时很难弄清楚神秘的MeasureId是什么意思。我们可以构建另一个列表,按照Category对这些度量进行分组,并将每个MeasureId映射到度量的详细描述。只需创建另一个名为part1_2.js的 JavaScript 文件,并将其加载到另一个类似于part1_1.htm的 HTML 文件中。运行脚本并将measures.json复制到项目文件夹中以备将来参考。
包裹
让我们回顾一下我们在第一部分学到的内容。我们复习了一些与机器学习相关的基本术语。特别是,我们介绍了几种常见的机器学习算法的名称,如决策树、k-最近邻和神经网络,并讨论了它们如何相互适应。我们通过下载 500 个城市的数据集和设置着装套件来着手设置我们的项目。我们经历了数据准备过程,从数据集中提取有用的数据点。在这个过程中,我们从 DRESS Kit 中学习了几个基本函数,包括DRESS.local(加载本地文件)、DRESS.save(将文件保存到本地机器)、DRESS.fromCSV(将 CSV 文件转换为本地 JavaScript 对象)、DRESS.print(将文本打印到 HTML 上)和DRESS.async(异步执行函数)。
我们还没有真正做任何与机器学习有关的事情,但这将在本课程的后续部分中出现。敬请关注。
锻炼
作为练习,读者可以尝试准备另一个 JSON 文件,其中包含城市级别的数据,而不是人口普查区域级别的数据。
医学中的机器学习——第二部分
针对医生和医疗保健专业人员的机器学习技术实践入门课程。
数据探索

图片由粘土银行从 Unsplash
概述
在本课程的 第一部分中,我们介绍了几种常见的机器学习算法的名称,如决策树、k-最近邻和神经网络,并讨论了它们如何相互融合。我们通过下载一个公共领域数据集 500 个城市数据集并建立一个名为着装套件的 JavaScript 机器学习库来建立我们的项目。接下来,我们完成了数据准备过程,使用 DRESS Kit 中的几个基本函数从数据集中提取有用的数据点,这些函数包括DRESS.local(加载本地文件)、DRESS.save(将文件保存到本地机器)、DRESS.fromCSV(将 CSV 文件转换为本地 JavaScript 对象)、DRESS.print(将文本打印到 HTML 上),以及DRESS.async(异步执行函数)。在第一部分的最后,我们创建了一个 JSON 文件data.json,其中仅包含来自 500 个城市数据集的普查区域级别的粗略患病率数据,这些数据来自那些人口计数至少为 50 的普查轨道。我们还创建了一个 JSON 文件measures.json,它将MeasureId按Category分组,并将每个MeasureId从原始数据集映射到它的定义。
只是作为一个参考点,这里是measures.json的内容。
礼服套件更新
在继续本课程的其余部分之前,请花点时间更新着装套件以发布 1.1.0 。该版本包含几项性能改进和一些新功能,包括生成直方图和热图,我们将在课程的这一部分探讨这些内容。
柱状图
我们通过对数据集进行基本的描述性分析来开始数据探索过程,这样我们就可以大致了解可用数据的质量。特别是,我们要注意是否存在任何缺失或错误的数据点,数字特征的相对范围(我们需要标准化/规范化这些特征吗?)、分类特征的维度(对这些特征进行一键编码是否可行?),以及这些特征的分布(正态、均匀、偏斜等。)
我们再次创建一个名为part2_1.htm的样板 HTML 文件,它加载了 DRESS Kit 以及我们的定制 JavaScript 文件part2_1.js。
我们使用DRESS.local函数加载在课程第一部分创建的数据集。请注意,第三个参数不再设置为FALSE,因为数据集现在存储为 JSON 格式,JavaScript 可以对其进行本地解析。我们将慢性病的所有 27 项指标分配到一个数组中,这样我们就不必一遍又一遍地输入它们。数据科学家使用的最流行和最直接的数据探索技术之一是直方图。它以简洁直观的方式描述了数据集中值的分布。虽然有大量的统计软件包可以生成高质量的多色直方图,但实际上并没有必要,因为直方图的整体思想是它代表了底层数据集的近似。我们可以从直方图的粗略轮廓中收集我们需要的所有信息,直方图可以使用DRESS.histograms函数生成。
在浏览器中打开part2_1.htm,点击文件输入按钮,选择data.json文件,生成基于文本的直方图列表。下面是该函数生成的三个直方图。
每个直方图都提供了几条关键信息。首先,它显示包含非空值的数据点的数量(和百分比)。我们可以看到,CANCER和BPMED度量没有空值,但是COREW度量缺少一小部分(0.4%)数据点。接下来,它计算值的范围(第一个条形代表最小值,条形之间的差异代表间隔,最后一个条形代表最大间隔)。例如,我们可以看到CANCER度量的范围在 0.7 到 22.9 之间。最重要的是,我们可以从条形图中看到值的粗略分布。我们可以看到CANCER指标严重向左倾斜,而BPMED指标严重向右倾斜。相比之下,COREW测量值几乎均匀分布在平均值周围。
DRESS.histograms函数也可以从分类特征生成直方图。只需将分类特性的名称作为第三个参数传递,如下所示:
我们可以看到,来自加利福尼亚州、纽约州和德克萨斯州的数据点构成了数据集的大部分,考虑到美国的人口分布,这并不完全出人意料。重要的是要记住,这个数据集中的每个subject指的是人口普查区域,而不是个人。还值得注意的是,某些州,如特拉华州、缅因州、佛蒙特州、西弗吉尼亚州和怀俄明州,人口普查区非常少,当我们实际使用数据集来构建我们的机器学习模型时,可能会产生一些问题。我们需要记住这一点。
归罪
请注意,数据集中的某些特征(如COREW度量)包含缺失的数据点。在临床研究中,缺失数据是一个相当普遍的问题;参与者可能在研究中途退出,数据可能输入错误,或者数据收集表可能放错了地方。这是大部分统计教材中提出随机缺失(MAR)、完全随机缺失(MCAR)、非随机缺失(MNAR)概念的地方。我们不会浪费时间讨论这些定义背后的无聊理论。可以说,MCAR 不会影响数据分析,但在现实中,几乎不可能证明数据是完全随机缺失的。MNAR 是完全相反的情况,其中数据丢失的原因与丢失数据的值有关。可靠地恢复丢失数据的唯一方法是通过修改数据收集步骤或数据分析步骤来解决根本原因。例如,在一项询问使用电脑时间的在线调查中,那些无法使用电脑(或至少无法访问互联网)的人可能不会出现在数据集中。研究者应尝试亲自收集数据,或者在分析过程中承认研究仅限于那些可以在线访问调查的人。没有一种通用的统计操作可以解决 MNAR。在大多数设计良好的临床研究中,我们处理的是 MAR,它可以通过某种统计方法来解决。一种策略是忽略那些缺失的数据点。我们可以丢弃整个主题,也可以只丢弃缺失的数据点,这取决于我们想要如何分析数据。第二种策略是用合理的估计值代替缺失的数据,这一过程称为插补。可以通过从其他非缺失数据点中随机选择一个数据点(例如,结转的最后观察或结转的基础观察),通过计算算术平均值或模式,或通过某种统计回归分析来计算这种估计。
当我们真正建立我们的机器学习模型时,我们将展示一些基本的插补技术。我们还将了解到,一些机器学习技术可以反过来用作插补技术。
平均值、中间值和众数
更具分析性地探索数据的另一种方法是研究数据集的集中趋势(均值、中值和众数)和离差(方差和四分位间距)。这些特性特别重要,因为许多其他统计方法,如回归分析,都在对它们进行操作,我们经常使用这些特性在两个或更多数据集之间进行比较(即治疗组是否比安慰剂组有更高的平均存活率)。
当然,DRESS Kit 附带了几个内置函数来计算数据集的集中趋势和分散度。
这也是脚本产生的结果的一部分。
DRESS.means函数计算平均值、平均值的 95%置信区间、偏斜度(基于第三个标准化矩)和超额峰度(基于第四个标准化矩)。DRESS.medians函数计算中值、四分位数范围、偏斜度(基于四分位数)和过度峰度(基于百分位数)。最后,DRESS.frequencies函数从一个分类特征中枚举出所有可能的值,并按其出现频率排序(第一个是模式)。
一些非常敏锐的读者可能会指出,数据集中大多数特征的值并不是严格的正态分布,直方图的形状以及显著偏度和过度峰度的存在就是证明。然而,重要的是要注意,当我们处理成千上万的样本时,值是否正态分布就不那么重要了。如果我们应用正式的正态性检验算法,例如夏皮罗-维尔克检验(可以通过使用函数DRESS.normalities轻松完成),我们会发现数据集中的所有特征实际上都不是正态分布的。然而,仅仅因为测试结果在统计上是显著的,并不一定意味着它在实践中是有意义的。这里有一篇出色的评论文章解释了这背后的统计数据。可以说,我们可以在这个数据集上安全地应用大多数参数统计操作,而不用担心潜在的正态性假设。
相互关系
了解了数据集中每个要素的特征后,我们应该将注意力转移到数据集中各种要素之间的关系上。请记住机器学习的整体思想,即基于数据集建立模型,然后使用该模型进行预测。理想情况下,我们希望看到数据集中的各种要素相互独立。换句话说,如果一个数据集中的所有要素都高度相关,那么该数据集实际上并不包含比另一个仅包含其中一个要素的数据集更多的信息。我们还想检查数据集中暴露特征和结果特征之间的任何相关性。如果暴露和感兴趣的结果之间存在简单的线性关系,那么就真的没有必要采用一些复杂的机器学习算法。
当然,DRESS KIT 附带了一个名为DRESS.correlations的函数,它可以自动计算皮尔逊相关系数(或斯皮尔曼等级相关系数)。不幸的是,该函数输出的文本可能很长,很难解释。幸运的是,我们可以使用DRESS.heatmap函数轻松地将文本输出转换成热图。

作者图片
绿色代表正相关,蓝色代表负相关。颜色的深浅表示相关性的强度。红色文字代表统计意义。我们可以看到,乳房 x 线摄影或巴氏涂片与其他特征之间几乎没有相关性,而代谢综合征的大多数组成部分,包括高血压、高胆固醇和糖尿病,彼此高度相关。这里有一个关于多重共线性的精彩在线章节。当我们实际上试图建立和解释我们的机器学习模型时,我们需要记住这一点。
包裹
让我们复习一下第二部分所学的内容。我们经历了数据探索过程的基本步骤。我们首先使用DRESS.histograms函数创建一系列直方图,允许我们识别数据集中值的范围和分布。我们简要讨论了处理缺失数据的不同方法。接下来,我们通过使用DRESS.means、DRESS.medians和DRESS.frequencies计算平均值、中值和众数,重点关注数据集中每个特征的集中趋势和分散度。我们谈到了偏度和峰度的概念,并讨论了在处理大型数据集时,通常不必担心正态分布。最后,我们展示了一种使用DRESS.correlations和DRESS.heatmap函数来评估数据集中各种特征之间相关程度的方法。
现在,我们已经对数据集中的各种特征有了大致的了解,我们准备好继续使用该数据集构建我们的机器学习模型。
医学中的机器学习——第三部分
针对医生和医疗保健专业人员的机器学习技术实践入门课程。
线性/逻辑回归

照片由来自 Unsplash 的 Eanyet Raheem 拍摄
概述
在本课程的第二部分中,我们讲述了数据探索的基本步骤。我们首先通过使用DRESS.histograms生成直方图来调查数据集的分布。然后,我们使用DRESS.means、DRESS.medians和DRESS.frequencies研究了数据集中各种特征的集中趋势和分散程度。我们演示了使用DRESS.heatmap和DRESS.correlations来可视化数据集中各种特征之间的相关程度。同时,我们还引入了缺失值插补的概念。
需要强调的是,正确的数据探索过程涉及大量特定于数据集的分析,并且高度依赖于相关的领域知识。例如,基于这些检测的潜在生物化学,我们预期随机血糖测量值与血红蛋白 A1C 相比有显著更高的差异。类似地,当在普通人群中分析某些实验室值,如 INR 和肌酐时,我们也可以预期有严重的偏态分布。当我们探索一个数据集时,我们必须考虑这些特定于数据集的特征。
礼服套件更新
在继续本课程的其余部分之前,请花点时间更新着装套件以发布 1.2.0 。这个版本包含几个重要的错误修复,包括几个线性/逻辑回归算法。
均值/众数插补
还记得我们的数据集中有一些缺失值吗?让我们从使用最简单的算法来估算这些缺失值开始:均值/众数估算法。该算法背后的基本原理源于大数定律,该定律指出,对于足够大的样本,样本平均值向期望值收敛。如果样本很大,缺失值的数量很少,那么简单地用期望值替换那些缺失值是合理的,因为这不会对大多数参数统计操作的结果产生不利影响。
我们再次创建一个名为part3_1.htm的样板 HTML 文件,它加载了 DRESS Kit 以及我们的定制 JavaScript 文件part3_1.js。
DRESS.meanMode函数有三个参数,第一个是主题数组,第二个是数字特征数组,第三个是分类特征数组。因为在我们的数据集中,所有 27 个慢性病指标都是数字,我们可以忽略第三个参数。值得注意的是,DRESS.meanMode函数只认为null值缺失。数据集中的其他错误或缺失值应在被该函数处理之前转换成null。记住函数通过直接改变输入主题来填充缺失的值也很重要。
ARTHRITIS : 0 (0.00%) = 21.43
BPHIGH : 0 (0.00%) = 30.65
CANCER : 0 (0.00%) = 5.65
CASTHMA : 0 (0.00%) = 9.74
CHD : 0 (0.00%) = 5.60
COPD : 0 (0.00%) = 6.31
DIABETES : 0 (0.00%) = 10.81
HIGHCHOL : 0 (0.00%) = 31.36
KIDNEY : 0 (0.00%) = 3.10
MHLTH : 0 (0.00%) = 13.92
PHLTH : 0 (0.00%) = 12.88
STROKE : 0 (0.00%) = 3.21
TEETHLOST : 60 (0.22%) = 16.11
ACCESS2 : 1 (0.00%) = 16.99
BPMED : 0 (0.00%) = 70.74
CHECKUP : 0 (0.00%) = 69.01
CHOLSCREEN : 0 (0.00%) = 78.74
COLON_SCREEN: 19 (0.07%) = 61.79
COREM : 103 (0.38%) = 31.66
COREW : 109 (0.40%) = 29.83
DENTAL : 0 (0.00%) = 61.23
MAMMOUSE : 37 (0.14%) = 79.19
PAPTEST : 7 (0.03%) = 76.38
BINGE : 0 (0.00%) = 18.07
CSMOKING : 0 (0.00%) = 17.97
LPA : 0 (0.00%) = 27.59
OBESITY : 0 (0.00%) = 30.47
SLEEP : 0 (0.00%) = 36.72
我们可以从打印输出中看到每个特征中缺失值的数量以及用作替换的值。我们将在课程的后面介绍一些更复杂的插补算法。
选择建模技术
大多数机器学习建模技术可以用于创建回归模型(其中输出是连续的数值,例如年龄、体重、身高、实验室值)或分类模型(其中输出是几个不同值中的一个,例如性别、血型、种族),这取决于模型的设置方式。如果调整得当,大多数建模技术都可以提供相当的性能。尽管如此,这些技术在各自的优势和局限性方面有很大的不同。当我们进行实际的研究时,我们应该根据每种技术的独特属性选择最适合我们研究问题的建模技术。
由于我们被限制在本课程的每个部分只使用一种机器学习建模技术,然而,我们必须构建我们的研究问题以适应每种技术的特定属性。
回归分析与机器学习
一些读者可能会问,为什么我们会考虑将线性/逻辑回归作为机器学习模型。毕竟,我们大多数人每天都在研究中使用这些简单的回归技术。让我们花一点时间来讨论这些回归技术的典型使用和它们作为机器学习模型的使用之间的概念差异。在生物医学期刊文章中,线性/逻辑回归几乎总是作为一种工具来证明预测因子和结果之间的联系。例如,在一项关于非酒精性脂肪性肝病(NAFLD)的研究中,作者可能希望表明体重指数(身体质量指数)和血红蛋白 A1C 是 NAFLD 发展的独立预测因子。为了做到这一点,作者将从有/无 NAFLD 的患者中收集各种临床数据,如年龄、性别、医学合并症和实验室值。通过使用逻辑回归,作者可以表明受试者被诊断为 NAFLD 的概率随着他/她的身体质量指数或血红蛋白 A1C 的增加而增加。作者也可以使用相同的模型来表明血清钾水平和 NAFLD 的发展之间没有关联。作者可以更进一步,通过建立一个线性回归模型来证明身体质量指数和 NASH 活动指数之间的线性相关性。这里的关键是,我们使用这些回归技术来证明预测因素和结果之间存在/不存在具有统计意义的关联。
然而,当我们使用线性/逻辑回归构建机器学习模型时,我们的主要目标是最大化模型的预测性能,而我们往往不太关注这些关联的统计意义。我们将讨论如何衡量机器学习模型的预测性能,但暂时假设它与模型的准确性相同。让我们记住统计显著性按照惯例被设置为α0.05,这意味着我们只愿意接受小于 5%的 I 型错误(假阳性)的概率。然而,0.05 这个数字并没有什么神奇之处。事实上,开创统计假设检验概念的统计学家罗纳德·费雪建议根据每个特定的用例来设置 alpha。换句话说,仅仅因为一个预测因子与结果没有统计学意义上的联系,并不意味着它不能提高我们模型的整体准确性。我们也不太关心特定预测因素和结果之间的关联强度。事实上,正如我们将在本课程后面看到的,当我们构建机器学习模型时,我们有时会故意忽略某些预测因素,以尽量减少名为过度拟合的问题。
模型概述

作者图片
线性回归通常用作机器学习模型来解决回归问题(即结果是连续的数字变量)。更重要的是,当有理由假设预测值和结果之间存在线性相关性时,它是最合适的,至少对于感兴趣的值范围是如此。例如,假设我们正在构建一个机器学习模型来预测患者的住院时间,以便优化床位利用率。有理由怀疑患有更多共病的患者会住得更久。相比之下,患者的体温可能不会随着停留时间的长短而线性变化,因为高温和低温都可以预测更长的停留时间。在具有多个预测器的典型机器学习中,不同的预测器可以在不同程度上和相反方向上与结果相关,从而实现一种“智能”,但是当所有其他预测器的值保持不变时,每个预测器应该与结果线性相关。

作者图片
多项式回归可以被认为是线性回归的一种变体。预测值和结果之间的关系不是线性相关(即直线),而是曲线。根据多项式的次数,曲线可能有一个或多个最大值或最小值。换句话说,线性回归只是多项式回归的一个特例,其中多项式的次数设置为 1。通过在机器学习模型中混合线性和多项式回归,有可能创造出更复杂的“智能”。需要高度的领域知识来确定多项式的适当次数。

作者图片
逻辑回归通常用作机器学习模型来解决分类问题,特别是二元分类问题(即是/否、真/假、肯定/否定)。因为逻辑回归模型的原始输出指的是概率(即范围从 0 到 1 的连续数值),所以使用逻辑回归来解决多类分类问题在技术上也是可行的。例如,如果最终结果属于四个可能值(A、B、C 和 D)之一,我们可以创建四个一对其余逻辑回归模型(即 A 对 B/C/D、B 对 A/C/D、C 对 A/B/D、D 对 A/B/D、D 对 A/B/C),将数据集应用于所有四个模型,并选择返回最高概率值的模型。
优势和局限性
线性/逻辑回归作为机器学习模型的优势之一是该技术基于成熟的数学算法。这意味着该算法被大多数统计分析软件包广泛支持。此外,回归公式中的常数清楚地定义了每个预测因子和结果之间的关系,从而使我们能够容易地确定每个预测因子的相对重要性。并且因为最终的模型用一个简单的数学公式简洁地表示,所以它可以很容易地部署到最终的应用程序环境中。

作者图片
线性/逻辑回归作为机器学习模型的局限性之一是,该模型只能支持平滑和连续的决策边界。想象一下,如果我们试图建立一个机器学习模型,将测试对象分类为红圈或蓝叉。很明显,使用简单的数学公式来表示黄线(即决策边界)几乎是不可能的(拥有如此复杂的决策边界是否有益是另一回事;提示:过拟合)。一般来说,如果我们有理由怀疑预测因子随结果线性变化,那么线性/逻辑回归可能是一个合理的选择。
同样需要注意的是,由于潜在的数学运算,线性/逻辑回归只能接受数值预测值。尽管在技术上可以使用一键编码将分类预测值转换成数值,但这种方法并不是最有效的,并且倾向于在最终模型中过度表示那些分类预测值。
线性回归
让我们开始构建我们的第一个机器学习模型。回想一下,数据集中慢性病的 27 个指标可以分为不健康行为(5)、健康结果(13)和预防服务的使用(9)。为了这个练习,让我们假设每个数据点代表一个城市/城镇。我们希望建立一个模型,使我们能够根据那些不健康的行为和预防服务的使用来预测每个城市/城镇的整体健康结果。
构建我们的机器学习模型所需的实际代码相当简单。我们只需将数据集、感兴趣的结果和一组预测值传递给DRESS.linear函数。
*[PHLTH] R2: 0.92 aR2: 0.92 AIC: 7545.95 F: 20313.37 p: -0.00
(intercept) : +13.30 (95% CI 12.76 - 13.84) t: +48.21 p: 0.00
ACCESS2 : 0.00 (95% CI -0.01 - 0.00) t: -1.18 p: 0.24
BPMED : +0.08 (95% CI 0.07 - 0.08) t: +35.55 p: 0.00
CHECKUP : -0.04 (95% CI -0.04 - -0.03) t: -13.44 p: 0.00
CHOLSCREEN : +0.06 (95% CI 0.06 - 0.07) t: +24.56 p: 0.00
COLON_SCREEN: +0.05 (95% CI 0.05 - 0.06) t: +20.28 p: 0.00
COREM : -0.04 (95% CI -0.05 - -0.04) t: -22.08 p: 0.00
COREW : -0.06 (95% CI -0.06 - -0.05) t: -23.98 p: 0.00
DENTAL : -0.12 (95% CI -0.12 - -0.11) t: -57.71 p: 0.00
MAMMOUSE : -0.01 (95% CI -0.02 - -0.00) t: -2.85 p: 0.00
PAPTEST : 0.00 (95% CI -0.00 - 0.00) t: -1.37 p: 0.17
BINGE : -0.20 (95% CI -0.20 - -0.19) t: -69.55 p: 0.00
CSMOKING : +0.29 (95% CI 0.29 - 0.30) t: +78.25 p: 0.00
LPA : +0.07 (95% CI 0.06 - 0.07) t: +18.34 p: 0.00
OBESITY : -0.02 (95% CI -0.02 - -0.01) t: -7.75 p: 0.00
SLEEP : -0.09 (95% CI -0.09 - -0.08) t: -32.70 p: 0.00*
从输出中注意到的第一件事是,模型的决定系数(不要与相关系数混淆)为 0.92,考虑到我们没有对模型进行任何优化,这是相当令人印象深刻的。我们还可以看到,除了PAPTEST和ACCESS2之外,所有的预测因子都与结果有显著的统计学相关性。这很可能是因为数据集中的数据点数量巨大。我们需要问自己的一个问题是,包含所有这些预测因素是否真的提高了模型的预测能力。评估统计模型的相对质量的一种方法是使用一种称为 Akaike 信息标准 (AIC)的衡量标准,这在本质上是一种平衡衡量模型拟合度和模型简单性的方法。基本上,我们需要使用预测因子的各种排列构建一系列模型,计算每个模型的 AIC,并找到 AIC 最低的模型。当然,手动完成这项工作可能相当繁琐,因此我们将依赖于 DRESS KIT 中一个名为DRESS.forward的内置函数,这是一个使用 AIC 作为选择标准的逐步特征选择算法。
完成该函数可能需要 30 秒,因为它需要从整个数据集构建多个模型。它证实了我们的怀疑,即PAPTEST和ACCESS2预测器没有增加模型的预测能力,应该被排除在最终模型之外。值得注意的是,这只是评估我们模型质量的许多不同方法之一。如果我们使用不同的质量度量,例如调整 R2 或贝叶斯信息标准,我们可能会得到不同的结果。同样重要的是要注意,这种逐步特征选择算法本质上使用整个数据集进行训练和验证*,并且易于过拟合。在本课程的后续部分,我们将介绍验证模型性能的其他技术。*
现在我们已经建立了一个机器学习模块的模型,让我们实际上尝试使用它来进行一些预测。同样,这里的概念是,我们是公共卫生专家,我们希望能够根据那些不健康的行为和预防服务的使用来预测一个城市/城镇的整体健康结果。
我们的模型预测,在这个假设的城市/城镇中,大约 12.24%的成年人在过去一年中身体健康状况不佳的时间> =14 天。
逻辑回归
让我们继续进行逻辑回归。如上所述,这种机器学习技术通常用于解决二元分类问题。我们需要想出一个可以用二元回答来回答的研究问题。假设我们想要确定糖尿病患病率高于平均水平的城市/城镇,以便对资源分配进行优先排序,我们可以构建一个逻辑回归模型来实现这一点。
首先,我们需要将数字健康结果DIABETES转换成二进制值(1 代表糖尿病患病率高于平均水平的人群,0 代表其他人群)。我们可以参考本课程的第二部分,以获得该数据集中糖尿病的平均患病率。我们将新的二元结果标记为DM。与构建线性回归模型的方式类似,我们可以通过将数据集、感兴趣的结果和一组预测值传递给DRESS.logistic函数来创建逻辑回归模型。
*[DM] R2: 0.78 AIC: 8221.85 deviance: 28776.42 p: 0.00
(intercept) : -29.38 OR: 0.00 (95% CI 0.00 - 0.00) z: -20.89 p: 0.00
ACCESS2 : +0.06 OR: 1.07 (95% CI 1.05 - 1.09) z: +6.61 p: 0.00
BPMED : +0.54 OR: 1.72 (95% CI 1.66 - 1.77) z: +35.34 p: 0.00
CHECKUP : -0.16 OR: 0.85 (95% CI 0.83 - 0.88) z: -11.41 p: 0.00
CHOLSCREEN : +0.14 OR: 1.15 (95% CI 1.12 - 1.18) z: +10.87 p: 0.00
COLON_SCREEN: +0.02 OR: 1.02 (95% CI 1.00 - 1.05) z: +2.23 p: 0.03
COREM : -0.11 OR: 0.89 (95% CI 0.88 - 0.91) z: -13.49 p: 0.00
COREW : -0.08 OR: 0.92 (95% CI 0.90 - 0.94) z: -8.36 p: 0.00
DENTAL : -0.22 OR: 0.80 (95% CI 0.79 - 0.82) z: -24.09 p: 0.00
MAMMOUSE : +0.01 OR: 1.01 (95% CI 0.98 - 1.04) z: +0.57 p: 0.57
PAPTEST : +0.02 OR: 1.02 (95% CI 1.02 - 1.02) z: +14.94 p: 0.00
BINGE : -0.34 OR: 0.71 (95% CI 0.69 - 0.73) z: -23.05 p: 0.00
CSMOKING : -0.20 OR: 0.82 (95% CI 0.79 - 0.84) z: -12.60 p: 0.00
LPA : +0.07 OR: 1.07 (95% CI 1.04 - 1.10) z: +4.36 p: 0.00
OBESITY : +0.16 OR: 1.17 (95% CI 1.15 - 1.19) z: +17.66 p: 0.00
SLEEP : +0.22 OR: 1.24 (95% CI 1.22 - 1.27) z: +19.09 p: 0.00*
我们可以看到未经优化的原始模型的决定系数为 0.78,这是相当合理的。我们可以使用DRESS.forward函数进一步优化我们对预测值的选择,尽管在这种特殊情况下,这样做似乎不会显著提高拟合优度。就像逻辑回归的情况一样,我们可以通过传递一个假设的城市/城镇作为参数来使用模型进行预测。
尽管逻辑回归通常用于解决二进制分类问题,但predict函数的结果不是二进制值,而是代表结果发生概率的连续数值。为了将范围从 0 到 1 的数值转换成二进制值(即,该城市/城镇的糖尿病患病率是否高于平均水平),我们需要确定一个合适的截止值,要么根据经验将其设置为 0.5,要么使用测试统计来帮助最大化分类函数的性能。一个这样的测试统计是尤登指数,它代表了敏感性和特异性之间的权衡。利用模型的roc函数,我们可以自动计算出接收机工作特性曲线以及尤登指数。
roc函数将一组主题作为参数,这些主题可以是原始数据集,也可以是另一个验证数据集。结果显示曲线下面积(AUC) 或一致性统计(C 统计)为 0.99,这表明该模型能够以近乎完美的准确度区分阳性和阴性结果。结果还表明,最佳截止值为 0.44。
包裹
让我们复习一下第三部分所学的内容。我们引入了一种称为均值/众数插补的缺失值插补方法(使用DRESS.meanMode)。我们讨论了决策边界的概念,以及使用线性/逻辑回归进行回归分析和使用它进行机器学习之间的重要概念差异。我们经历了构建线性/逻辑回归机器学习模型(使用DRESS.linear和DRESS.logistic)以及使用该模型进行预测(使用model.predict)的实际过程。在这个过程中,我们谈到了一种称为前向选择(DRESS.forward)的特征选择技术和一种称为 Youden 指数的测试统计,用于确定逻辑回归模型的最佳临界值。
模型摘要
线性/逻辑回归
强项
- 易于实施(受大多数统计分析软件支持)
- 易于优化(只需选择合适的预测值)
- 易于解释(预测因素和结果之间的关系已明确定义)
- 易于部署(模型可以用一个简单的数学公式来表示)
限制
- 平滑、连续的决策边界
- 仅适用于数值预测值
锻炼
作为练习,让我们尝试建立一个模型来预测一个假设城镇/城市的癌症患病率,以及一个模型来识别基于健康结果的结肠癌筛查率< 50%的城市/城镇。注意根据研究问题选择合适的建模技术以及相关的预测因子。
医学中的机器学习——第四部分
针对医生和医疗保健专业人员的机器学习技术实践入门课程。
k-最近邻

概述
在本课程的 第三部分中,我们探索了我们的第一个机器学习模型——线性/逻辑回归。我们讨论了使用线性/逻辑回归进行回归分析和使用它进行机器学习的概念差异。我们讨论了该技术的优势和局限性,并演示了使用服装工具包构建模型以及使用模型进行预测的步骤。
重要的是要强调,尽管围绕一些更高级的机器学习技术(如随机森林和神经网络)有很多争论,但由于其简单性,线性/逻辑回归仍然是临床研究中非常有用的机器学习技术。许多风险评分系统,如 Framingham Risk Score 和 MELD-Na Score,在功能上与基于线性/逻辑回归的机器学习模型相同,即使这些评分系统可能不是完全由算法得出的。
礼服套件更新
在继续本课程的其余部分之前,请花点时间更新着装套件以发布 1.2.5 。这个版本包含了我们将在这里使用的 kNN 算法的一个特性更新。
模型概述
k-最近邻(kNN)的工作基于相似对象行为相似的假设。与大多数其他机器学习技术不同,kNN 模型不试图“学习”预测器和结果之间的关系。事实上,kNN 模型的构建通常不需要太多的训练阶段,只需要以内存高效的格式存储整个训练数据集以供以后检索。当需要进行预测时,模型会确定测试主题与训练数据集中每个主题之间的相似度,根据相似度挑选出顶部的k训练主题(邻居),并通过计算这些k主题的模式(对于分类问题)或均值(对于回归问题)返回感兴趣的结果。因此,kNN 的判定边界不是一条光滑的直线,而是一个半径为k的圆。

作者图片
当我们需要实现 kNN 模型时,有三个超参数需要考虑:模型中要包含的预测值、用于测量相似度的度量(例如,曼哈顿距离、欧几里德距离或闵可夫斯基距离)以及k的值。
优势和局限性
kNN 技术的优势之一是它的简单性;没有复杂的数学运算。该算法只是在训练数据集中找到与测试对象最相似的对象。该算法可以处理数值和分类预测值(只要实现支持从分类值计算距离度量)。最令人印象深刻的是,同一个模型可以用来预测多种结果,只要它们共享相同的预测因子。这种独特的性质使得 kNN 模型不仅可以用于解决分类或回归问题,还可以用于群组匹配和缺失值插补。
kNN 技术的主要限制之一是在进行预测时计算效率低。每次我们使用模型进行预测时,算法都需要计算训练数据集中每个对象的距离度量,并根据距离度量对整个训练数据集进行排序。在生产环境中部署模型也相当麻烦,因为必须重现整个训练数据集。
kNN 技术也有一些性能限制。因为预测结果是前k个邻居的平均值,所以它永远不会超出训练数据集中观察到的值的范围。例如,考虑只有一个预测值(身高)和一个结果(体重)的 kNN 模式。如果最高的训练对象是 6 英尺高,200 磅重,那么这个训练对象将是任何 6 英尺或更高的测试对象的最近邻居,因此预测结果将是 200 磅左右。此外,kNN 模型易于出现异常值,因为该算法在预测阶段考虑整个训练数据集,并且每个训练对象被视为邻居的概率相同。
履行
让我们开始建立一个 kNN 模型。类似于我们如何构建线性/逻辑回归模型,我们将考虑使用预防服务和不健康行为作为预测因素,以建立一个机器学习模型,帮助我们预测一个假设的城市/城镇的健康结果。
kNN函数最多接受四个参数。第一个是一系列训练科目。第二个是用作预测器的一组数字特征。第三个,如果指定的话,是用作预测器的分类特征的数组。最后一个指定在进行预测之前是否应该对预测值进行归一化。默认情况下,预测值是归一化的,这意味着每个预测值的最大距离为 1,并且每个预测值对距离度量的贡献是相等的。
首先要注意的一点是,在构建 kNN 模型时,我们不必指定感兴趣的结果。并且打印输出不包含任何数字或统计信息,除了用于建立模型的预测器的名称。这是因为除了提取预测值并将其存储在内存中之外,该算法在此阶段实际上并没有做太多工作。
为了使用 kNN 模型进行预测,我们需要提供一个测试主题并指定结果,无论是分类问题还是回归问题,以及可选的k的值。
我们可以看到 kNN 模型的优势之一是能够使用相同的模型对不同的感兴趣的结果进行预测(只要我们认为应该使用相同的预测器)。我们还可以看到,使用 kNN 模型解决分类问题非常容易。不需要做任何一键编码。
模型性能
性能指标
使用 DRESS Kit 构建一个功能性的 kNN 模型一点也不困难,但是我们应该问问自己,如果我们优化一些与模型相关的参数(或者更准确地说是 hyper 参数),我们是否可以创建一个更好的模型。这些超参数包括k的值、特征选择和特征缩放。然而,在我们讨论优化过程之前,我们必须首先定义我们将如何度量一个模型的性能。如果给我们两个模型,我们如何决定哪一个更好?
评估模型性能的基本思想是量化预期结果和预测之间的差异。直观上,我们可以理解,如果预测与预期结果完全相同,则该模型被认为是完美的。如果预测是以平均预期结果为中心的随机值,那么该模型被认为是无用的。关键是找到一个合适的统计方法来量化这种差异。
对于回归问题,最常用的统计度量是决定系数(R2)平均绝对误差 (MAE),或者均方根误差 (RMSE)。MAE 和 RMSE 都代表了预期结果和预测之间的平均差异,但 RMSE 对大误差的惩罚比对小误差的惩罚更大(因为平方),而 MAE 没有考虑每个误差的大小。R2 是一种无单位的度量,范围从负无穷大到 1(完美)。它代表了预期结果与预测的匹配程度(从技术上来说,它衡量的是预测所解释的预期结果中的差异比例)。这不要与相关系数 ®相混淆,后者仅表示两个变量相互跟随的程度(当一个变量的值上升时,另一个变量也会上升,反之亦然)。
对于分类问题,最常用的统计指标是准确度(被正确分类的受试者的比例)精确度(被正确分类的受试者在被预测为某一类别的所有受试者中的比例,也称为阳性预测值)召回率(某一类别的受试者被正确分类到该类别的比例,也称为真阳性率)和 F 得分

作者图片
交互效度分析
由 DRESS Kit 生成的每个机器学习模型都包含一个performance函数,该函数可用于生成适当的性能度量。我们将首先演示一个简单但不幸不正确的方法来使用这个函数。
计算性能指标需要几分钟时间(脚本可能会在完成前超时),因为算法必须对所有 28,000 名受试者进行预测,并根据所有这些数据点计算决定系数。我们可能会惊喜地发现 R2 的值是 0.98(接近完美),直到我们意识到自己的错误。请记住,kNN 算法的工作原理是从训练数据集中找到与测试主题相似的主题。如果我们使用来自相同训练数据集的测试主题,那么该算法必然会从训练数据集中找到与测试主题相同的主题。因此,它会产生一种模型运行良好的错觉。
计算模型的性能度量的正确方法是使用不与定型数据集重叠的验证数据集。有三种方法可以创建这样的验证数据集。在一项精心设计的研究中,研究者可能会从外部站点招募额外的受试者(以声称该模型经过外部验证)。另一种方法是保留原始数据集的一部分(通常为 20%)作为验证数据集,只使用剩余的 80%作为训练数据集。这种方法的缺点是减少了训练数据集的大小。最流行的方法是进行所谓的 k 倍交叉验证。其思想是,我们将原始数据集分成k部分,使用第一部分进行验证,其余部分用于训练。然后,我们再次重复这个过程,第二部分用于验证,其余部分用于训练。重复该过程,直到每个零件都被用于一次验证和k-1次训练。最后,我们通过取平均值来报告性能度量。

作者图片
为了使用 DRESS Kit 中的DRESS.crossValidate函数执行交叉验证,我们需要指定机器学习模型、数据集以及创建和验证模型所需的超参数。代码有点复杂,因为我们需要将这些超参数作为两个独立的数组传递。可选地,我们可以使用DRESS.async异步调用该函数,以防止脚本超时。
最佳化
K 值
大多数人想到的第一个优化,也可能是最不重要的,是k的值。直观地,我们可以理解,如果k太大(例如,整个训练数据集的大小),那么模型将不会非常准确,因为它将不会做出更好的类似预测(即,欠拟合)。如果k太小(例如 1),那么该模型在应用于验证数据集时也不会非常准确,因为它容易在训练数据集中产生噪声(即过拟合)。k的最佳值高度依赖于训练数据集中的噪声量(或结果值的随机变化)。

作者图片
确定k最佳值的唯一方法是对一系列值进行交叉验证。也就是说,在大型数据集(如我们正在处理的数据集)中,训练数据集通常几乎均匀地分布在样本空间中,因此k值的微小变化不会显著影响预测。例如,考虑下图,其中红色的星代表训练对象,绿色的星代表测试对象。我们可以看到,与右侧的数据集相比,左侧数据集的k值为 3 和k值为 4 之间的差异要大得多。此外,DRESS Kit 使用的 kNN 算法实际上是一种加权 kNN 算法,这意味着它考虑了训练对象和测试对象之间的距离度量,并减少了高度不相似的对象的影响,即使它们被包括在内。

作者图片
特征选择
对于 kNN 机器学习技术来说,更重要的优化是特征选择,即用于构建模型的预测器。直观地,我们可以理解,如果预测值与结果没有关系(例如,SSN 和身体质量指数的最后 4 位),那么模型的性能可能会受到包含这种预测值的不利影响。与可以自动最小化无关紧要的预测器的影响的一些其他机器学习技术不同,kNN 模型中包括的每个预测器都对距离度量有贡献。选择最佳的特性集需要大量的领域知识,但是我们也可以使用交叉验证来验证我们的选择。
为了证明正确的特征选择的重要性,我们将引入两个填充了随机值的预测值,以观察它们如何影响模型的性能。
我们可以看到,包含两个随机生成的预测值实际上会降低整体性能并减慢模型的速度。
特征缩放
对于 kNN 机器学习技术来说,同样重要的优化是特征缩放。默认情况下,kNN 算法会在构建模型之前对所有预测值进行归一化。这样做是为了使具有更宽范围的特征(例如,血小板计数,其值的范围可以从<50 to > 250)对距离度量具有与具有更窄范围的特征(例如,肌酸酐,其值通常在~1 到< 10 之间)相同的效果。凭直觉,我们可以想象,如果我们要建立一个 kNN 模型来预测接受结肠镜筛查的患者中结肠息肉的数量,息肉综合征家族史将是比抑郁症家族史更强的预测因素。我们可以通过放大或缩小来设置每个预测器的“强度”。不幸的是,没有办法通过算法来确定最佳比例。需要大量的领域知识和反复试验。
归罪
kNN 算法最常见的应用之一是缺失值插补。我们之前已经介绍了一种简单的插补技术,用均值或模式替换缺失值。虽然均值/众数插补在缺失值很少的大型数据集中工作得相当好,但每个缺失值都会被相同的替换值替换。kNN 插补本质上是均值/众数插补的更高级版本,它不使用整个数据集的均值/众数,而是使用与缺失值受试者相似的受试者的均值/众数作为替代。
为了实现 kNN 插补算法,我们只需将受试者分为没有缺失值的受试者和有缺失值的受试者。接下来,我们使用前者来构建一个 kNN 模型,并在后者中找到每个主题的顶部k邻居。最后,我们将均值/众数插补技术应用于基于那些k邻居的缺失值。
ACCESS2 : 1 (0.00%)
BPMED : 0 (0.00%)
CHECKUP : 0 (0.00%)
CHOLSCREEN : 0 (0.00%)
COLON_SCREEN: 19 (0.07%)
COREM : 103 (0.38%)
COREW : 109 (0.40%)
DENTAL : 0 (0.00%)
MAMMOUSE : 37 (0.14%)
PAPTEST : 7 (0.03%)
BINGE : 0 (0.00%)
CSMOKING : 0 (0.00%)
LPA : 0 (0.00%)
OBESITY : 0 (0.00%)
SLEEP : 0 (0.00%)
插补算法足够智能,可以识别那些具有缺失(空)值的受试者,并根据那些没有缺失值的受试者计算适当的替代值。
群组匹配
kNN 算法的另一个常见应用是群组匹配。在大多数回顾性研究中,为了计算相关的风险比或优势比,有必要确定一个对照组(一组没有结果或暴露的受试者)。理想情况下,实验组和对照组应该在每个方面都几乎相同,除了结果或兴趣的暴露。因为 kNN 算法被设计为基于相似性来识别主题,所以它非常适合这个目的。
ACCESS2 : [93] 27.08 (95% CI 25.33 - 28.84) SD: 8.64 SKW: 1.55 KUR: 2.82 vs [93] 26.82 (95% CI 25.03 - 28.62) SD: 8.81 SKW: 1.31 KUR: 1.60 z: +0.20 p: 0.84
BPMED : [93] 80.90 (95% CI 79.98 - 81.82) SD: 4.53 SKW: -0.15 KUR: 0.64 vs [93] 78.79 (95% CI 78.00 - 79.59) SD: 3.93 SKW: -0.28 KUR: -0.27 z: +3.38 p: 0.00
CHECKUP : [93] 76.15 (95% CI 74.93 - 77.36) SD: 5.98 SKW: -0.77 KUR: -0.21 vs [93] 75.72 (95% CI 74.58 - 76.85) SD: 5.59 SKW: -1.07 KUR: 0.23 z: +0.51 p: 0.61
CHOLSCREEN : [93] 76.13 (95% CI 75.01 - 77.25) SD: 5.50 SKW: -0.27 KUR: 0.18 vs [93] 75.85 (95% CI 74.86 - 76.85) SD: 4.89 SKW: -0.61 KUR: 0.32 z: +0.37 p: 0.71
COLON_SCREEN: [93] 46.24 (95% CI 44.92 - 47.57) SD: 6.51 SKW: -0.18 KUR: -0.40 vs [93] 47.24 (95% CI 46.05 - 48.42) SD: 5.84 SKW: -0.03 KUR: 0.02 z: -1.10 p: 0.27
COREM : [93] 18.36 (95% CI 17.40 - 19.31) SD: 4.69 SKW: 0.31 KUR: 2.34 vs [93] 18.80 (95% CI 17.89 - 19.71) SD: 4.49 SKW: 0.14 KUR: 2.93 z: -0.66 p: 0.51
COREW : [93] 17.26 (95% CI 16.38 - 18.14) SD: 4.32 SKW: 0.90 KUR: 7.91 vs [93] 17.56 (95% CI 16.84 - 18.29) SD: 3.57 SKW: -0.11 KUR: 7.89 z: -0.53 p: 0.60
DENTAL : [93] 33.08 (95% CI 31.80 - 34.36) SD: 6.30 SKW: 0.79 KUR: 1.38 vs [93] 35.03 (95% CI 33.86 - 36.21) SD: 5.78 SKW: 0.86 KUR: 1.69 z: -2.20 p: 0.03
MAMMOUSE : [93] 79.43 (95% CI 77.65 - 81.21) SD: 8.76 SKW: -8.00 KUR: 69.73 vs [93] 80.78 (95% CI 80.21 - 81.36) SD: 2.83 SKW: -0.72 KUR: -0.25 z: -1.42 p: 0.16
PAPTEST : [93] 81.95 (95% CI 80.15 - 83.75) SD: 8.86 SKW: -8.50 KUR: 75.74 vs [93] 82.59 (95% CI 80.79 - 84.40) SD: 8.89 SKW: -8.62 KUR: 77.13 z: -0.49 p: 0.62
在上面的例子中,我们将身体健康结果(PHLTH)差于 25%的受试者定义为实验组。我们的目标是建立一个对照组,在预防服务的使用方面与实验组相匹配。我们基于其余受试者构建一个 kNN 模型,并使用该模型的match函数为每个实验受试者确定一个控制受试者。最后,我们通过计算两组的平均值来评估匹配的质量。我们可以看到,除了使用降压药(BPMED)和看牙医(DENTAL)之外,两组之间使用预防服务的所有其他措施都相当。
概述
让我们复习一下第四部分所学的内容。我们讨论了 kNN 机器学习算法的优势和局限性,并在 DRESS Kit 中演示了实现它的代码(DRESS.kNN)。我们继续讨论各种度量,包括回归问题的决定系数、平均绝对误差和均方根误差,以及分类问题的准确度、精确度、召回率和 F 分数,用于评估机器学习模型的性能(model.performance)。我们还介绍了交叉验证技术(DRESS.crossValidate),作为一种使用相同数据集进行训练和验证的方法。我们继续讨论 kNN 建模技术的各种超参数的优化,例如k的值、特征选择和特征缩放。最后,我们展示了使用 kNN 算法作为缺失值插补技术(model.impute)以及群组匹配技术(DRESS.match)。
模型摘要
K-最近邻
强项
- 易于实现(距离度量计算相当简单)
- 易于解释(算法只是寻找相似的主题)
- 使用数字和分类预测器
- 可用于分类、回归、群组匹配和插补
限制
- 预测速度慢(需要为每次预测计算整个训练数据集的距离度量)
- 难以部署(模型由整个训练数据集组成)
- 无法在训练数据集之外进行推断
- 倾向于离群值
医学中的机器学习——第五部分
针对医生和医疗保健专业人员的机器学习技术实践入门课程。
集成决策树

Steven Kamen ar 在 Unsplash 上拍摄的照片
概述
在本课程的 第四部分中,我们探讨了 k 近邻(kNN)。我们演示了使用 DRESS Kit 构建 kNN 模型的步骤,以及使用该模型进行预测的步骤。我们绕道讨论了各种模型性能指标,包括回归问题的决定系数、平均绝对误差和均方根误差,以及分类问题的准确度、精确度、召回率和 F 分数。在讨论 kNN 算法特有的各种优化技术之前,我们还介绍了交叉验证技术。最后,我们展示了使用 kNN 算法作为缺失值插补技术以及队列匹配技术。
回想一下,线性/逻辑回归模型的局限性之一是其平滑和连续的决策边界。与线性/逻辑回归模型相比,kNN 模型的一个主要优势是它能够创建任意大小的循环决策边界(基于k的值)。决策树模型通过允许创建任意的决策边界而代表了进一步的改进。
礼服套件更新
在继续本课程的其余部分之前,请花点时间更新服装套件以发布 1.2.9 。该版本包含对随机森林和梯度推进机器算法的显著性能改进。
决策图表

决策树。图片作者。
模型概述
在讨论集成决策树之前,我们必须首先介绍一个决策树的概念。决策树通常被描述为流程图。从决策树的顶端(矛盾地称为根)开始,通过特定标准将数据集分成两组(例如,年龄大于 50,血红蛋白小于 7g/dL,性别等于男性,既往病史包括糖尿病等。),符合标准的主体属于一个群体,不符合标准的主体属于另一个群体。每个组(通常称为节点)根据另一个标准再次分成两个。重复该过程,直到满足一些预定义的停止标准。当我们需要使用决策树模型进行预测时,我们只需从根开始跟随该树,一直行进到末端节点(没有进一步分割的节点),并通过取属于该末端节点的那些主题的平均值(对于回归问题)或模式(对于分类问题)来计算结果。
直观地,我们可以理解决策树模型的性能如何受到分裂标准的选择的影响。完全无用的决策树模型是简单地将一个节点随机分成两部分的模型,因为这种模型的预测能力不会比随机猜测更好。因此,为了构建一个有用的决策树模型,我们必须在分割后尽量减少随机性的程度。有几种方法可以测量机器学习模型中的随机性。最常用的有分类问题的基尼杂质和熵/信息增益和回归问题的方差。就本课程而言,了解基尼系数、信息增益或方差背后的数学原理并不重要。可以说,当这些指标下降到零时,与该节点相关的所有主题都具有相同的结果值,进一步分割该节点没有任何好处。为了构建一个最优的决策树模型,该算法只需要找到分裂准则,该准则在其后代节点中产生最低程度的总随机性。
优势和局限性
基于上面的描述,我们可以很容易地看到决策树如何能够支持任意的决策边界。层中的每个节点都独立于同一层中的其他节点运行。假设我们根据 60 毫米汞柱的平均动脉压(MAP)将受试者分为两组,然后我们可以根据一个标准(例如,7g/dL 的血红蛋白水平)将那些具有低 MAP 的受试者分为两组,并根据不同的标准(例如,不同的血红蛋白水平或完全不相关的因素,如性别或身体质量指数)将那些具有高 MAP 的受试者分为两组。
我们还可以看到决策树本质上是 if-then-else 语句的级联。这意味着决策树可以对数字特征和分类特征进行操作(只要您可以基于特征构造 if-then-else 语句,它就可以作为决策树中的一个节点)。这也意味着决策树可以在预测阶段以极快的速度运行。不需要复杂的矩阵乘法、求幂或排序。最后,很容易解释决策树模型的结果。为了理解预测是如何做出的,我们只需要手动地从根开始跟踪树。
决策树建模技术的一个小限制是不能在每个节点考虑多个预测器。例如,如果数据集只包含身高和体重作为预测因素,但结果实际上与身体质量指数更相关,决策树模型可能无法有效地捕捉这种关系。然而,决策树模型的主要限制是有过度拟合的倾向。这部分是由于决策树模型创建任意决策边界的能力,部分是由于随着树变得更深,节点数呈指数增长。

曲线拟合。图片作者。
考虑一个有 1000 名受试者的假设数据集。让我们假设每个受试者都可以通过预测因子的组合来唯一识别,这并不是完全不现实的,例如,考虑到两个受试者具有完全相同的身体质量指数、血红蛋白水平、血小板计数、收缩压、心率和总胆固醇水平的几率。我们能否构建一个决策树模型,保证在应用回训练数据集时 100%准确?答案是肯定的。事实上,它只需要一个深度为 10 (2 ⁰ = 1024)的决策树。一个 20 层的树可以唯一识别超过 100 万个主题。集成决策树模型背后的整个思想是克服单个决策树模型容易过度拟合的事实。
随机森林/额外树木模型
模型概述
随机森林的基本假设是,一些预测值和结果之间的关系可以由一组决策树(许多许多树,因此是一个森林)来表示,每个决策树只对关系的某个方面进行建模。这有点像古代亚洲盲人摸象的寓言。每个人只能根据他与大象有限的互动来欣赏大象的某些特征,但是他们一起对大象的描述相当准确。我们也可以把随机森林/额外的树看作一种民主或多数统治。

盲人和大象。图片由 CC0 大都会艺术博物馆通过维基共享资源提供。
用于在随机森林模型中创建决策树集合的技术被称为打包,这是自举和聚合的结合。自举是指用替换采样的过程。例如,我们有一个 9 个受试者的池,我们想通过引导创建一个 7 个受试者的样本,我们将选择一个受试者(例如受试者 A) 而不从池中删除它。当我们需要选择下一个科目时,再次选择科目 A 的概率不变。Bootstrapping 允许我们创建彼此之间以及与原始数据集完全不同的样本,但是所有样本加在一起应该类似于原始数据集的分布。假设原始数据集的性别分布是 60:40,通过自举创建的每个样本的性别分布可能不完全是 60:40,但是如果我们生成大量样本,所有这些样本的性别分布作为一个整体将接近 60:40。

装袋。图片作者。
随机森林模型用来最小化过度拟合的第二种技术被称为特征子空间,它简单地限制了每个决策树所使用的特征的选择。这防止了与结果高度相关的某些预测器被选为每个决策树中的分裂标准。通过使用 bagging 和特征子空间,随机森林算法可以创建大量决策树,每个决策树都在一个样本上训练,该样本来自数据集但不完全相同,并且仅捕获某些预测器和结果之间的关系。在预测阶段,该算法将测试主题应用于森林中的所有树,并基于平均值(对于回归问题)或模式(对于分类问题)计算最终预测。其思想是,预测者和结果之间的关系“重要”将被大多数树捕获,而那些无关紧要的关系将在聚合过程中被抵消或消除,因为它们仅被森林的一小部分捕获。
额外的树(或者极度随机化的树)非常类似于随机森林,但是提供了一些计算上的优势。在随机森林模型中,每个决策树仍然充当常规决策树,并基于最佳分裂标准来分裂节点,这可能在计算上是昂贵的,尤其是对于数字特征。相反,额外树算法随机选择分裂标准。只要生成的决策树比一个完全无用的决策树(基于像基尼系数、熵和方差这样的指标)执行稍好一点,它就会被森林接受。每棵树也在整个数据集上训练,因此消除了装袋步骤。尽管额外的树具有计算优势,但这两种建模技术的准确性是相当的(示例在这里和在这里)。
优势和局限性
随机森林/额外树相对于单个决策树的优势是显而易见的——抵抗过度拟合,但它也有一些缺点。因为由这两种技术创建的模型是由数百个决策树组成的,所以在生产环境中部署这些模型可能具有挑战性。解释模型也很困难,因为要分析的决策树数量太多,而且有些树的表现可能很差。
随机森林/额外树的另一个缺点是这些算法的概率性质。我们之前学习的线性/逻辑和 kNN 算法是确定性的,这意味着每次应用相同的训练数据集时都会创建完全相同的模型。相比之下,随机森林/额外树算法使用的装袋、特征子空间和随机分裂技术会引入一定程度的随机性,并在每次应用训练数据集时创建完全不同的模型。一个模型可能比下一个模型表现得更好或更差,这使得模型优化更具挑战性。
履行
现在有足够的基本理论,让我们开始建立我们的第一个集合决策树模型。DRESS Kit 确实附带了一个名为DRESS.randomForest的函数,但是它实际上在内部实现了额外的树算法以提高计算效率。
因为我们所有的预测值都是数值型的,所以我们将它们作为第三个参数传递给DRESS.randomForest函数,并将一个空数组作为第四个参数传递(它接受一个分类预测值数组)。我们还将第五个参数设置为false,因为我们正在构建一个回归模型。模型本身的打印输出并不包含很多信息,除了正在建模的结果和一个seed值,通过将DRESS.SEED全局变量设置为该值,该值可用于在未来重新创建完全相同的模型。
我们可以使用该模型进行预测,就像礼服工具包中的任何其他机器学习模型一样。
为了创建分类模型,我们简单地将DRESS.randomForest函数的第五个参数设置为true。
最佳化
在我们讨论可以在我们的随机森林(实际上是额外的树)模型上完成的各种优化之前,让我们回忆一下如何使用DRESS.crossValidate和DRESS.async来评估机器学习模型的性能。事实证明,默认的超参数设置远远没有优化我们想要做的事情。
树木计数
首先想到的优化是森林中的树木数量。直观上,我们可以看到,如果模型仅由几棵树(例如 5-10 棵树)组成,并且每棵树只对预测因子的子集进行操作,则最终模型可能无法捕捉预测因子和结果之间关系的某些方面。然而,一旦我们达到了足够数量的树,进一步的增加往往不会提高整体性能,相反,会大大降低模型的效率。训练 1000 棵树需要的计算能力是训练 100 棵树的 10 倍,但不太可能将精度提高 10 倍。一般来说,我们可以从 50-100 棵树开始,然后通过增加一倍来逐步增加树的数量,直到模型性能开始稳定。

树木计数。图片作者。
树深
在优化中,树的深度比树的数量起着更重要的作用。直观地,我们可以看到,如果树深度设置为 1,那么每棵树将只有 2 个结束节点。即使有大量的树,该模型也不会非常准确,因为正态分布曲线两端的结果值会被接近平均值的结果值超过。这个问题对于具有不均匀类别分布的多类别分类模型尤其重要。因为模型的最终预测是通过从所有树中取模式来计算的,所以如果每个树中的端节点的数量明显小于类的数量,则那些罕见的类几乎永远不会被选为模式。相反,如果树深度设置得太高,过度拟合可能会变得更加明显。

树的深度。图片作者。
子空间比率
随机森林/额外树算法的一个同样重要的优化是特征子空间比率,因为它是最终模型随机性的主要来源之一(bagging 比率和随机分割标准分别是随机森林和额外树的另一个来源)。换句话说,子空间比率控制欠拟合和过拟合之间的平衡。考虑由强预测器和弱预测器的组合构成的模型,通过将子空间比率设置为 1,弱预测器可能被包括在一些树中,当应用回训练数据集时,所得模型将非常准确,但是当应用到独立验证数据集时,将表现不佳,即过拟合。如果子空间比率设置为 0,那么该模型是完全无用的,因为它没有考虑任何预测值。需要大量的反复试验来确定特定模型的最佳子空间比。

子空间比率。图片作者。
功能选择
像任何其他机器学习模型一样,特征选择是模型性能的基础。与单个决策树的情况一样,集合决策树一次只能基于一个预测因子来分割节点,因此,向算法提供适当的预测因子(例如,身高和体重与身体质量指数)是很重要的。与线性/逻辑回归和 kNN 相比,决策树模型受弱预测器的影响较小(假设子空间比率超参数被适当调整),并且根本不受特征缩放的影响。
梯度推进机
模型概述

梯度推进机。图片作者。
虽然它仍然被认为是一个集成决策树模型,但梯度推进机与随机森林/额外树有很大不同。每个决策树都试图减少前一个决策树产生的错误,而不是成为一个多数人统治的民主国家。梯度推进机器中的决策树被排列成链。第一个决策树就像任何其他单个决策树一样,通过模拟预测器和结果之间的关系来运行。第二个决策树对第一个决策树产生的残差进行建模,但方向相反(即正的变为负的,负的变为正的)。然后,将训练集一起应用于第一和第二决策树,并且通过第三决策树对残差进行建模(再次在相反的方向上)。重复该过程,直到剩余误差可以忽略或者已经添加了预定数量的树。
优势和局限性
根据 Kaggle 上许多机器学习竞赛的结果,当调整得当时,梯度增强机器似乎优于随机森林/额外树木模型。然而,这种性能的提高是有代价的。梯度增强机器的训练时间比随机森林/额外树长得多,因为每次创建新树时,必须将整个训练数据集应用于工作模型,以便计算残差。训练阶段不能被并行化,因为每个树都依赖于先前树产生的残差。梯度推进机器也不能很好地处理多类分类问题,因为每个类都需要一个单独的决策树链。解释结果模型也要困难得多,因为除了第一个决策树之外,该模型关注的是预测值和残差之间的关系,而不是结果值。最后,梯度增强机器比随机森林/额外树模型更容易过度拟合。
履行
除了调用DRESS.gradientBoosting而不是DRESS.randomForest之外,创建梯度增强机器几乎不需要修改用于创建随机森林/额外树木模型的代码。请注意,由于每次创建新的决策树时都要应用整个训练数据集,因此完成代码所需的时间要长得多。
最佳化
数树
根据一般经验,梯度推进机器可以使用更少的决策树实现与随机森林/额外树模型相当的性能水平。这部分是因为这样一个事实,即通过设计,在随机森林/额外树模型中不是所有的决策树都是有用的,而在梯度推进机器中,每个决策树都将残余误差减少一定量。向梯度推进机器添加太多的树会显著增加训练时间(随着残差的减小,创建最优决策树可能会更加困难),并且最终会导致过拟合。

树木计数。图片作者。
树深
就像树计数一样,梯度推进机器通常可以实现与使用较浅决策树的随机森林/额外树模型相当的性能水平。这是由于剩余误差倾向于在几棵树后集中在中心界限周围,结果,需要由每棵树处理的随机性程度(即均方误差)很小。拥有一个过深的树是梯度增强机器中过拟合的一个常见原因。

树的深度。图片作者。
子空间比率
子空间比率对于梯度增强机器的工作方式与对于随机森林/额外树模型的工作方式有些不同,至少对于着装套件实现是这样。在训练阶段,子空间比率被应用于训练数据集,而不是特征。因为每个决策树只对来自训练数据集子集的残差建模,所以选择小的子空间比率可以减少训练时间。正如所料,选择一个大的子空间比率会导致过度拟合。

子空间比率。图片作者。
学习率
学习率决定了每个决策树对多少残差进行建模。它通常被设置为 0.1 到 0.3 之间的一个小数字,这意味着每个决策树将只试图解释 10-30%的残差,而剩余的 70-90%的残差将由后续的决策树处理,这些决策树对训练数据集的不同子集进行操作(由子空间比率超参数确定)。事实上,这两个超参数是防止梯度推进机器过度拟合的主要保障。然而,将学习率设置得太低会导致欠拟合,或者需要通过高树计数来补偿,这会降低模型的效率。

学习率。图片作者。
特征重要性
回想一下我们在本课程的第三部分中讨论过的将线性/逻辑回归用作机器学习模型和将其用作传统回归分析技术之间的概念差异。虽然机器学习模型不是设计来评估预测器/特征和结果之间是否存在统计上显著的关联,但有时确定特定特征/预测器是否重要仍然是有用的。如果某个特征被认为不重要,那么在没有所述特征的情况下重建模型可能更有效。在线性/逻辑模型中,很容易识别那些不重要的特征。在 kNN 模型中,每个要素都同等重要(除非某些要素的缩放比例不同,并且关闭了归一化标志)。如何客观地度量集成决策树模型中某个特征的重要性?
请记住,决策树的目标是减少数据集中的随机程度。测量特征重要性的一种方法是计算与每个特征相关的随机程度的减少。例如,在分类模型中,我们可以计算整个训练数据集的基尼系数,以及每次分割后的基尼系数。每次分割前后基尼系数的差异反映了被用作分割标准的特征所降低的随机性程度。我们只需要计算与每个特征相关的基尼系数杂质的总减少量,就可以量化它的重要性。在回归模型中,我们可以通过计算每次拆分前后方差的差异来获得相同的结果。
方便的是,由 DRESS Kit 创建的集合决策树模型带有一个内置函数(model.importance),该函数根据基尼不纯度或方差自动计算特征重要性。
LPA : 1209.08
OBESITY : 1038.83
DENTAL : 1020.85
CSMOKING : 877.34
COLON_SCREEN: 605.89
COREW : 584.14
BINGE : 573.65
SLEEP : 464.21
COREM : 383.77
BPMED : 380.73
ACCESS2 : 311.41
CHECKUP : 149.87
PAPTEST : 128.30
CHOLSCREEN : 110.00
MAMMOUSE : 60.40
基于打印输出,我们可以得出结论:LPA(年龄> =18 岁的成年人在闲暇时间没有体育活动)是模型中最重要的预测因素,比MAMMOUSE重要几个数量级。如果我们建立两个模型,一个有和一个没有MAMMOUSE预测器,我们可以看到这两个模型之间没有性能差异。
包裹
让我们回顾一下我们在第五部分学到的内容。我们介绍了决策树作为机器学习模型的概念,并讨论了它的优势和局限性,特别是过度拟合的风险。我们讨论了随机森林模型是如何通过使用诸如装袋和特征子空间等技术来降低过度拟合的风险的。我们还介绍了额外树模型,并解释了如何使用它作为随机森林的计算效率更高的替代品。我们继续演示使用DRESS.randomForest构建额外树模型的代码,并讨论了各种优化点。然后,我们继续讨论另一个集合决策树模型,梯度推进机,以及它与随机森林/额外树模型的比较。我们再次展示了构建梯度推进机器DRESS.gradientBoosting的代码,并讨论了它的优化。最后,我们回顾了使用model.importance函数评估特性重要性的步骤。
模型摘要
随机森林/多余树木
优势
- 支持任意决策边界
- 使用数字和分类预测器
- 非常快地做出预测
- 不易过度拟合
限制
- 难以解释(涉及许多采油树,有些设计表现不佳)
- 难以优化(要考虑许多超参数,算法不确定)
梯度推进机
优势
- 支持任意决策边界
- 使用数字和分类预测器
- 非常快地做出预测
- 性能优于随机森林/额外树
局限性
- 仍然倾向于过度拟合
- 训练要慢得多
- 难以解释(大多数树模拟残差而不是结果)
- 难以优化(要考虑许多超参数,算法不确定)
锻炼
作为练习,尝试创建一个随机森林模型和一个梯度推进机器来预测一个假设的城市/城镇中的癌症患病率。通过以系统的方式调整各种超参数,专注于优化模型。创建一个表来跟踪超参数值变化时模型性能的变化可能是有用的。
医学中的机器学习——第六部分
针对医生和医疗保健专业人员的机器学习技术实践入门课程
人工神经网络

概述
在本课程的 第五部分中,我们探讨了两种集成决策树算法,随机森林/额外树和梯度推进机。我们首先讨论了单一决策树模型的优势,以及更重要的局限性。我们引入了装袋和子空间的概念,作为最小化过度拟合的手段。我们演示了使用服装工具包构建随机森林/额外树木模型以及渐变加速机器的步骤。我们还研究了这两种建模技术的各种优化技术。最后,我们讨论了计算特征重要性的概念和算法。
集成决策树模型相对于 kNN 和逻辑/线性回归的一个主要优势是它们支持任意决策边界的能力,但是决策树中的每个节点一次只能对一个特征进行操作。人工神经网络代表了能够实现高级抽象的进一步改进。
礼服套件更新
在继续本课程的其余部分之前,请花点时间更新服装套件以发布 1.3.0 。此版本包含对神经网络算法的重大功能改进和更改,以及新数据转换算法的添加。
模型概述
人工神经网络的工作原理是假设存在一个可计算的函数,将预测值映射到结果。顾名思义,人工神经网络是受生物神经网络的启发。每个人工神经元是人工神经网络的基本操作单元,是生物神经元的功能抽象。它接受来自网络中上游神经元的一个或多个输入,就像生物神经元通过其树突接受来自上游神经元的信号一样。在生物神经元中,如果膜电位达到某个去极化阈值,就会触发一个动作电位,并沿着轴突传递到下游神经元。在人工神经元中,输入由激活函数(加上一些其他数学运算)处理,输出被传输到下游神经元。

神经元。图片作者。
我想到的第一个问题是,一个相互连接的人工神经元网络是如何学习任何东西的。关键在于上述的数学运算。每个输入乘以两个神经元之间连接固有的权重因子,并且每个神经元固有的另一个因子(称为偏差)在最终值被激活函数处理之前被添加到所有加权输入的总和。神经网络可以通过调整这些权重和偏差来“学习”新信息。
需要注意的是,人工神经网络只是一个统称。根据人工神经元之间的连接方式,可以创建各种机器学习模型。最基本和最常用的人工神经网络被称为多层感知器。

多层感知器。图片作者。
在多层感知器中,神经元排列在离散的层中。同一层中的所有神经元共享相同的激活函数。特定层中的每个神经元都与下一层中的所有神经元相连。要创建一个多层感知器,首先必须确定层数、每层中神经元的数量以及每层中使用的激活函数。网络中的权重和偏差首先被初始化为一些随机值。然后将训练样本按顺序或分批输入到模型中,并将模型的输出与训练数据集中的真实值进行比较。最初,模型的输出会非常不准确,但是误差通过模型反向传播到网络中的每一层神经元。调整与每个连接相关联的权重和与每个神经元相关联的偏置,以便减少整个网络的误差。通过多次重复这些正向传播和反向传播步骤,多层感知器可以慢慢地学习预测值和结果值之间的关系。

向前和向后传播。图片作者。
反向传播过程背后的详细数学相当复杂,涉及求解一系列偏导数。可以说,这些导数函数的结果允许权重和偏置以与每个神经元的输出误差相反的方向和成比例地被调整。
优势和局限性
一般来说,多层感知器和人工神经网络的最大优势是它支持高级抽象的能力。事实上,人工神经网络被认为是通用函数逼近器,这意味着只要有足够数量的相互连接的神经元和层,它们就可以逼近几乎任何已知的函数。换句话说,理论上,人工神经网络可以模拟预测者和结果之间的任何关系,即使这种关系本质上是随机的。
多层感知器的另一个优势是它能够同时模拟多个结果,方法是将网络的输出层设置为所需的结果数,并指定适当的损失函数。如果我们需要建立一个模型来预测几个不同但多少有些关联的结果,这可能会非常方便。例如,我们可以建立一个模型来预测自发性细菌性腹膜炎发作后 30 天的死亡率和 1 年的全因死亡率。
这种逼近预测者和结果之间任何关系的能力伴随着几个重要的权衡。首先,训练一个多层感知器计算量很大。每次向前和向后传播都涉及多个矩阵计算。与集成决策树模型相比,通常需要大得多的训练数据集来训练人工神经网络。训练过程通常包括重复整个训练数据集数百或数千次。
其次,众所周知,人工神经网络很难优化。必须考虑神经元的层数、每层中神经元的数量、每层中激活函数的选择、权重/偏差初始化的方法、学习速率、退出率、训练周期的数量、损失函数以及一系列其他高级优化参数。给定上述长的训练时间,通常很难系统地测试超参数的所有排列。
第三,人工神经网络起到了黑匣子的作用。通过检查这些权重和偏差的值来解释神经网络如何以及为什么做出某个决定实际上是不可能的。事实上,在相同数据集上训练的具有相同结构并且具有相似性能的两个神经网络可能具有非常不同的权重和偏差集。此外,因为每个神经元都连接到下游层的所有神经元,所以预测器都混合在网络的更深层。不可能准确地确定一个特定的预测器如何影响网络的结果。
第四,人工神经网络只对数值型预测因子起作用,需要大量的数据准备(将不同预测因子的值归一化,并转换其分布),才能达到良好的效果。
履行
让我们开始建立我们的多层感知器。正如我们前面提到的,训练一个神经网络在计算上是很昂贵的,所以为了避免脚本超时错误,最好异步进行。
该脚本与我们用来创建随机森林/额外树木模型或梯度推进机器的脚本略有不同。让我们详细了解一下这些变化。我们不直接调用DRESS.multilayerPerceptron函数,而是调用DRESS.async,这是 DRESS Kit 中的一个实用函数,支持异步函数调用。第一个参数是我们希望异步运行的 DRESS Kit 函数的名称。需要注意的是,我们不是将实际的函数作为参数传递,而是将函数的名称作为字符串传递。后续参数的传递方式与我们同步调用DRESS.multilayerPerceptron的方式相同。DRESS.async函数返回一个 JavaScript 承诺,一旦函数完成,它将最终解析为一个结果对象。这里有必要回顾一下异步编程的基本概念。为了对结果对象进行操作,我们需要调用与承诺对象相关联的.then函数,并传递一个箭头函数作为参数。arrow 函数应该接收结果对象作为参数。
由于 JavaScript 固有的局限性,Promise 对象解析的结果对象不包含任何可执行函数。在我们可以调用model.predict函数或另一个与模型相关的函数之前,我们必须重建模型。幸运的是,可以通过将结果对象再次同步传递到DRESS.multilayerPerceptron中来轻松高效地完成。我们将整个 Promise 对象和then函数一起传递给DRESS.print,它将自动显示一个计时器来帮助我们跟踪异步函数调用的进度。我们从then函数中返回预测结果,这样它也可以由DRESS.print函数显示。
我们可以通过将结果代入state并将分类标志代入true来构建分类模型,但重要的是要注意,分类模型的训练时间要长得多,因为构建所有 50 个状态的模型所需的神经元数量要大很多倍。
在线培训
在人工神经网络的训练阶段,应用每个训练样本来更新网络的权重和偏差,并且之后不再需要。因此,人工神经网络的训练过程可以顺序进行。我们可以用一个小数据集(甚至只有一个样本)来训练模型,测试模型的性能,并在更多的训练样本变得可用和必要时应用它们,而不是一次性应用整个数据集。
我们可以通过将训练数据集分成多个批次并一次应用一个批次来模拟这种在线训练行为。首先,我们通过调用DRESS.multilayerPerceptron使用第一批训练样本构建一个多层感知器,然后使用model.performance测试性能,并使用model.train应用额外的训练样本。我们可以从打印输出中看到,模型的性能在最初几批中波动很大,但在训练过程结束时会有所改善和收敛。
值得注意的是,为了使用这种在线训练方法建立分类模型,我们必须确保第一批训练样本包含所有可能的结果值,因为神经网络的输出层是在模型首次由DRESS.multilayerPerceptron函数建立时设置的。通过model.train应用额外的训练样本不会改变神经网络的布局。
最佳化
优化人工神经网络可能相当具有挑战性。我们将从评估模型的基线性能开始。请注意,交叉验证时间相当长,因为算法需要建立和训练五个独立的模型。
在我们详细研究每个超参数之前,重要的是要强调一些优化技术可能是特定于实现的,这意味着根据底层代码,某些优化可能比其他优化具有更高的产量,而某些超参数可能由于特定于实现的限制而不可用。例如,多层感知器的服装工具包实现只支持亚当优化器,但是还有其他几个优化器,比如 RMSProp 和 AdaGrad 。
网络布置
设计神经网络时,我们需要考虑的第一件事是神经网络的结构。通常,多层感知器的输入层被设置为与模型中预测器的数量相同的大小,而输出层被设置为回归模型中预测器的数量或分类模型中不同类别的数量。隐藏层(输入和输出之间的层)中的神经元数量基本上没有限制。以一种过于简化的方式,我们可以将隐藏层中的每个神经元视为控制输入信号如何流向输出层的决策单元。通过增加每层神经元的数量,理论上,网络可以处理预测者和结果之间更复杂的关系。当然,拥有大量神经元的缺点是训练时间更长。拥有太多的神经元也会导致过度拟合,尽管由于其他的正则化技术,这对于多层感知器来说一般不是问题。
增加多层感知器的层数也会增加网络处理复杂问题的能力,但方式不同。由于隐藏层中的每个神经元都完全连接到相邻层中的所有神经元,因此更深层中的神经元同时基于多个预测器的组合来做出决策。因此,添加层使网络能够达到更高的抽象级别。然而,重要的是要注意,增加额外的层会成倍地增加训练时间。(即,具有一个大小为 10 的隐藏层和另一个大小为 20 的隐藏层的网络具有 200 个连接,而具有三个大小为 10 的隐藏层的网络具有 1000 个连接)。一般来说,具有 2-3 个隐藏层的多层感知器对于大多数应用来说已经足够了。
默认情况下,多层感知器的 DRESS Kit 实现有两个隐藏层,该算法使用简单的启发式算法来确定每层神经元的适当数量。我们可以通过指定layout超参数来改变模型的结构。以下是我们尝试过的几种不同布局的结果。我们可以看到,基于 5 重交叉验证,网络的决定系数 (R2)没有显著变化,尽管从[5,3](意味着 5 个神经元的隐藏层后接 3 个神经元的隐藏层)到[20,10](20 个神经元的隐藏层后接 10 个神经元的隐藏层)增加了大量神经元。与此同时,训练时间几乎翻了两番。有趣的是,我们还看到,增加额外的层实际上会降低性能,并成倍增加训练时间。
[5] R2 0.94
[7] R2 0.95
[10] R2 0.96
[15] R2 0.96
[3, 3] R2 0.93
[5, 3] R2 0.94
[7, 5] R2 0.94
[10, 5] R2 0.95
[10, 10] R2 0.96
[20, 10] R2 0.96
[7, 5, 3] R2 0.95
[10, 7, 5] R2 0.94
[7, 5, 5, 3] R2 0.93
激活功能
设计神经网络时要考虑的下一个超参数是使用的激活函数。激活函数的主要目的是给网络引入非线性。有各种各样的激活功能,每种功能都有其独特的操作特性。好消息是,泄漏整流线性单元(Leaky ReLU)已被证明在大多数情况下比其他激活功能提供更好的性能。除非有非常具体的理由考虑另一个激活函数,否则在多层感知器的所有隐藏层中使用 Leaky ReLU 通常是安全的。
世
在训练过程中,有多种方法可以将训练数据集应用于网络。在传统的梯度下降算法中,整个数据集一次性应用于网络,平均损失反向传播以更新所有神经元的权重和偏差。这种方法需要大量的内存和计算能力。另一种被称为随机梯度下降的方法是一次对一个样本进行前向和后向传播。还有批量梯度下降,其中样品以小批量应用。无论如何应用训练数据集,仅通过网络应用一次是不够的。为了优化所有神经元的权重和偏差,需要许多周期或时期。显然,如果纪元设置得太高,训练过程将会非常慢,并且还会增加过度拟合的风险。
25 R2 0.92
50 R2 0.93
100 R2 0.94
250 R2 0.95
500 R2 0.96
稀释
有许多用于减少人工神经网络中过拟合的正则化技术,其中之一是稀释。稀释的概念有点类似于集合决策树模型中子空间的概念。它包括在训练过程中随机关闭一小组神经元,这样这些神经元的权重就不会对输出做出贡献。最终结果是,在每个周期中,每个神经元仅在整个训练数据集的一部分上被训练,并且那些在特定周期中没有被关闭的神经元被迫学习额外的信息。稀释的一个意想不到的好处是,通过关闭某些神经元,训练时间也略有减少,因为不需要对这些神经元进行反向传播。
0.10 R2 0.94
0.25 R2 0.95
0.50 R2 0.96
0.75 R2 0.95
0.90 R2 0.94
学习率
大多数神经网络实现支持学习率超参数,有时称为alpha。这个想法类似于集合决策树模型。它限制了每次反向传播过程中权重和偏差的变化量。这最小化了异常值的影响,并防止那些权重和偏差的值过度波动(并导致一些神经元在 ReLU 激活的情况下被关闭)。高学习率可能导致梯度下降算法在最佳点附近振荡,而不是收敛到最佳点,而低学习率可能需要高历元计数的补偿(因此需要更长的训练时间)。
0.0005 R2 0.95
0.001 R2 0.95
0.005 R2 0.95
0.01 R2 0.94
0.05 R2 0.88
动力
如果学习速率很小,则标准随机梯度下降算法收敛到最优点会很慢。理想情况下,该算法应该在开始时以较高的学习速率开始,并在接近最佳点时逐渐降低速率。许多基于动量的优化算法使用这种技术来加速训练过程。DRESS Kit 实现使用的 Adam 优化器支持与动量相关的超参数beta1和beta2。这些超参数的默认值适用于大多数用例。
其他类型的人工神经网络
正如我们前面提到的,多层感知器只是许多人工神经网络类型中的一种。大多数多层感知器只需要几个隐藏层就能很好地工作。虽然没有正式的定义,但包含许多(例如几十个)隐藏层的多层感知器有时被称为深度神经网络。
除了建立分类和回归模型,人工神经网络还可以执行其他任务。Autoencoder 是一种人工神经网络,它执行无监督的学习任务,如降维和特征提取。卷积神经网络通常用于图像处理,因为它对特征之间的空间关系敏感。生成式对抗网络可用于生成具有与训练数据集相同的统计数据的新样本。
包裹
让我们复习一下第六部分所学的内容。我们讨论了人工神经网络的基本解剖,并解释了相互连接的人工神经元网络如何能够通过向前和向后传播来执行学习。我们演示了使用DRESS.multilayerPerceptron和DRESS.async异步构建多层感知器的代码。我们还演示了使用在线训练方法构建和训练多层感知器的代码。我们探讨了各种超参数,并讨论了全面优化人工神经网络的挑战。最后,我们谈到了除了分类和回归之外的人工神经网络的其他用例。
模型摘要
多层感知器
强项
- 支持任意决策边界
- 支持高级抽象
- 可以同时模拟多种结果
- 不易过度拟合
限制
- 仅适用于数值预测值
- 黑箱操作
- 训练缓慢
- 难以优化
生产中的机器学习:为什么这么难,这么多失败?
行业笔记
您是否努力部署和维护您的模型?大多数公司都这样做,原因如下

Jupyter 笔记本不是生产解决方案(来源
根据的一篇集体论文分析了 300 多个组织中机器学习的发展,这些项目是公司面临的一些最大挑战。其他研究也显示,数据科学家经常抱怨他们的模型只是有时或者从来没有投入生产。
困难造成一波失望和遗忘项目的原因是什么?让我们考虑一下发生了什么变化。在传统的 IT 项目中,代码版本决定软件版本。在机器学习项目中,模型的版本是由代码的版本和数据的版本定义的。在等式中引入一些表格是否有可能对项目的复杂性以及成功产生如此巨大的影响?
对代码变更的反应导致了 DevOps 专业化和数百种竞争服务的发展,或多或少地促进了持续集成和持续交付。另一方面,机器学习项目是关于对代码和数据的变化做出反应,这至少会增加难度,正如我将在本文中向您证明的那样。
因为反馈回路较长
处理数据带来了全新的挑战。而软件通常可以在本地开发,并有一个即时反馈环,反馈一行新代码如何影响最终结果。您编写一个测试,检查只有绿灯亮着,然后继续前进。在机器学习中,反馈循环从同一个地方开始,但可能会在你完成模型训练的几个小时后结束。
即使您正在处理一个不大的数据集,并且您的模型不需要大量的图形卡,您也可能注定要等待几个小时来调优超参数。更重要的是,培训必须循环进行(本文后面会详细介绍),因此有一个额外的过程要转移到远程环境中。
在本地机器上工作的另一个限制是数据集的大小。要用表格数据填充哪怕是几年前的笔记本电脑的硬盘驱动器(大多数这样的项目都有机器学习),数据集必须有数十亿行,数百列。然而,我们有项目使用音频,图像和视频。虽然可以在数据集的一部分上试验和开发模型,这是常见的做法,但最终的评估是在整个数据集上进行的。
此外,在 ML 社区中有越来越多的声音不要在本地机器上进行实验,即使这是可能的,因为最终训练过程无论如何都必须在云中进行。越早到达越好。
版本代码、数据和型号
没有人能够想象一个没有版本控制系统的商业项目。多亏了它,我们可以方便地协作并回到过去。因为是代码的版本创建了软件的版本,有了版本控制系统,我们可以在任何时候构建应用程序的任何变体。机器学习就不是这样了。
首先,工作的结果不是代码,而是模型。而这一个又是由创建和训练模型的代码版本及其使用的数据产生的。因此,如果您想在使用机器学习开发项目时拥有相同的时间机器,您需要对代码、数据以及理想情况下的模型进行版本化。

一个版本的代码和数据创建一个模型版本(源)
嘿,等一下。你读了一段时间,你喜欢这篇文章吗?不要犹豫,鼓掌跟随。只需要 2 秒钟就能帮上忙。完成了吗?谢谢!
为什么我应该版本化模型,而不仅仅是数据?
您已经创建了一个新模型,并将其交付到生产中。一切都很好,但只是暂时的。也许模型在新数据上表现不佳,或者它太复杂,使得它更难处理更多的流量。您需要撤销更改。如果不对模型进行版本化,这会有什么影响?您需要在以前版本的代码和数据上训练新模型吗?这需要多长时间:5 分钟还是 2 天?哪怕不到一刻钟,训练模型的时候出现问题怎么办?
模型版本控制是一份保险单,您以云存储服务账单的形式每月支付一次分期付款。成本取决于您想要存储的版本数量和模型的大小。我们来估算一下它的成本。假设你正在做一个成熟的项目,这个项目有多达 1000 个深度机器学习模型,每个模型重 500 MB。每月供款约 23 美元。
测试数据至少和模型一样好
有时浮出水面并发现显而易见的东西是值得的,而不是一直沉溺于细节。你可能会同意阅读的速度就是看的速度。你读书的速度不会比你转动眼球的速度快。在 ML 的上下文中,很明显,模型的好坏取决于用来训练它的数据。虽然这是老生常谈,但不止一次听到这种(看似)陈词滥调时,我注意到和我交谈的人眼中闪烁着光芒。这有什么寓意?至少和模型一样测试数据。
我们输入模型的数据已经有了很大的进步。它可能已经访问了生态系统中的许多地方,在这段旅程中,它被照顾得有时更好,有时更差。另一方面,我们从这些疲惫的流浪者身上得出结论。而且,我们也不知道未来会有什么数据来找我们。我们能够并且应该自动化测试它。重要的是,数据测试应该在训练和实时预测中保持一致。它应该显示错误和失败,可能会发生在原来的生产者在未来。
问题是,虽然该模型可以从错误的数据中进行预测,但问题是这种行为何时会被发现。对模型来说,房子是有 3 间卧室还是负 8 间卧室并不重要。然而,并不是所有的测试都如此明显。例如,如果预期的数据是英文文本,测试将确保最常见的单词是“the”、“a”。如果其他词出现的频率更高,可能意味着我们处理的不是预期的语言。
测试车型
虽然大多数种类的模型是确定性的(相同的输入总是产生相同的输出),但它们也更难测试,因为它们的本质是动态发现不断变化的数据的重要特征。模型需要定期刷新,因为数据总是越来越多,数据的性质也在不断变化。这在实践中意味着什么?未来的房地产估价模型会对同样的房子给出不同的价格。
测量模型的质量时,会检查数据的拟合度。如果太差,我们就只有一个差的模型。然后,它无法从给它学习的数据中得出好的结论,更不用说它从未见过的未来数据了——这被称为欠拟合。相反的情况,就是契合度太强的时候,也不好。该模型在接受训练的数据上表现不错,但它无法对以前没有见过的数据做出良好的推断,这被称为过度拟合。从整个数据集的角度来看,太弱和太强的拟合是融合,并且在训练阶段进行测量。对于模型评估来说,这两个值是最重要的。**问题在于针对具体案例测试和检测扰乱行为。**解决方案是监控。
实时反应

生产模因中的意外问题(图片由作者提供)
定义模型中令人烦恼的行为或不稳定性,并编写测试在部署到产品之前检测它们是一个标准包。但检测生产中的异常,尤其是当模型实时响应时,则是另一回事,因为模型会遇到从未见过的数据,必须立即做出响应。同样,问题可能出在数据本身,它是从系统的另一部分流入的,与训练数据相反,它是无人管理的,或者出在模型的本质上,它只是没有为新数据做好准备。此外,异常偏离的单个预测仍然可能是正确的。那么,我们如何监控模型以利用其潜力,同时仍然对其退化行为做出响应呢?
在传统的应用程序中,我们通过测量每秒的请求数来监控硬件(RAM、CPU)的使用情况和应用程序本身。基于这些指标,我们可以实时做出反应,例如通过扩展应用程序或通过阻止给定 IP 地址来检测由系统错误和良好用户引起的可疑行为。
监控模型还包括观察它随时间的行为。将该行为或其返回的预测与基线值进行比较。例如,对于预测房地产价格的模型,训练集中的平均房价为 40 万英镑,而对于昨天返回的最后 100 个预测,平均值为 50 万英镑,这将敲响警钟。换句话说,模型监控是将输入数据和预测的统计属性与监督学习期间的统计属性进行比较。
即使预测是正确的(即,平均房价在很长一段时间内保持在正确的水平),影响特定预测的因素也很重要。回到房地产的话题,假设我们的模型预测房价 40 万。然而,事实证明,这个决定更多地受到车库面积的影响,而不是卧室的数量。训练数据中没有 120 平方英尺的房子。制成车库。毕竟生产中不可能出现那种情况!
解释和说明模型决策的领域本身是一个专业领域,但主要与在模型调整和评估期间证明模型行为有关,而不是作为一个监控实时生产系统的工具。
持续交付和持续培训
虽然在真空中工作的代码非常令人满意,但现实是只有交付到生产中的软件才能满足预算。
持续集成和持续交付是一组旨在自动化部署和日常代码工作的实践,以便每一项更改都能够顺利到达远程环境。在教科书应用程序中,构建和部署新版本的唯一原因是代码的变化。这一个可以通过引入新的功能或者修复一个 bug 来触发。我们更改代码,站在生产大门前,展示从 test runner 收集的绿色贴纸,如果没有其他颜色纠缠,应用程序就开始生活在现实世界中。如果它支持的数据库增长两倍,您不必部署相同版本的代码。当在线商店中出现一个新的瓷器收藏时,没有理由编写负责向我们的电子商务提供杯子的代码。
和这次不同。模特老了,过一段时间就没用了。这一次,为了改变,是通过数据。新模式出现、趋势改变、产品出现的数据。推荐电影的模型不会推荐它在训练阶段没有看过的电影(不是在所有推荐系统的实现中),AI 支持的导航不会为高速公路的新路段建议路线。这个问题的解决方案是循环的、定期的模型训练。正如您所看到的,不仅仅是代码变化导致新模型被训练。这意味着您需要创建和维护一个额外的流程。
摘要
如果你想做机器学习,这些真的有必要吗?不,这是为了增加你到达终点的机会和减少你的维修费用。MLOps 的一个新的专业化旨在解决上述问题,以便统计和神经网络专家能够专注于他们的工作。
虽然不是每个 ML 项目都需要解释实时预测,虽然几乎每个项目都比传统应用程序更复杂,但大多数项目都应该对数据进行版本化,并实施持续的培训过程。
在开始项目之前认识到这一点是个好主意。Jupyter 笔记本不是生产解决方案。通过在开始之前回答重要的问题,我们可以避免埋没几个月的工作,或者至少防止错误,为我们节省几天或几周的时间。
行动号召
你的观点是什么?你的 ML 项目进展如何?是在生产吗?请在评论区告诉我。
不要犹豫,鼓掌并跟随。这也是告诉我你以同样的方式看待事物的一种方式。
波兰文原版发布于https://radekbialowas . pl
公共卫生中的机器学习:一个病人的旅程
变更数据
利用技术和数据科学的进步,显著改善中低收入国家高危人群的公共卫生成果
机器学习是当今健康技术领域最热门的话题之一,几乎在任何领域都是如此。在本帖中,我们将关注 21 世纪数据科学的一个非常规的应用。我们问自己的问题是,“我们如何利用技术和数据科学的进步来显著改善全球中低收入国家(LMICs)高危人群的公共卫生结果?”。
这里是我们在回文数据 (PD)使用的一些方法,来解决撒哈拉以南非洲和其他地区的公共卫生问题。我们将使用 PD 的主要关注领域之一的 HIV 治疗来说明这种方法。
预测与解释模型
在我们作为数据科学实施者的 R&D 工作中,我们认为我们的项目走两条主要路线之一;预测或解释模型。两者都从专门的数据发现阶段开始,该阶段通常会告知关注哪条路线。同样重要的是要注意,无论哪条主要路线是集体商定的,两者都是被追求的——并且相互促进。
这可能是介绍我们虚构的患者案例研究对象 Thabo 的好时机。塔博是一名 22 岁的男性,刚刚完成了他的本科学位,目前失业,正在寻找一个初级职位,即医学研究助理,然后继续攻读研究生课程。自出生以来,塔博也是 HIV 阳性,他的一生都受到病毒的抑制。
传统的公共卫生理论告诉我们,塔博是一名年轻的失业男子,因此治疗中断的风险明显更高(IIT)——即错过登记预约并停止抗逆转录病毒(ART)药物一段时间,甚至可能很长时间。这对医疗保健方案和艾滋病毒携带者(PLHIV)来说是一个相当大的问题,因为那些脱离护理的人可能会产生耐药性,可能需要对他们的治疗方案进行代价高昂的改变。
塔博前来检查和采集药物的诊所由一名 PD 合作伙伴运营,他们目前正在对 PD 在合作伙伴支持下开发的工具进行用户测试,以优化患者保留率。他同意,在医护人员完成标准访视方案后,他们会向塔博解释预测工具,并在接下来的三分钟内输入必要的信息。
该诊所的预测工具要么是平板电脑上的应用程序(如下图 1 所示),要么是纸质记分卡(如下图 2 所示),这两种工具都是基于机器学习的工具,输出的分数接近塔博下次就诊迟到超过 28 天(有 IIT)的风险。

图 1:数字应用程序(预测工具)。该评分过程由十个问题组成,前六个来自患者档案,后四个是医务人员向患者提出的问题。“评分”近似于患者下次就诊迟到 28 天以上的风险(评分较低-风险较高)。来源:回文数据(经许可)。

图 2:基于纸张的遵守记分卡(预测工具)。该记分卡由十个问题组成,前六个来自患者文件,后四个是医务人员向患者提出的问题。“总依从性评分”接近患者下次就诊迟到 28 天以上的风险(评分较低-风险较高)。来源:回文数据(经许可)。
预测工具根据塔博的信息输出一个分数,这将他归类为有 IIT 病的中间风险。这名医务人员认识塔博多年,知道中间风险评分是他生活中复杂事件的结果。作为额外的检查,医护人员参考塔博的文件查看他的原型分类,这将我们带到解释性建模。
解释建模使用包括预测算法在内的一系列 ML 技术来分析人口,其最终目标是优化我们对人口动态、分组和模式的理解,而非纯预测能力的最终目标。解释性建模的一个主要示例是患者概况,其目的是开发患者原型。患者原型是一种概括的构建,可捕获子人群的关键人口统计和行为特征。医护人员发现,最近将塔博归类为“及时的&忠诚青春期男孩或年轻男性”,这意味着塔博被归类为属于代表年轻男性患者的原型,他们属于最稳定的患者,患 IIT 病的可能性最低,这加强了医护人员对塔博稳定风险特征的理解。
在评估了预测工具和解释工具的输出后,医疗保健工作者做出明智的决定,让 Thabo 继续他的长期治疗计划,并选择填写工具上的简短反馈部分,表明他们不同意预测工具的输出,并概述原因。
这种反馈循环非常宝贵,PD 和合作伙伴会对其进行全面分析,作为持续监控和改进流程的一部分。例如,来自 Thabo 的检查访问的结果和反馈,以及来自这一轮用户测试的所有其他结果和反馈,可能有助于我们提高预测工具的公平性、准确性和可用性。
大规模实施此类工具的广泛影响是深远的:
- 它将个性化医疗保健的元素引入公共卫生系统和服务不足的社区,特别是疾病负担高的农村社区。
- 它利用了不相称的成本节约,这是由于能够根据 IIT 风险对患者进行细分,从而允许急需的资源重新分配。
- 这通常会带来更好的患者体验,将更多的时间花在有更大需求的患者身上,同时减少低风险患者经历的摩擦。
- 它允许医护人员在患者仍在接受治疗时主动提供干预,以减少 IIT 负担(目前大多数干预仅在不良事件已经发生时追溯应用-这开辟了一套全新的干预机会)。
上述每一个好处都创造了一个正反馈循环,减轻了公共卫生保健系统和工作人员的压力,并将关注点重新定位于患者个人。
数据科学和机器学习在公共卫生领域还有许多其他应用和机会,PD 渴望以改善患者结果的方式做出贡献,更多类似内容请关注我们的媒体、 LinkedIn 和 Twitter 。
免责声明:Thabo不涉及任何真实的人或实体,在本文中仅用于说明目的。
Python vs. Julia 中的机器学习——Julia 更快吗?
Python 和 Julia 的简单分类任务的计算速度的分析比较显示了显著的发现

Julia 编程语言在麻省理工学院从一开始就被设计用于科学计算的高性能,但是领域专家在日常工作中仍然更喜欢较慢的语言,例如 Python。Julia 的官方网站提供了一组实验来比较 Julia 和其他编程语言中的计算速度。其中一个练习展示了使用 Julia、SciLua、Rust、Go、Fortran、Java、Javascript、Matlab、Mathematica、Anaconda Python、R 和 Octave 的当前版本计算斐波那契数列:

这个练习表明,只有 C 能够比 Julia 更快地计算斐波那契数列。这样的竞争优势应该会让 Julia 在机器学习方面拥有超强的能力,使迭代更快,并为工程师节省时间。
真的是这样吗?本文深入研究了 Julia 和 Python 的性能,并比较了两种语言中手写数字的 MNIST 模型的训练时间。
实验设计
为了比较 Julia 和 Python 的性能,我用这个设置运行了一个实验
- 使用 MNIST 数据对手写数字任务(0-9)进行分类
- 标准成熟的编程解决方案
- 其他条件相同的方法,尽最大努力使两种解决方案具有可比性
- 仅比较模型训练时间。
我在 JupyterLab 的一台笔记本电脑上运行了这两个代码,该笔记本电脑配有英特尔酷睿 i7–5500 u、2.40 GHz CPU 和 16 GB RAM。
数据
我使用 ML 教程中常用的手写数字的经典 MNIST 数据。该数据集具有 60,000 个预处理的训练集和 10,000 个示例的测试集。数字已经过大小标准化,并在固定大小的图像中居中。 TensorFlow 包含 MNIST 数据作为 TensorFlow 数据集的一部分,而 Julia 包含 MLDatasets 中相同的预处理数据。
朱丽亚实现
Flux 是 Julia 最喜欢的机器学习库之一。导入必要的 Flux 模块后,统计库,ml 数据集:
数据经过整形、编码、展平,最后加载到训练集中:
接下来,我创建一个具有两个密集层和标准激活函数的模型编译函数,然后对其进行实例化:
接下来,我定义一个损失函数、学习率、ADAM 优化器和包含从模型中获得的参数的 ps 对象:
然后用 10 个时期训练该模型。@time是衡量培训绩效的有用宏:
Python 实现
在 TensorFlow 中,代码非常基础,类似于 Julia 实现。在他们的网站上查看更多详情。我使用时间库来测量模型训练时间:

伊恩·施耐德在 Unsplash 上拍摄的照片
瞧,结果出来了!
由于 Julia 比 Python 晚了几十年才被开发出来用于对大量数据进行快速计算,所以人们会期望它能决定性地超越 Python。所以,结果在这里:
Python: 训练时间:33.1 秒
朱莉娅: 92.4 秒
我对内存分配或其他指标不感兴趣,但这些数字令人兴奋。为了更好地理解它们,让我们检查一下 TensorFlow 中的 API 层次结构。
TensorFlow 的核心不是用 Python 写的。它是用 C++编写的,使用 Python 作为包装器。虽然 C++是一个低级 API,但 Python 为构建模型和应用程序提供了一个方便的前端 API。
这个事实清楚地解释了这个结果。TensorFlow API 层次结构在本教程中有很好的解释。
结论
Julia 是一种伟大的语言,它的创造者理所当然地获得了 J. H. Wilkinson 奖,以表彰他们在数字软件领域的杰出贡献。它一直在扩大用户群体,并且是 2021 年堆栈溢出开发者调查中“喜爱与恐惧”类别中排名第五的编程语言。
它将在科学计算、时间序列和风险分析、宏观经济预测、气候建模等领域找到大量的用例。
- 在宏观建模中,MATLAB 是一个流行的工具,Julia 将加速模型估计
- 在天气建模中,Julia 可能会在处理大量数据时做同样的事情。
另一方面,本文表明 TensorFlow 仍然可以使模型迭代更快,因为它依赖于 C++后端。在许多情况下,它仍然是训练 ML 模型的优选选择。
PS:你可以订阅我的 邮件列表 每次我写新文章都会收到通知。如果你还不是中等会员,你可以在这里加入https://medium.com/@petrkorab/membership。
SQL 中的机器学习——它确实有效!
有了 dask-sql 的最新版本,就有可能在 sql 中使用巨大的 Python ML 生态系统

有时很难相信在曼梯·里之前有一个世界存在。如此多的现代数据分析建立在 ML 技术之上,并且在可预见的将来还会继续这样。然而,并不是每个人都能从这些巨大的进步中受益,因为使用 ML 技术主要涉及使用 Python、开发代码和理解许多新技术。特别是当大数据和分布式系统进入游戏时,事情变得一团糟。
这是 SQL 查询引擎试图解决的问题。它们使得用简单而强大的 SQL 命令来使用复杂的分布式系统成为可能。dask-sql是一个新的 SQL 查询引擎(免责声明:我是作者),构建在纯 python 的 Dask 分布式库之上。这个新的库允许您将 Python 与 SQL 和分布式可伸缩计算结合起来!(在我的其他帖子中阅读更多信息)。
dask-sql的最新版本 0.3.0 对机器学习有实验支持,所以今天我们就来看看我们能用它做什么。当然,我们将为此使用众所周知的虹膜数据集——数据科学的 hello world。尽管这个特定的数据样本非常小,但是本文中展示的所有内容都可以通过在集群中添加更多的计算节点轻松扩展到大量数据。
边注:带dask-sqlT13 的 ML 是还在实验中:-)可以随意试用,但要谨慎使用。
先决条件和准备工作
在这篇文章中,我假设你(或你的数据工程师)已经设置并运行了dask-sql。参考文档或这篇博文了解更多信息。我还假设你通过 SQL server 接口连接到dask-sql——例如通过一个 BI 工具,像 Apache Hue ,它甚至在最新版本中带有对dask-sql的本地支持。
如果您使用 Python 接口来dask-sql,您仍然可以跟随。只需用以下单元格初始化您的 Jupyter 笔记本
**from** IPython.core.magic **import** register_line_cell_magic
**from** dask_sql **import** Context# Create a context to store the tables and models
c = Context()# Small helper function to make our life easier
@register_line_cell_magic
**def** sql(line, cell=**None**):
ifcell **is** **None**:
cell = line
line = **None**
if **not** line:
line = {}
**return** c.sql(cell, return_futures=**False**, **line)
在下面的代码示例中,在每个 SQL 命令前面加上%%sql,例如
%%sql
**SELECT** 1 + 1

加载和准备数据
这些事情解决之后,让我们从导入数据开始。由于dask-sql利用了大型 Python 和 Dask 生态系统,您可以从许多不同的位置读入许多不同格式的数据样本。在本例中,我们将以相当标准的 CSV 格式从互联网获取数据:
**CREATE OR REPLACE TABLE** iris **WITH** (
location = 'https://datahub.io/machine-learning/iris/r/iris.csv',
persist = True
)
数据集以名为“iris”的表格形式加载和存储。persist = True使dask-sql在内存中缓存数据。
现在,检查数据加载是否正确
**DESCRIBE** iris

如您所见,数据类型是自动分配的。我们可以用这个标准的 SQL 命令显示前十行数据:
**SELECT** * **FROM** iris **LIMIT** 10

Iris 数据集的简短介绍:如上面的输出所示,数据集描述了鸢尾花及其物种的测量结果。它是机器学习中的标准数据集之一,可以用作许多类型的 ML 方法的示例。在这个例子中,我们将应用无监督聚类算法。
在我们开始培训之前,让我们首先做每一个 ML 管道中的另一个重要步骤:特征提取。因为我不是生物学家,所以我在这里只介绍一个非常简单和天真的新特性作为例子:用萼片长度乘以萼片宽度。还可以使用 SQL 语句和函数生成更复杂的功能。如果这还不够,dask-sql允许注册用 Python 编写的用户自定义函数 (UDF)。
**SELECT**
*,
sepallength * petallength **AS** new_feature
**FROM** iris
**LIMIT** 10

为了让我们的生活变得简单一点,让我们为这个增强的表引入一个别名
**CREATE OR REPLACE TABLE** transformed_data **AS** (
**SELECT**
*,
sepallength * petallength **AS** new_feature
**FROM** iris
)
我们现在准备应用机器学习!
训练机器学习模型
存在大量可能的机器学习模型——从线性回归这样的简单模型到健壮的增强决策树,再到变形金刚这样的尖端研究模型。它们中的许多是在著名的 scikit-learn Python 包中实现的,因此(和许多其他库一样)可以在dask-sql中使用。
在这个例子中,我们应用了 k-Means 聚类算法。简而言之,它将数据集分组为具有相似特征的行簇。如果一切顺利,我们希望它将同一物种的花朵聚集在一起——而不需要我们告诉算法。我们来看看算法表现如何(剧透:不太好)。如果你想了解更多关于兼容dask-sql的型号及其设置,我鼓励你看一下文档。
那么,让我们将我们的聚类算法应用于数据!
**CREATE OR REPLACE MODEL** clustering **WITH** (
model_class = 'sklearn.cluster.KMeans',
wrap_predict = True,
n_clusters = 3
) **AS** (
**SELECT** sepallength, sepalwidth, petallength, petalwidth, new_feature
**FROM** transformed_data
)
正如你所看到的,我们为训练使用了一个新的 SQL 结构**CREATE MODEL**,它得到一些参数来指定训练哪个模型。在我们的例子中,我们从 scikit-learn 中选择 k-Means 算法,并将我们期望的组或簇的数量设置为三(因为我们有三个物种)。scikit-learn 包中的算法在中等大小的数据上工作得非常好,如果您需要超越这一点,可以查看一下 dask-ml 。
训练应该很快就能完成(因为总数据集相当小),所以我们可以继续检查预测。
检查性能
**SELECT** * **FROM** **PREDICT** (
**MODEL** clustering,
**SELECT** * **FROM** transformed_data
**LIMIT** 10
)

该 SQL 语句将对给定数据应用一个训练模型,并添加一个新列“target ”,其中包含模型的预测目标。从前十行来看,它看起来相当不错(所有的“setosa”都有相同的预测目标)。所以让我们再次引入一个别名来做更多的计算
**CREATE OR REPLACE TABLE** iris_results **AS** (
**SELECT** class **AS** label, target **AS** predicted **FROM PREDICT** (
**MODEL** clustering,
**SELECT** * **FROM** transformed_data
)
)
长话短说,我们只快速浏览一下结果,并检查物种的分布和预测的集群。
**SELECT**
label, predicted, **COUNT**(*) AS numbers
**FROM** iris_results
**GROUP** **BY** label, predicted

一点也不完美,不过好在这不是 ML 上的帖子,所以我就跳过优化这一步:-)。您的 BI 工具可能能够自动绘制这些数字,作为 python 用户,您可以使用
df = c.sql("""
**SELECT**
label, predicted, **COUNT**(*) **AS** numbers
**FROM** iris_results
**GROUP** **BY** label, predicted
""", return_futures=**False**)df = df.set_index(["label", "predicted"])
df.numbers.unstack(0).plot.bar(ax=plt.gca())

摘要
谢谢你一直关注这个帖子!我们已经介绍了相当多的材料,所以这里快速回顾一下:
- SQL 查询引擎很酷,因为您可以使用它们来查询复杂的数据,使用复杂的分布式系统,使用简单的 SQL 语法(和许多魔法)。
dask-sql就是其中之一,它与 Python 生态系统的交互特别简单(因为它是建立在 Dask 之上的,Dask 是一个用于扩展 Python 应用程序的库)。- 一个好处是可以轻松集成各种各样的 Python ML 库,例如 scikit-learn 包中的 k-Means 算法,如本文中所示。另一件好事是,只要使用 SQL,一切都可以正常工作!
如果你想了解更多,去看看文档,开始用 SQL 整理你的数据。
区块链和加密货币世界中的机器学习
探索机器学习及其在加密货币开采和交易领域的适用性。

介绍
加密货币和区块链的世界越来越令人兴奋,这是理所当然的,因为以太坊和比特币的价格到目前为止都在 2021 年创下历史新高。更不用说区块链技术应用的增加,特别是随着不可替代令牌(NFT)的流行。
像任何技术一样,区块链和加密货币都有与安全性、利用率和效率相关的问题。除了所有的兴奋和主流关注,还有一些合理的努力集中在解决重大的区块链相关问题上。
本文将介绍一些上述问题,以及使用机器学习技术解决区块链/密码相关问题的研究成果。本文中的研究是在最近几年发布的。
1.交易(强化学习)

Pierre Borthiry 在 Unsplash 上拍摄的照片
交易比特币和以太币等加密货币已经成为散户投资者和大型金融机构的一项活动。截至本文撰写之时,CoinMarketCap 上跟踪了 308 家加密货币交易所。
如今股市中使用的传统交易机器人都带有嵌入式机器学习算法。因此,毫不奇怪,ML 技术也有助于构建加密货币市场交易系统。
在谷歌搜索引擎上键入“机器学习加密交易机器人”会产生超过 1200 万个搜索结果,但让我们将注意力转移到学术研究上。
Thomas E. Koker 和 Dimitrios Koutmos 撰写了一篇研究论文,介绍了使用直接强化学习来创建基于加密货币的主动交易模型。
强化学习(RL)是机器学习的一个子域,在游戏和模拟程序中很常见。RL 通过培训项目(代理)在互动环境中开发优化策略(政策)来获得回报。
这项特殊研究中提出的方法利用了直接强化学习(DRL)。在传统 RL 中,没有对代理的即时性能反馈,但是在 DRL 中,来自先前窗口的性能被用作对代理的反馈。使用 DRL,研究人员能够摆脱创建价格预测模型,并创建了一个基于特定时间间隔(每天)进行调整的系统。
外卖食品
强化学习是开发有利可图和适应性强的加密货币交易策略的可行方法。
2.优化挖掘策略(强化学习)

在我开始研究之前,这里有一个关于比特币挖矿如何工作的快速速成班。挖掘加密货币涉及利用计算资源来猜测用于求解区块链函数的一组值。允许求解该函数的挖掘器用有效的未决事务更新区块链。
然后区块链网络被更新以包含新的交易。挖掘的目的是用未决事务更新区块链,并为矿工的努力提供奖励。
矿工的这种努力将获得大宗奖励(即比特币)和相应交易产生的交易费。你的计算机越强大,你就能做出越多的猜测来求解这个函数。请注意,这是对加密挖掘的过于简单的描述,但你已经得到了要点。
本节探讨了研究工作,旨在展示 ML 技术在优化采矿工作和防止劫持采矿资源方面的适用性。
王陶陶、宋长烈和张胜利撰写了一篇研究论文,发表于 2021 年 1 月,该论文介绍了强化学习(RL)在优化比特币等加密货币的区块链挖掘策略中的应用。
他们的研究工作证明,如果没有区块链的初始模型和相应的参数(矿工的计算资源、交易费用等)。)有可能利用 RL 技术来动态推断与其他策略(传统诚实挖掘和自私挖掘)相比更具性能的挖掘策略。
传统的强化学习算法设计了一些方法,通过这些方法,代理可以最大化地获得环境中的奖励。但是区块链网络是一个动态的环境,在其中很难创建一个有代表性的模型。该论文的作者设计了一种多维 RL 算法,使用 Q 学习(无模型算法)来优化加密货币挖掘。
作者证明,通过机器学习技术,可以解决性能挖掘策略的开发。众所周知,比特币和加密货币挖掘是一个蓬勃发展的行业。据报道,Argo Blockchain、Riot Blockchain 和 Hive Blockchain 等几家矿业公司已经开采了价值数百万美元的比特币。这些公司的技术团队中也可能有 ML 工程师。
外卖食品
研究人员创建了强化学习系统,为加密货币挖掘策略提供优化。
3.应对密码劫持(深度学习)

加密货币挖掘中机器学习的另一个值得注意的应用与安全有关。由学术机构和国家政府支持的研究实验室配备了大量的计算资源和基础设施。这使得他们成为’ 密码黑客 '的首要目标。
密码黑客劫持计算资源来挖掘加密货币。这种攻击已经变得司空见惯,并成为头条新闻。
来自美国的研究人员共同努力,设计了一种检测恶意程序存在的方法,这些程序试图劫持计算资源。
SiCaGCN 是研究人员给这个系统起的名字。SiCaGCN 基于对程序的控制流图表示进行的距离测量来确定一对程序或代码之间的相似性。
SiCaGCN 系统包括在深度学习和 ML 领域中发现的神经网络架构和技术的组件。
- 控制流程图 : 代码/程序内指令执行流程的表示,其中每个节点代表一个基本块。有向边对应于代码执行中的跳转或流程变化。
- 图卷积神经网络 : 设计用于对图进行卷积运算的神经网络架构。
- 注意机制 : 为突出或增强输入/输出或输入之间的重要依赖关系而设计的技术。
- 神经张量网络、 胶囊网络、 、距离测量( 图形编辑距离 和最大公共子图(MCS) )
本文的目的不是对 SiCaGCN 进行详细的分析,但是下面是对该系统的高级操作的一步一步的快速概述:
- 将代码/程序转换成基本块表示的控制流图(CFG)。
- 通过图形卷积神经网络将基本块的 CFG 作为输入传递到 SiCaGCN 模型,以创建基本块的 CFG 的嵌入。
- 注意机制(NLP)和胶囊网络被用来从输入图中提取重要的和相关的特征,从而创建更好的嵌入。
- 使用有效距离度量(图形编辑距离,GED)和最大公共子图(MCS))来确定图形嵌入之间的相似性分数。
- 训练数据的实例由一对基本块的 CFG 和它们的基本事实相似性得分组成。在测试期间,模型的输入是来自代码对的基本块对 CFG,输出是相似性得分。

SiCaGCN 架构。图片来自原始研究论文
这项研究令人兴奋的方面是 SiCaGCN 系统的实际应用。研究人员测试了该系统在一组科学源代码中检测比特币挖掘代码的能力。当与另一个图相似性计算系统( SimGNN )比较时,SiCaGCN 表现良好。不难设想,SiCaGCN 可以被修改成一个更广泛的反病毒系统。
外卖食品
研究人员设计了一种独特而有效的检测恶意代码的方法,使用深度学习技术来描述和比较代码。该系统被命名为 SiCaGCN,在测试其检测外国比特币采矿代码的能力时,提供了有希望的结果。该系统防止外国程序滥用和未经授权使用计算资源。
结论
机器学习在区块链和加密货币的世界中占有一席之地。ML 技术的应用范围不仅仅局限于加密货币的价格预测或交易。
随着更多这些技术进入生产环境并实现商业化,区块链世界可能会在未来几年开始向机器学习从业者开放。
感谢阅读
在我主持的这个现场培训环节,用 TensorFlow 和 Keras 学习 AI 和深度学习的基础知识。
想要更多吗?
- 订阅 在我发布文章时得到通知
- 成为推荐媒介会员,支持我的写作
- 通过 LinkedIn 联系我
- 跟我学学 奥莱利
从熟悉的角度看机器学习直觉
通过石头剪子布游戏探索 ML 的动机和能力
注:本帖代码可在 这里 找到

机器学习与石头剪子布游戏(图片由作者提供)
在本文中,我们将使用两种不同的方法用 Python 构建一个简单的石头剪刀布游戏:基于规则的系统与机器学习。通过这个对比,我希望表达机器学习是如何工作的,以及它的动机。要明确的是,这不是一个关于图像识别或模式识别(玩家接下来会选择哪只手)的说明,而是一般的机器学习概念。随着自动化不断革新各行各业的未来工作,公司必须探索不同的方式来简化运营。如其维基所述,
机器学习涉及计算机发现它们如何在没有明确编程的情况下执行任务。它涉及计算机从提供的数据中学习,以便它们执行某些任务。对于分配给计算机的简单任务,可以编程算法告诉机器如何执行解决手头问题所需的所有步骤;就计算机而言,不需要学习。对于更高级的任务,人工创建所需的算法可能会很有挑战性。在实践中,帮助机器开发自己的算法可能会比让人类程序员指定每个需要的步骤更有效。
传统的编程是基于规则的
我们创建 RPS 游戏的第一个方法是手动编程每个可能的条件。这就是所谓的基于规则的系统。让我们先把游戏简化一点,这样玩家只有两个选择:石头或者纸。
# Print Title
print("Let's Play Rock Paper Scissors!")# User selection
player_1 = input("Player 1 - Choose from: (r)ock, (p)aper? ")
player_2 = input("Player 2 - Choose from: (r)ock, (p)aper? ")# Run conditionals
if (player_1 == player_2):
result="A smashing tie!"
elif (player_1 == "r" and player_2 == "p"):
result="Sorry. Player 1 lose."elif (player_1 == "p" and player_2 == "r"):
result="Yay! Player 1 won."else:
result="I don't understand! Next time, choose from 'r' or 'p'."
print(f"Player 1 chose {player_1}. Player 2 chose {player_2}.")
print(result)
根据这些简单的规则,创建游戏是很容易的。虽然我们不得不手动编程 4 个条件中的每一个(包括一个总括),但它是可管理的。

游戏结果
让游戏回到常规规则,有三种选择:石头、纸或剪刀。我们必须手动编程的条件数量快速增长。
# Print Title
print("Let's Play Rock Paper Scissors!")# User selection
player_1 = input("Player 1 - Choose: (r)ock, (p)aper, (s)cissors? ")
player_2 = input("Player 2 - Choose: (r)ock, (p)aper, (s)cissors? ")# Run conditionals
if (player_1 == player_2):
result="A smashing tie!"
elif (player_1 == "r" and player_2 == "p"):
result="Sorry. Player 1 lose."elif (player_1 == "p" and player_2 == "s"):
result="Sorry. Player 1 lose."
elif (player_1 == "s" and player_2 == "r"):
result="Sorry. Player 1 lose."
elif (player_1 == "p" and player_2 == "r"):
result="Yay! Player 1 won."
elif (player_1 == "r" and player_2 == "s"):
result="Yay! Player 1 won."
elif (player_1 == "s" and player_2 == "p"):
result="Yay! Player 1 won."else:
result="I don't understand! Next time, choose from 'r' or 'p'."
print(f"Player 1 chose {player_1}. Player 2 chose {player_2}.")
print(result)
当我们给游戏增加了更多的复杂性时,我们必须编程的条件数量从 4 翻倍到 8 。随着游戏复杂度的增加,IF 条件的数量会呈指数增长。
使用机器学习来推导规则
在接下来的方法中,我们将使用机器学习来学习游戏的内在规则。
“鉴于我们对历史结果的了解,我们能对未来事件说些什么呢?”
假设我们要从过去的 100 个 RPS 游戏中检索数据:

过去的游戏结果数据
机器学习需要大量多样的数据。幸运的是,我们的数据包含了特征和结果的所有可能选项。我们可以将这个数据集输入到一个算法中,比如决策树来表示这个游戏。

决策树可用于表示游戏——每次出现的次数(图片由作者提供)
在模型训练过程中,我们称玩家 1 的选择和玩家 2 的选择为特征,而结果为目标。也被称为“拟合模型”,这个过程使用数学和试错法的组合来找到最佳描述变量之间关系的方程。RPS 游戏是确定性的,这意味着结果没有随机性,它是非常二元的。我们的模型已经识别了游戏的所有规则——例如,它观察到的模式之一是,当参与人 1 的选择和参与人 2 的选择相同时,结果总是“平局”。在之前或之后的游戏中玩什么选择,在这个模型中是不考虑的。
# Import Dependencies
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from sklearn.tree import DecisionTreeClassifier# Read Data
df=pd.read_csv('result/result.csv', header=None)
X=df[['player_1', 'player_2']]# Transform Data
ohencoder=OneHotEncoder()
X_transformed=ohencoder.fit_transform(X)# Fit Model
y=df['result']
clf=tree.DecisionTreeClassifier()
clf.fit(X_transformed, y)
需要指出的是,虽然使用机器学习的能力非常令人鼓舞,但并不一定需要了解高等数学。有很多开源的机器学习库使得实现很直观=-
一旦开发出来,我们可以用这个模型来评估新游戏的结果。例如,如果玩家的选择是“石头”,玩家 2 的选择是“纸”,则模型判定,由于这种组合的过去 9 次出现中有 9 次都导致训练数据中的“玩家 1 输了”,因此这种结果很可能是相同的。
game={'player_1': 'r', 'player_2': 'p'}
game_transformed=ohencoder.transform([list(game.values())])
clf.predict(game_transformed)==========output==========
array(['Player 1 Lose'], dtype=object)
这就是机器学习如何识别训练数据中的模式/规则。在游戏复杂度增加的时候特别有效。
假设随着时间的推移,我们开始注意到玩家在做出选择之前先等着看另一个玩家选择什么。我们希望对这种延迟进行一些限制,以确保匿名性和 T2 公平性,但是我们不知道如何在基于规则的系统中实现这一点。我们需要专家意见的一些问题是:1)延迟的阈值应该是多少,2)如果玩家在长时间延迟后选择了一手输牌,他应该输还是平局?我们可以让一个新模型利用历史游戏记录进行自我学习,而不是手动编程条件:

特征工程新列(绿色)
这一次,作为“特征工程过程的一部分,我们创建了一个新字段来表示两个选择之间的时间差。将此输入决策树算法,数据支持 800 毫秒的延迟截止。换句话说,记录显示,如果在 800 毫秒的延迟后做出第二次选择,游戏通常会使胜利无效。这个“新”规则的实现是快速而轻松的,但是要求我们有足够数量的记录以及额外的字段(列)。

机器学习有效地解释复杂的规则——每次出现的次数(图片由作者提供)
这种方法允许算法自己开发最能代表游戏的适当规则集。为了使用这个机器学习模型进行推理,我们将传递玩家的选择和时间作为输入。延迟的截止值是严格基于所提供的训练数据来确定的。如果收集了新的数据并且模型被重新训练,这个截止值可以改变。对于我们简单的树模型,“规则”足够明显,我们可以解释和表达它们。内部工作并不总是容易描述的,特别是当问题变得不那么绝对的时候。作为一个例子,该模型表明,当有一个长的延迟,玩家 1 选择“石头”,有一个决定是否玩家 2 选择“剪刀”,而不是在所有三个选项中选择。为什么会这样,现在还不清楚,但经过一些思考后,这是有道理的,因为参与人 2 选择“纸”和“石头”在历史上都产生了相同的结果:“平局”。机器学习使用基于每个特征的概率方法来评估结果。这是手动编程规则的一种受欢迎的替代方法。
基于规则的系统与机器学习
机器学习和基于规则的系统都旨在高度准确地自动化决策。

基于规则与机器学习
当编写和实现规则很容易时,基于规则的系统通常更好。如果我们知道规则,并且不希望变量发生变化,我们可以基于简单的 If 语句实现规则。这种方法也被称为基于专家的规则,因为人类专家的知识是必需的(并被记录)。然而,随着时间的推移,基于规则的系统可能会变得“笨拙”,因为需要更多的规则来应对环境的变化。机器学习是一种替代方法,它解决了基于规则的方法的一些问题。

优点和缺点
摘要
在本文中,我们使用众所周知的石头、剪子、布游戏来探索机器学习的概念。随着过去几年数据的显著增加,机器学习有很多机会改变我们为未来创造技术的方式。
机器学习就像足球
对复杂话题的有趣类比

本斯·巴拉-肖特纳在 Unsplash 拍摄的照片
当你成为一名专业数据科学家的计划开始实现时,你将经常不得不回答这个臭名昭著的问题:“那么,你是做什么的?”。如果你想成为机器学习专家,你将很难向没有技术背景的同事解释机器学习是什么。
卡内基梅隆大学著名计算机科学家 Tom Mitchell 教授将机器学习定义为:
“一种计算机程序,它从经验 E 中学习关于某类任务 T 和性能测量 P,如果它在 T 中的任务的性能,如 P 所测量的,随着经验 E 而提高。”【1】
老实说,他的定义不会让你在任何非正式的谈话中走得很远。此外,作为一名数据科学家,您经常需要向非技术受众解释技术术语。因此,每当我发现自己在解释我所做的事情时,我都会使用我的哲学老师曾经对他的学生使用过的同样的技巧:足球类比。如果你在北美,那么你可以称之为足球类比。即使你不喜欢足球,人们似乎也能以这样或那样的方式理解这项运动及其规则。
希望足球的类比能帮助你理解或向他人解释机器学习。
球员(数据)
这看起来很明显,但是没有球员,就没有足球比赛。无论你是在职业水平的温布利球场踢球,还是和朋友在街上踢球,都没有关系。没有球员,那些地方只是一个空荡荡的足球场,一条典型的街道。至于机器学习,数据就像玩家;没有数据,什么都做不了。但是,并不是每个数据集都是一样的,就像玩家一样。克里斯蒂亚诺·罗纳尔多和莱昂内尔·梅西都是伟大的球员,他们将超越人们对一场伟大足球比赛的期望。如果我去踢足球,情况就不一样了。所以,好的选手做出了伟大的表演。同样,与数据科学中的名言一致,“垃圾入*,垃圾出*”。无论你的编程技能有多好,或者你对数学了解多少,如果没有有用的数据集,你的机器学习项目很可能会让你的团队失望。
足球经理(数据准备)
足球经理对足球队的成功至关重要。尽管英格兰国家足球队有选择顶级球员的奢侈,但它自 1966 年以来还没有赢得过世界杯。负责决定谁去世界杯的人是经理。他还负责为球员提供指导,并影响他们的训练程序。这是一个耗时的过程,如果没有正确完成,球队将无法为下一届冠军做好准备。
一项研究报告称,数据科学家将大约 80%的时间花在数据准备和数据清理上**【3】**。数据专业人员必须将他们的数据集转换成机器学习模型可以学习的格式(例如标准化数据,处理空值等)。).对于数据科学家和足球专业人士来说,这些都不是最令人兴奋的方面。
足球战术(机器学习模型)
要想赢得冠军,球队必须根据每个对手改变战术。例如,如果美国国家足球队与四次获得世界冠军的德国队比赛,他们可能会建立一个强大的防守体系。如果美国队与冰岛足球队比赛,他们可能希望建立一个强大的进攻战略,采用不同的侵略性战术。所以,一支训练有素的球队,采用正确的战术,在 90 分钟后,很可能会进一些球并赢得比赛。
在我们的世界中,机器学习实践者必须决定应用哪种算法或模型,给定特定的数据集和期望的结果。例如,机器学习专业人员根据问题选择预测模型:分类模型是关于预测标签,而回归是关于预测数量。因此,理解可用的规范和技术对一个成功的项目至关重要。这里有一些机器学习模型供您稍后检查:K-最近邻,逻辑回归,朴素贝叶斯分类器和随机森林。
足球设备(硬件和软件)
不同的足球位置需要不同的设备和训练。例如,守门员是唯一可以用手触球的人。因此,他们需要(特殊的)手套和独特的体能训练,相比之下,其他球员必须来回跑 90 分钟,并试图用额头进球。此外,拥有优秀赞助商的团队可以聘请营养师、医疗专家甚至数据科学家来分析表现数据。最终,设备和独特的专业人员有助于球队在世界杯上取得成功。
同样,处理一个小数据集(1000 行 x 5 列)以创建一些图表可能会在使用 MS Excel 的标准笔记本电脑上运行,但从多个服务器提取数据并处理数百万行需要特定的编程语言 Python 和具有非凡计算能力的高性能设备。

拉斯·博·尼尔森在 Unsplash 上的照片
不同的联盟(领域专长)
我认为无论你去哪里,总有人在踢足球。它可能是孩子/成人、男人/女人、室内/业余、在线/室外或业余/专业。没关系;总有人在玩。此外,你会遇到技能水平的巨大差异。不同的技术水平和比赛类型不是足球的缺点;他们代表了这项运动的多样性和包容性。每一种技能水平或比赛类型都针对一种特定的需求或需要。一些人喜欢在户外的草地上玩,而另一些人喜欢和几个好朋友在网上玩。没关系,这些人专门从事一种特定类型的足球。
机器学习就像足球一样。不同的专业人员有不同的专业知识,并在各自的领域工作,例如,商业和企业领域(金融市场)以及学术和技术领域(在大学研究开发新的算法)。
结论
如果你正处于成为机器学习专业人士的过程中,你不可避免地要向不同背景的人解释你是做什么的。因此,有一个简单有效的类比将有助于您让他们更容易理解机器学习。这就是足球类比的由来。专注于普通观众对足球的了解,并与机器学习建立易于记忆的联系。现在,希望你对我们日常生活中的一个复杂话题有一个有趣的类比。
感谢阅读。这里有一些你可能会喜欢的文章:
</what-pokémons-can-teach-you-about-machine-learning-d72586c4b202>
参考文献:
[1]米切尔,T. (1997)。机器学习。麦格劳·希尔。第 2 页。
【2】世界杯获胜者https://en.wikipedia.org/wiki/FIFA_World_Cup
机器学习不是万能的:没有免费的午餐定理
有没有单一的机器学习算法可以学习一切?遗憾的是,没有。请继续阅读,找出原因。

围绕机器学习有很多合理的炒作。过去十年中,机器学习完成的一些事情(例如 AlphaGo)确实令人惊叹。然而,有些人夸大其词了——他们声称最终我们会找到一种可以学习宇宙中任何东西的机器学习算法。不幸的是,实际上有一个重要的定理表明情况不是这样的。这就是“没有免费的午餐”定理。该定理的名称与习语“天下没有免费的午餐”有关,该理论认为,如果你想要某样东西(在我们的例子中,在一个领域学得好),你必须放弃某样东西(在我们的例子中,在另一个领域学得不好)。理解免费午餐定理的细节将有助于你更好地理解机器学习的理论基础,并防止你被关于机器学习的荒诞说法所欺骗。让我们从几个例子开始。
例子
我们有一枚公平的硬币,我们抛两次。有四种可能的历史:HH,HT,TH,TT。我们的目标是给定第一次翻转,预测第二次翻转。因为硬币是公平的,所以四史的可能性是相等的。很明显,在这种情况下,没有“主算法”可以正确预测所有历史。例如,假设我的算法是,如果第一次翻转是 H,则预测 H,如果第一次翻转是 T,则预测 T。我将得到正确的 HH 和 TT 历史,而错误的 ht 和 t H 历史。我可以使用反向算法来正确预测 HT 和 TH,但这样我会把 HH 和 TT 弄错。关键是,无论你如何努力,都不可能有超过 50%的历史是正确的。这是满足“没有免费的午餐”定理的一种方式——这项任务如此困难,以至于没有有效的学习算法。
现在,你可能会问:那么,如果硬币不公平呢?如果硬币的重量偏向正面,那么在第二次投掷时总是预测 H 的算法不是表现得很好吗?这是真的。然而,同样的算法在一枚硬币上表现不佳,硬币重于尾部。这是第二种,也是更常见的满足“没有免费的午餐”定理的方式。通常,对于任何给定的任务,都存在一个运行良好的算法(不像我们的第一个公平硬币的例子,没有算法工作)。关键是这个算法在其他任务上效果不好。
这两个例子演示了两种不同的方法来证明没有免费的午餐算法。一种方法是找一个任务,这个任务太难了,所有算法都学不好。另一种方法是,对于任何给定的算法,找到该算法学习较差的任务。我们将采用第二种方法。下面的证明有一些实质性的符号,所以我们将首先解释设置。
证据
设 C 是一组唯一的数据点。假设 C 中有 2m 个这样的数据点,换句话说,C 的大小是 2m。这可能看起来很奇怪,我们用 2m 来表示大小,而不仅仅是变量 m,但这对以后的证明很重要。我们认为这是一个二元分类问题,所以所有这些数据点要么映射到 0,要么映射到 1。现在,我们要问的第一个问题是:C 语言中有多少种可能的函数?因为 c 有 2m 个数据点,并且每个数据点映射到 0 或 1 (2 个选择),所以总共有 T = 2^(2m)个可能的函数。在这个证明中,我们将用 I 来索引这些函数——例如,第一个可能的函数我们记为 f1,第二个函数是 F2,第 I 个可能的函数是 f1
接下来,用 A 表示一个任意的学习算法,A 的工作方式是,首先我们决定我们要学习什么函数 f_i。然后,A 将一系列数据点 S(训练样本)作为输入,这些数据点根据 f_i 具有正确的{0,1}标签,然后在处理该序列后输出它学习 A(S)的函数。训练样本的大小为 m。因为 c 中总共有 2m 个元素,并且一个样本有 m 个元素,所以总共有 K = (2m)^m)个可能的样本。我们用 j 来索引这些样本,例如,第 j 个可能的样本是 S_ j。
最后,我们需要讨论损失函数。假设我们已经决定用样本 S_ j 来学习函数 f_i,学习算法 A 完成后,它会输出 A(S_j),这是它学习到的函数。我们的损失函数的目标是表示 f_i 和 A(S_ j)之间的差异。在这个证明中,我们将使用 0–1 损失:我们将逐一检查 C 中的所有 2m 个元素,并找出 f_i 不同于 A(S_ j)的实例数。我们将这个数字除以 2m,得到最终的损失。简单来说:L(f_i,A(S_ j))是 C 中 2m 个元素的百分比,其中 f_i 和 A(S_ j)不同。
在我们继续证明之前,让我们再回顾一下设置。我们有一个大小为 2m 的域 C,它的元素映射到{0,1}。存在 T = 2^(2m)个可能的函数,索引为 f_i。我们表示可以尝试学习这些 f_i 的任意学习算法 a。学习过程的第一步是从 c 中抽取大小为 m 的样本,并决定要学习的函数。有 K = (2m)^m)个可能的样本,索引为 S_ j。然后在样本上训练 a,将得到的学习函数与真实函数进行比较,损失为 0–1。
证明的总体思路是这样的:对于任意的学习算法 A,我们将证明存在某个函数 f,其中 A 试图学习 f(在所有可能的样本上)的期望误差大于 1/4。换句话说,对于任何可能的学习算法,总有一些函数是学不好的。用数学术语来说,我们想表明:

为了理解这个等式,我们从内部开始。总和内的损失函数表示当我们尝试使用样本 S_j 训练 A 来学习函数 f_i 时的损失,对所有可能的样本求和,然后除以样本总数 K,得到 A 尝试在所有可能的样本上学习 f_i 的平均损失(换句话说,A 对 f_i 的预期误差)。给定学习算法 A,我们希望找到具有最高期望误差的函数,并证明它大于 1/4,因此是 I 上的 max。
下一步是做一些操作:

首先,我们利用 I 上的最大值小于 I 上的平均值的性质。然后,我们交换求和的顺序。最后,我们使用 j 上的平均值大于 j 上的最小值的性质。接下来,我们的目标是扩展和的内部——损失函数。

如前所述,损失函数是真实函数 f_i 和学习函数 A(S_ j)之间的 0–1 损失。奇怪字体的数字 1 是一个指示函数。简单来说,indicator 函数在 inside 求值为 true 时求值为 1,inside 为 false 时求值为 0。
接下来,考虑集合 C \ S_ j,或者 C 中没有被选择包含在样本 S_ j 中的元素(在集合符号中,\符号表示排除)。设 p 代表这个集合中元素的个数。由于 C 的大小是 2m,样本 S_ j 是用大小为 m 的替换来选择的,p = 2m -|S_ j| >= m .我们将用 r 和 v 来索引 C \ S_ j 的元素(例如,C \ S_j 的第 r 个元素是 v_r)。这有什么意义?在上述损失函数的展开式中,我们可以用 C \ S_j 代替 C,方法如下:

这里我们使用了两个观察值。首先,我们使用 p >= m,如前所述。第二,我们利用了 C \ S_ j(右边的和)中的每一个元素都包含在 C(左边的和)中的事实。因此,左边的和更大。综合我们目前掌握的信息,我们有:

我们已经接近尾声了。看看这个表情:

现在我们来看这个证明的关键。**注意,对于任意函数 f_i,我们可以构造另一个除 v_r 外与 f_i 完全相同的函数 f _ I’**换句话说,对于 C 中除 v_r 外的所有元素 x,我们有 f _ I(x)= f _ I’(x)。而对于 v_r,我们有 f_i(v_r) ≠ f_i’(v_r)。所有可能的函数都可以这样配对。对于每一对函数,上面的指示函数对其中一个函数的评估值为 1,对另一个函数的评估值为 0。因此,T/2 对中的每一对将对总和贡献 1 + 0 = 1。因此,表达式的计算结果为 T/2。插上这个,我们有:

我们结束了。
关于这个证明,我们应该再说一句。为什么我们要费这么大的劲去看集合 C \ S_ j?难道我们不能在集合 C 本身上使用相同的自变量(将域中只有一个元素不同的函数配对),而不是在 C \ S_ j 上吗?答案是否定的。原因是,如果 f_i 和 f_i '之间的一个不同元素在 S_ j 中,则试图训练 f_i 的 A(S_ j)将输出与试图训练 f_i '的 A(S_j)不同的函数。然后,配对论点不再有效,因为即使 f_i(v_r)和 f_i’(v _ r)仍然不同,我们也没有办法保证 A(S_ j)(v_r)对于 f _ I 和 f _ I’是相同的。
在本文中,我们介绍了没有免费的午餐定理,看了几个简单的例子来建立我们的直觉,然后进行了数学证明。我知道这个证明有点复杂,所以请随时留下任何问题/评论。感谢阅读!
机器学习不只是大型科技公司的专利
使用自然语言处理支持小型企业。

图片经所有者批准:阿尔托蒙特意大利市场的所有者(从左至右:文森特、玛丽亚、弗朗西斯、已故的米歇尔)
Altomonte’s Italian Market 是一家家族经营的意大利熟食店,自 50 多年前业主移民到美国以来,一直在大费城地区提供传统的意大利美食。Altomonte’s 从日耳曼敦的一个单间肉铺起步,现已发展成为一家拥有两家店铺、每周接待数千名顾客的企业。店主弗朗西斯和已故的米歇尔将意大利/美国传统与 21 世纪的理念融合在一起,尤其是在他们的儿子文森特和女儿玛丽亚的帮助下。Altomonte 的大部分分析仍然是按照传统进行的,包括为他们的屠宰部门挑选阉牛,直观地了解客户在一年中的不同时间会购买多少肉。进入 21 世纪,他们已经将技术进步,如三明治订单的触摸屏亭以及其他创新手段融入到他们的业务运营中。这些保持同步的进步还包括建立互联网存在,在这方面,他们的社交媒体平台取得了极大的成功。那么,Altomonte 的下一步能发展到哪里呢?将机器学习(ML)融入他们的日常运营能否继续帮助建立 Altomonte 的意大利市场和熟食店?答案是肯定的。一个家族拥有和经营的意大利市场,而不是硅谷的大型科技公司,可以从 ML 分析中受益。
自然语言处理
自然语言处理(NLP)是机器学习的一个集中领域,它分析人类语音和文本,以推断文档中隐藏的思想。NLP 中的“文本挖掘”是指我们可以通过对单词和 NLP 算法进行不同的转换,从文本体或“语料库”中获得更多的知识。可以采取各种方法来更好地理解一篇文章的主题。主题模型分析允许分析师提取信息,并提出主题或整个文本的摘要。情感分析模型不是寻找不同的主题和标题来描述数据,而是查看数据中隐藏的情感。这两种方法中使用了各种算法,从潜在狄利克雷分配模型到二元模型到神经网络。虽然我不打算向你展示我如何创建了一个人工神经网络(ANN) 可以将英语俚语文本转换成意大利语并检测你的讽刺,但我可以向你展示 NLP 技术如何能够帮助支持传统的意大利市场并为其提供见解。
情感分析
我可以从我为 Altomonte’s 进行的分析中进入更好的细节和统计推断,相反,我认为我会让它变得有趣,并解释我如何训练一个卷积神经网络(CNN)来对脸书的市场评论进行情绪预测。所以请坐好,享受一盘美味的意大利面和肉丸(或者让我们跳过甜点,吃一个奶油甜卷),尽情享受吧!
什么是情感分析?
情感分析是解读文本中隐藏的态度、感觉或情绪的过程。“情绪”被定义为“由感觉引发的态度、思想或判断。”情感分析可以让我们在屏幕后面给我们想要交流的词语附加一种感觉。
卷积神经网络
总的来说,卷积神经网络 (CNN)在目标检测和图像分类领域显示出了有前途的结果。对于文本序列,如果 CNN 的输入维数从二维(图像高度和宽度)变为一维,则可以用于文本分析。在卷积层中,内核沿着样本滑动,沿着数据串在每个停止点进行计算。核的步幅决定了核应该沿着样本移动多少步或多少单位。例如,步幅为 2 的一维 CNN 将在句子序列中移动 2 个单位来进行计算,CNN 本质上是线性的,因此将激活函数应用于线性输出以创建非线性分量,该分量然后可用于对样本进行分类。
情绪分析:阿尔托蒙特的意大利市场在线评论
为了进行分析,使用了以下 python 库:
import keras
from keras.layers import Input, Conv1D, Embedding , MaxPooling1D, GlobalMaxPooling1D, Dense
from keras.models import Model
from keras.preprocessing.text import Tokenizer
from keras.optimizers import Adam
from keras.preprocessing.sequence import pad_sequences
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
数据
训练数据是一个语料库,汇集了来自 Yelp、猫途鹰和谷歌评论的在线评论。这些评论涵盖了 Altomonte 公司过去 10 年的经营情况。训练集中的每个评论具有从 1 到 5 的相关评级,其中 1 被认为是差的,5 被认为是优秀的。脸书评论没有评级,支持他们作为测试数据来预测其隐藏的意义。
df = pd.read_csv('Altomontes_reviews.csv')
df.head()

图:的输出。csv 文件
如上所示,数据是一个评论列表,每个评论都有“月”、“年”、“评级”和“平台”特性。
数据处理
数据以数据框的形式加载后,它被重新构造为两列,一列包含评论,另一列包含基于评论各自评级的情感。首先,模型构建过程中不使用的列被删除。
df = df.drop(['Month','Year','Platform'],axis=1)
df2 = df
接下来,创建了一个名为“Label”的新的二进制列,如果一篇评论被认为是正面的,则该列的值为 1,如果一篇评论被认为是负面的,则该列的值为 0。评级为 3 或以上的评论被确定为正面,评级为 2 或以下的评论被确定为负面。
df['Label'] = [1 if x >=3 else 0 for x in df['Rating']]
预处理的下一部分包括将句子中被称为“记号”的单词转换成数字序列。
MAX_VOCAB_SIZE = 10000
tokenizer = Tokenizer(num_words=MAX_VOCAB_SIZE)
tokenizer.fit_on_texts(X_train)
sequences_train = tokenizer.texts_to_sequences(X_train)
sequences_test = tokenizer.texts_to_sequences(X_test)
最大 vocab 大小设置为 10000,以确保序列不会变得太大。首先,创建了一个记号化器,并对评论进行了记号化。关于 tokenizer 如何工作的更多信息可以在这里找到。然后,标记化的评论被转换成可供 CNN 阅读的序列。一旦单词被标记化,它们就需要被映射到一个索引。这确保了每个单词都有自己唯一的数字序列。
word2idx = tokenizer.word_index
V = len(word2idx)
这个数据有 3,248 个唯一的令牌(比任意的最大值 10,000 少得多)。既然文本已经被索引并转移到序列中,它需要用零填充。填充确保通过神经网络运行的数据的每个输入都具有相同的大小。使用后置填充,将 0 添加到每个序列的末尾,使它们与最长的序列大小相同。
data_train = pad_sequences(sequences_train,padding='post')
data_test = pad_sequences(sequences_test,maxlen=T,padding='post')
数据现在已经处理完毕,CNN 可以在 Altomonte 的意大利市场在线评论上接受培训。
型号
对于该模型,具有三个一维层的 CNN 被公式化。初始输入是一个形状为(T)的向量,其中 T 是每个序列的长度。嵌入层将每个索引变量转化为形状大小为 20 的向量。
D = 20 i = Input(shape = (T,))
x = Embedding(V +1 , D)(i)
x = Conv1D(16,2,activation='relu',)(x)
x = MaxPooling1D(2)(x)
x = Conv1D(32,2,activation='relu')(x)
x = GlobalMaxPooling1D()(x)
x = Dense(1,activation='sigmoid')(x)model = Model(i,x)
一旦创建了模型,就使用二进制交叉熵作为损失函数对其进行编译。使用二元交叉熵是因为被评估的标准是评论是否被正确地识别为 1(正面)或 0(负面)。
model.compile(loss='binary_crossentropy',optimizer = 'adam',metrics = ['accuracy'])
一旦模型被编译,它就可以适合先前创建的训练和测试数据。
r = model.fit(data_train,y_train,epochs=5,validation_data=(data_test,y_test))
5 个周期后达到的准确度为 87.8%,这是不错的。训练中出现的一个问题是数据集很小,因此过度拟合是一个主要问题。减少参数(更少的层)和一些下降有助于克服过度拟合。Altomonte 的应该考虑在未来收集更多的评论,以获得一个更通用的预测模型。
预测
来自阿尔托蒙特意大利市场脸书页面的评论示例(嘿,看看这个!):
“强烈推荐!!!直到最近一个朋友来我家吃饭,我才知道奥尔多蒙特。我丈夫和我决定去看看,当我们在那里时,我们见到了店主,她是有史以来最可爱的人!她带我们参观了一下。晚餐我们买了马萨拉鸡,味道好极了!我们还买了布鲁克林披萨当午餐,非常好吃!我们品尝了他们的咖啡,他们让我们品尝了奶油煎饼卷、脆饼和饼干。非常好!我们买了贝壳、番茄酱、一瓶酒、一些奶酪等。一切看起来很好,味道很好,我们可以花几个小时在那里!我们会回来的!!也许今天?”
阅读这篇评论,我们可以直观地看到这是一个积极的情绪,然而,模型预测了什么?
review = tokenizer.texts_to_sequences(instance)pred_list = []
for sublist in review:
for item in sublist:
pred_list.append(item)predict_list = [predict_list]review = pad_sequences(flat_list, padding='post', maxlen=T)prediction = model.predict(review).round()
将代码转换成填充序列,可以对其情感进行预测。预测四舍五入为 0 或 1。
array([[1.]], dtype=float32)
正如你所看到的,这篇评论被预测为 1,或者是正面的(大约 88%的准确率)!就像这样,我们有一个 CNN 预测模型,Altomonte’s 可以用它来衡量客户对未评级评论的态度和对其业务运营的感受!
结论

Altomonte 意大利市场在线评论中最常见的词(摘自完整分析)
小型企业可以将许多机器学习技术整合到他们的运营结构中,以帮助更好地了解企业生产力和绩效。对于食品行业的企业来说,自然语言处理很实用,可以更深入地了解客户的想法,而不仅仅是看评论和做出有根据的猜测。对于 Alomonte 的意大利市场,还有许多其他未讨论的 NLP 技术可以执行。评论的主题模型分析可以提供顾客在参观阿尔托蒙特企业时注意到什么和喜欢什么的反馈。小型企业要从 ML 分析中获得最佳结果,一个要点和建议是开始收集和存储大量数据,并开始整合 NLP 模型。感谢阅读!
来源
- Gé ron,A.: 用 Scikit-Learn 和 TensorFlow 实践机器学习:构建智能系统的概念、工具和技术。加利福尼亚州塞瓦斯托波尔奥莱利媒体公司(2017 年)。
- 瓦西里耶夫尤利。用 Python 和 Spacy 进行自然语言处理:实用介绍。旧金山:不上浆,2020。打印。
- 图片的使用得到了 Altomonte 的意大利市场公司的批准。
更多推荐


所有评论(0)