本文概述
想象一下, 有一天, 一位来自本地医院的叫Heidi的管理员来找一位自由数据科学家来完成一项任务。每天, 有30人抱怨胸痛来到医院的急诊室。这些患者中有一些患有心脏病, 应立即送至冠状动脉护理床, 而实际上其他患者则没有心脏病, 应送至常规医院的病床。不幸的是, 尚不清楚哪些患者正在心脏病发作, 哪些患者没有心脏病发作。就时间和成本而言, 在将每位患者分配到两张床中的一张之前, 先对他们进行一次确定的心脏病发作检查, 这将是令人望而却步的。相反, 医生需要根据有限的不确定信息(从基本人口统计信息(例如年龄和性别)到可以在相对较短的时间内完成的各种医学测试)为每个专利做出快速决策。
Heidi希望你能帮助设计一种算法, 急诊室医生可使用该算法快速确定将每位胸痛患者送往何处。重要的是, 她告诉你, 医生只会使用他们可以快速理解并以最小的努力应用的算法。理想情况下, 该算法甚至不需要计算器就可以使用!因此, 复杂的算法(例如随机森林, 甚至回归分析)都不可行。
哪种算法适合此任务, 如何创建它?
解决该问题的算法是快速节俭决策树(Martignon等, 2003)。节俭的树是一种非常简单的决策树, 任何人都可以轻松理解, 学习和使用它, 以最少的努力做出快速的决策。
在本教程中, 你将介绍使用FFTrees R包(Phillips等人2017)创建快速节俭的树的基础知识。你将使用来自实际急诊室患者的数据来创建几棵节俭的树木, 然后可视化其为训练和测试数据做出决策的能力。
具有FFTree的R中的快速节俭决策树
安装FFTrees软件包
你可以使用install.packages()函数从CRAN安装FFTrees软件包
# Install FFTrees from CRAN
install.packages("FFTrees")
安装软件包后, 可以使用library()函数加载它:
# Load the package
library("FFTrees")
探索心脏病数据
FFTrees软件包包含两个数据集, 你将在本教程中使用它们:一个名为heart.train的数据集, 你将使用它来创建(又称训练)快速节俭的树, 而另一个名为heart.test的数据集将用于测试他们的预测表现。
让我们看一下heart.train数据帧的前几行:
# Print the first few rows of the training dataframe
head(heart.train)
## age sex cp trestbps chol fbs restecg thalach exang oldpeak slope
## 94 44 0 np 108 141 0 normal 175 0 0.6 flat
## 78 51 0 np 140 308 0 hypertrophy 142 0 1.5 up
## 167 52 1 np 138 223 0 normal 169 0 0.0 up
## 17 48 1 aa 110 229 0 normal 168 0 1.0 down
## 141 59 1 aa 140 221 0 normal 164 1 0.0 up
## 145 58 1 np 105 240 0 hypertrophy 154 1 0.6 flat
## ca thal diagnosis
## 94 0 normal 0
## 78 1 normal 0
## 167 1 normal 0
## 17 0 rd 1
## 141 0 normal 0
## 145 0 rd 0
如你所见, 此数据框包含来自多个患者的数据, 每个患者均按年龄和性别等人口统计特征以及其胆固醇水平(chol)和胸痛类型(cp)等医学检查和测量结果分类)。你要预测的关键变量是诊断, 对于真正患有心脏病的患者为1, 对于没有心脏病的患者为0。快速节俭的目标是在数据中找到一些可以快速准确地预测诊断的关键变量。
创建一个FFTrees对象
为了从heart.train数据帧创建快速节俭的树, 你将使用FFTrees()函数。这将返回FFTrees类的对象, 该对象将分配给heart_FFT。 FFTrees()的主要参数是
- 数据:用于创建树的数据框。
- 公式:一个公式, 该公式指定要与树一起预测的变量。
另外, 你将指定三个可选参数
- data.test:用于测试树的预测准确性的数据
- 主要:标题。
- Decision.labels:最终决定的口头标签。在这种情况下, 你将树称为” ER决策”, 并为两种床型使用”稳定”和” H攻击”。
# Create an FFTrees object called `heart_FFT`
heart_FFT <- FFTrees(formula = diagnosis ~ ., # The variable we are predicting
data = heart.train, # Training data
data.test = heart.test, # Testing data
main = "ER Decisions", # Main label
decision.labels = c("Stable", "H Attack")) # Label for decisions
现在, 你已经创建了heart_FFT对象, 可以对其进行打印以获得基本的摘要统计信息:
# Print basic information about the FFT
heart_FFT
## ER Decisions
## FFT #1 predicts diagnosis using 3 cues: {thal, cp, ca}
##
## [1] If thal = {rd, fd}, predict H Attack.
## [2] If cp != {a}, predict Stable.
## [3] If ca <= 0, predict Stable, otherwise, predict H Attack.
##
## train test
## cases :n 150.00 153.00
## speed :mcu 1.74 1.73
## frugality :pci 0.88 0.88
## accuracy :acc 0.80 0.82
## weighted :wacc 0.80 0.82
## sensitivity :sens 0.82 0.88
## specificity :spec 0.79 0.76
##
## pars: algorithm = 'ifan', goal = 'wacc', goal.chase = 'bacc', sens.w = 0.5, max.levels = 4
在这里, 你会看到树使用了三个线索或特征thal, cp和ca, 可以将它们总结如下:
[1]如果thal是rd或fd, 请决定心脏病发作。 [2]如果cp不等于a, 则确定为稳定。 [3]如果ca <= 0, 则确定”常规”, 否则, 确定”心脏病发作”。
重要的是, 树顺序使用了这三个提示。即, 一旦为患者做出决定, 则不考虑其他信息。
当你直观地看到树时, 这将变得非常清晰!
从这一点出发, 你还可以在训练和测试数据集中看到许多关于树的摘要性能统计信息, 从树的速度到其准确性。例如, 训练数据的值speed = 1.74, 表示树平均使用1.74条信息对案例进行分类。此外, 测试数据的值准确性= 0.82意味着该树的测试数据准确性为82%。
绘制节俭的树木
快速节俭的树的最佳功能之一是它在视觉上非常容易理解。要可视化树以及摘要统计信息, 可以使用通用绘图功能plot():
# Visualise the tree applied to the test data heart.test
plot(heart_FFT, data = "test")
该图可以为你提供有关数据和快速节俭树的大量重要信息。
- 在最上面的一行中, 你可以看到训练数据中有150位患者(病例), 其中66位真正患有心脏病(44%), 而84位没有心脏病(56%)。
- 在中间的行中, 你可以确切地看到树是如何使用易于理解的图标数组为每个患者做出决策的(Galesic 2009)。例如, 你看到第一个问题之后, (实际上)有63名疑似心脏病发作的患者被送往CCU, 其中有16名没有心脏病发作(假警报), 有47名患有心脏病发作(命中)。
- 在图的底行中, 你可以看到树的汇总摘要统计信息。在最下面一行, 你有一个2 x 2的混淆矩阵(请参阅此Wikipedia页面), 其中显示了树能够对患者进行分类的能力的摘要, 指示总体摘要统计的级别以及用于比较准确性的ROC曲线将树与其他算法结合使用, 例如逻辑回归(LR)和随机森林(RF)。在这里, 以绿色圆圈” 1″表示快速节俭的树, 你可以看到, 快速节俭的树具有比逻辑回归和随机森林更高的敏感性, 但代价是特异性较低。
创建和测试自定义树
关于快速节俭树的最好的事情之一是, 因为它们是如此简单, 所以你可以轻松地”用文字描述”你自己的快速节俭树, 然后使用FFTrees()将其应用于数据。这在比较不同的节俭树时非常有用。例如, 在向海蒂展示图1中的树后, 她可能会向你返回以下内容:”你展示的树看起来不错, 但我们的一名工作人员认为, 更好的规则是使用提示胆固醇, 年龄和坡度。你可以将这棵树应用于数据, 并比较它与你提供的树的效果如何吗?”:
海蒂的树
[1]如果胆固醇> 300, 则判定为心脏病发作[2]如果年龄<50, 则判定为心脏病发作[3]如果坡度上升或平坦, 则预测为”发作”, 否则, 判定为”稳定”
是的, 你可以轻松做到! FFTrees()函数中的my.tree参数使我们能够轻松地创建和测试可以在单词中键入的任何树。在下面的代码块中, 我将使用my.tree参数创建Heidi的树。
# Create Heidi's custom FFT
custom_FFT <- FFTrees(formula = diagnosis ~ ., data = heart.train, data.test = heart.test, main = "Heidi's Tree", decision.labels = c("Stable", "Attack"), my.tree = "If chol > 300, predict Attack.
If age < 50, predict Stable.
If slope = {up, flat} predict Attack. Otherwise, predict Stable.")
# Plot Heidi's tree and accuracy statistics
plot(custom_FFT, data = "test")
如你所见, Heidi的树比内部算法提出的树差很多。虽然图1中FFTrees生成的树的总体准确性为82%, 但是Heidi的树的准确性仅为54%!
此外, 你会发现, 根据胆固醇水平, 只有极少数的患者(只有21名)被归类为在第一节后有心脏病发作, 而其中只有12/21(57%)的患者真正患有心脏病。相比之下, 对于由FFTree创建的树, 根据其thal值将第一个节点后的全部72名患者分类, 其中75%的确患有心脏病。因此, 你有充分的证据表明FFTrees创建的树比Heidi的树更快, 更准确。
你可以使用此软件包做更多的事情!例如, 你可以使用树来预测新数据集的类(及其概率), 并创建使不同分类错误成本最小化的树(例如, 当未命中的成本远高于错误警报的成本时) 。
有关这些功能的更多信息以及更多信息, 请通过运行FFTrees.guide()来检查包装插图。
摘要
快速节俭的决策树是你需要简单, 透明的决策算法(可由人或计算机轻松传达和应用)的理想选择。在本教程中, 你介绍了使用FFTrees包从医疗数据创建和显示快速节俭的决策树的基本步骤。
尽管节俭的树很适合医疗决策(Green&Mehr, 1997), 但可以从任何具有二元标准的数据集创建树, 从预测银行是否会倒闭(Neth等人, 2014), 预测法官的保释决定(Dhami&Ayton, 2001)。玩得开心!
你想要了解更多有关FFTrees软件包创建者Nathaniel的信息吗?请访问他的网站或通过Nathaniel.D.Phillips.is@gmail.com向他发送电子邮件!
参考文献
- Dhami, Mandeep K和Peter Ayton。 2001。”快速而节俭的方式收费”。行为决策杂志14(2)。威利在线图书馆:141-168。
- Galesic, Mirta, Rocio Garcia-Retamero和Gerd Gigerenzer。 2009。”使用图标阵列传达医疗风险:克服低计算能力。”健康心理学28(2)。美国心理学会:210。
- Green, Lee和David R Mehr。 1997年。”是什么改变了医师决定接受冠状动脉护理部门的决定”。家庭实践杂志45(3)。 [纽约, Appleton-Century-Crofts]:219-226。
- Martignon, Laura, Oliver Vitouch, Masanori Takezawa和Malcolm R Forster。 2003。”天真但开明:从自然频率到快速节俭的决策树。”思维:关于推理, 判断和决策的心理学观点。 John Wiley&Sons, Ltd, 189-211。
- Neth, Hansjörg, BjörnMeder, Amit Kothiyal和Gerd Gigerenzer。 2014年。”金融世界中的Heur Heuristicus:从风险管理到不确定性管理”。金融机构风险管理杂志7(2)。亨利·斯图尔特(Henry Stewart)出版物:134-144。
- 菲利普斯(Phillips), 纳撒尼尔(Nathaniel D), 汉斯约格·内(HansjörgNeth), 简·K·沃克(Jan K Woike)和沃尔夫冈·盖斯迈(Wolfgang Gaissmaier)。 2017。” FFTrees:创建, 可视化和评估快速节俭决策树的工具箱。”判断与决策制定12(4)。判断与决策学会:344。