输出随机森林预测方程的想法

机器算法验证 随机森林 预言
2022-03-27 04:59:40

我已经阅读了以下回答我要问的问题的帖子:

使用随机森林模型根据传感器数据进行预测

输出预测的决策树

这是我到目前为止所做的:我将 Logistic 回归与随机森林进行了比较,并且 RF 的表现优于 Logistic。现在,与我合作的医学研究人员希望将我的射频结果转化为医学诊断工具。例如:

如果您是 25 至 35 岁的亚洲男性,维生素 D 低于 xx,血压高于 xx,您有 76% 的机会患上 xxx 病。

然而,RF 并不适合简单的数学方程(见上面的链接)。所以这是我的问题:你们对使用 RF 开发诊断工具有什么想法(无需导出数百棵树)。

以下是我的一些想法:

  1. 使用 RF 进行变量选择,然后使用 Logistic(使用所有可能的交互)来制作诊断方程。
  2. 以某种方式将 RF 森林聚合成一棵“巨型树”,以某种方式平均节点在树上的分裂。
  3. 与 #2 和 #1 类似,使用 RF 选择变量(例如总共 m 个变量),然后构建数百个分类树,所有这些树都使用每个 m 个变量,然后选择最佳的单棵树。

还有其他想法吗?此外,做#1 很容易,但是关于如何实现#2 和#3 的任何想法?

3个回答

我不得不处理在诊断环境中使用 RF 的相同情况,利益相关者习惯于将算法归结为一个单一的、可读的方程。我发现如果你从解释一个简单的决策树开始(在这里你可以使用方程),然后是一个非常复杂的决策树,然后解释过度拟合的缺点,你就会开始点头。一旦您解释了许多小树可以通过不同的生长方式(“随机”)来减轻不准确性,并且可以将它们视为整体投票或平均值以避免过度拟合但仍考虑边缘情况,您就会理解。以下是我使用过的一些示例幻灯片,效果很好:

您无法摆脱森林中的树木,它们赋予了算法如此强大的预测能力和鲁棒性,因此如果 RF 非常适合您,几乎没有更好的解决方案。将进行比较的那些,如 SVM(取决于您的数据),将同样复杂。你必须让他们明白,任何好的解决方案都将是一个黑匣子(对用户而言)。您最好的举措是创建一个消耗性实现,它不需要比单个方程更多的努力。我已经成功地在 Python 中构建了一个 RF 模型(通过sklearn),并创建一个简单的 Web 服务器 REST API,将该模型加载到内存中并接受 POST 中的变量以输出预测。您也可以非常轻松地在 Java 或 R 中执行此操作,或者跳过 API 并创建一个可执行二进制文件/jar,将数据作为参数。

这里有一些想法:

  1. 可能会以某种方式检查所有黑盒模型。例如,您可以计算每个特征的变量重要性,也可以绘制每个特征的预测响应和实际响应(链接);
  2. 您可能会考虑对整体进行一些修剪。并非森林中的所有树木都是必需的,您可能只使用几棵。论文:[搜索最小随机森林,张]。否则,只需谷歌“集成修剪”,并查看“集成方法:基础和算法”第 6 章
  3. 如您所说,您可以通过特征选择来构建单个模型。否则,您也可以尝试在 [通过多个模型从示例中获取知识] 中使用 Domingos 的方法,该方法包括构建具有黑盒预测的新数据集并在其之上构建决策树。
  4. 正如 Stack Exchange 的回答中提到,树模型似乎可以解释,但由于训练数据的小扰动,它很容易发生很大的变化。因此,最好使用黑盒模型。最终用户的最终目标是了解为什么将新记录归类为特定类别。您可能会考虑仅针对该特定记录的一些特征重要性。

我会选择 1 或 2。

我有通过在 SQL Server 环境中部署随机森林的经验User Defined Function诀窍是将IF-THEN ELSE您从每棵树获得的规则转换为一个CASE-WHEN END或任何其他Conditional Processing构造(诚然,我使用了 JMP Pro 的 Bootstrap Forest 实现 - 500k 行 SQL 代码)。

绝对没有理由使用该rattle R软件包无法实现这一点。查看该包中的randomForest2Rules&printRandomForests函数。两者都以random forest对象为输入,访问森林中的每一棵树,并输出一组IF-THEN ELSE规则。以此为起点,以自动化方式将此逻辑转换为您想要的语言应该不难,因为上述函数的输出是结构化文本。

以上,也使得确定最小的号码很重要。您需要在森林中以所需的准确度进行预测的树木数量(提示:plot(rf.object) 向您展示了尽管添加了更多树木,但森林预测在什么时候没有改善。)以保持否。线代表森林下来。