构建多个神经网络模型我正在使用神经平台进行预测,并且,作为神经网络的新手,我对所有输入参数仅略有熟悉:隐藏层数量、节点/隐藏层数量、提升模型、学习率和游览。 我想做的是尽量减少 RMSE 和验证模型误分类率。 我一直在做的是迭代地逐一更改每个参数,保存模型性能参数,并将它们粘贴到新的 JMP 表中,但这需要几天的时间,因为有如此多的图层、节点、游览的组合,是否可以编写一个脚本来让 JMP Pro 构建(例如,1,000 个模型)并将数据转储到表中,这样我就不必手动更改每个模型输入参数?
#隐藏层:1或2
#S形节点:0、1、2、3或4
#线性节点:0、1、2、3 或 4
#径向节点:0、1、2、3 或 4
#boosting 模型:不知道,也许是 1-5?
#学习率:0-0.5,增量为 0.1
#游览:1、5、10、20、100
因此,这将是 2 x 5 x 5 x 5 x 5 x 5 x 5=~30,000。
我想一旦我更熟悉数据集,我就可以解决其中的一些问题。 当然,拥有许多节点和大量的提升模型没有意义(某些其他组合也没有意义),但我们仍然在谈论潜在的数百个值得测试的模型。 当然,这种模型筛选/比较可以编写脚本,对吗?
预测建模和机器学习回复:构建多个神经网络模型@SDF1我看到了您的消息,但在尝试回复时收到了一条奇怪的错误消息: abm64@miami.edu 。
顺便说一句,在几周没有使用它之后,最后一个版本的 GUI 现在可以在我的 16 英寸 Macbook Pro 上运行,没有任何与边界框相关的问题(使用连续 Y 和分类 Y 以及所有不同的验证类型)。 我不记得在我的电脑上更新过任何东西,但是,嘿,我很高兴它也能在这台电脑上运行(它一直能在我的 Macbook Air 上运行,它已经快不行了!)。
回复:构建多个神经网络模型你好@abmayfield ,
有趣的是,这个问题似乎确实与 Macbook Pro(也许还与它运行的操作系统)有关。 它可能与操作系统甚至硬件相关——比如 JMP 在 Pro 上使用图形处理单元的方式与在 Air 上使用图形处理单元的方式有所不同。 也许检查一下 Mac 是否使两台计算机具有相同的 GPU,或者是否可能是硬件问题。 无论如何,我想 JMP 开发人员会希望更多地了解您所面临的具体情况,并且在发现峰会上提请他们注意这一点将会有所帮助。 至少不是我无能! 
我很高兴您仍然能够在 Air 上运行它。 我希望您的 Air 继续工作,以便您可以制作视频并将其提交给峰会。 让我知道您的演讲时间,我想看看。
谢谢!,
DS
回复:构建多个神经网络模型你知道我这周学到了什么,这实际上是我在工作 Macbook Pro 上花费的最多时间? JMP Pro 16.1 中有很多小、烦人但大多是微不足道的错误,但在我的 Macbook Air 上完全不存在。 而这一切都与美学有关。 例如,您知道如何将左侧的脚本分组,然后单击以展开分组的文件夹吗? 那是行不通的。 嗯,有时它会起作用。 您需要单击展开箭头,然后单击屏幕上的其他位置,返回,再次单击,它最终会展开。 还有其他一些小而奇怪的事情,比如我在另一台 Mac 上的相同操作系统和相同版本的 JMP Pro 上从未注意到它们,因此 JMP 和这台特定计算机之间的相互通信一定存在问题,从而影响您的脚本因为这似乎与外表有关。 换句话说,我不认为这是因为你的无能,哈哈,我完全希望在我的另一台计算机上仍然使用新的 GUI。 事实上,当我在工作计算机上输入此内容时,它正在运行 2,000 个神经网络模型。 考虑到我的 Macbook Air 的老化性质,我只需要最终解决这些 Macbook Pro 问题。 事实上,我可能会开始记录所有这些小错误和怪癖,并尝试在发现峰会上与一些开发人员交谈。 我想知道这确实是我的电脑问题还是 Macbook Pro 的普遍问题。 我不想升级到最新的 Mac 操作系统 (Big Sur),但我想知道这是否真的是解决方案。
回复:构建多个神经网络模型你好@abmayfield ,
得知您继续收到此错误,我们深感抱歉。 我上传的“GenAT_ver3.0.jsl”文件就是我正在使用的文件。 我已经在我的工作 (JMP 16.0 Pro) 和个人 PC (JMP EA17) 上尝试过,并且它适用于两者。 当我尝试拟合您的数据时,两台电脑上都没有出现错误。 这肯定与 Macbook Pro 如何处理适配报告窗口有关。 我对如何在无法访问特定计算机的情况下修复它感到困惑。 我必须查看报告窗口的树形结构,并尝试找出 PC、Macbook 和 Macbook Pro 之间的区别。
我回去仔细查看了您的日志文件,认为这可能与您生成的特定 DOE 有关,但即使当我运行该 DOE 并基于它制作调整表时,它仍然有效。 至少它可以在我使用的电脑上运行。
这太糟糕了,因为听起来如果 GUI 不是在 Macbook Pro 上运行,您可能无法在演讲中演示 GUI。 我希望我能在这个问题上提供更多帮助。
DS
回复:构建多个神经网络模型另一件可能提供信息的事情是:即使我有连续的 Y,我也会收到相同的消息(无论验证类型如何)。 奇怪的!
回复:构建多个神经网络模型我刚刚在 Macbook Pro 上尝试并得到了相同的 Outline box/arg 1 错误,但我注意到了一些事情:7 月的版本被命名为“3.0”。 您是否认为您已更新但随后不小心上传了旧版本?
回复:构建多个神经网络模型惊人的! 让我现在尝试并报告。 事实证明,JMP 支持确实得出了相同的结论,所以我相信它现在会起作用。
回复:构建多个神经网络模型你好@abmayfield ,
感谢您提供的文件,它帮助我找出错误所在。 这与我平庸的编程能力和对 JMP 中树结构的完全理解有关(这方面我都是自学的)。 不管怎样,最新版本的日期是正确的,我在七月初左右更新了一些内容,以考虑到拟合统计数据根据 Y 值的建模数据类型(例如数值)改变它们在树结构中的位置的事实、序数或分类。 我几乎 100% 的时间都在处理纯数字响应,因此我没有定期看到此错误。 为了正确提供其他建模类型数据的拟合统计信息,我需要修改它分配该变量的方式。 值得庆幸的是,从 JMP 方面来看,这一切都相当合乎逻辑,因此修改并不那么困难。
附件是 ver3.0,无论您使用的操作系统或 JMP 版本如何,都应该可以解决此问题。 我认为支持不会有太大帮助,因为从某种意义上来说这是一个“第三方”代码。 不管怎样,请尝试一下这个 ver3.0,如果它继续出现问题,请告诉我。
谢谢!,
DS
回复:构建多个神经网络模型我尝试了 JMP Pro 15,但仍然收到相同的错误消息:
访问或评估 'Outline Box' 、Outline Box/*###*/(o_box) 时预期字符 arg 1
我从 7 月 10 日左右开始使用 GUI 版本 3。 那是最近的,对吧?
当我运行调试器时,它告诉我:“对象按钮框无法识别发送的消息;也许您的意思是其中之一......”然后它列出了一些替代方案。 但按钮盒的形状很好,所有按钮都可以工作。
我认为你的树结构参数可能是问题所在,但它是相同的操作系统(Catalina)。 我将联系技术支持。
回复:构建多个神经网络模型我正在附加带有 GUI 的日志和表格(最后一个脚本)。 我尝试了所有对我试图预测的事情(Y)有意义的验证类型。 通常情况下,我会在我的个人 Macbook 上完成所有操作(一切正常),但这台电脑距离报废还有几周时间,所以我希望我能在这台更新、更好的 Macbook Pro 上完成所有操作! 与此同时,我将尝试一些事情。 有一个很小的机会,我可能刚刚复制了旧版本的 GUI(仍然有错误),这将是一个简单的修复,尽管我不认为这是问题,因为无论如何,它在其他版本上都有效电脑。 如果您发现任何奇怪的事情,我会很好奇,并再次感谢您对此进行调查。
回复:构建多个神经网络模型你好@abmayfield ,
我不得不说,对于它与 Air 而不是 Pro 一起工作来说,这是一些奇怪的行为。 如果我没记错的话,那个 o_box 调用是为了提取一些拟合的统计数据,它可以根据您使用的验证方法类型而改变:保留、排除行等。 听起来不像是 JMP 版本,因为两者都运行 16.1。 您对两台计算机使用相同的验证方法吗? 您使用哪种方法?
我唯一的猜测是,如果从一个 Macbook 型号到下一个型号都不起作用,则报告的树结构一定会发生变化,并且 JSL 代码正在寻找位于特定位置的值,但它又回来了空或 NAN 或其他东西,它会抛出错误。 这可能有点超出了我的编码能力——使其独立于操作系统可能超出了我的能力范围。 我在 PC 上运行,Windows10。 我毫不怀疑 JMP 中有更熟练的程序员可以弄清楚如何解决这个问题,以便它可以在不同的操作系统上运行等等。
如果我可以重现该错误,那么修复对我来说相对容易,但我无法访问 Macbook Pro。 同时,您可以在 Macbook Pro 上运行它并检查日志文件,看看它是否会告诉您它在哪一行代码处崩溃? 这可能会帮助我缩小错误的位置,并可能了解如何修复它。
谢谢!,
DS
回复:构建多个神经网络模型G r吃。 非常感谢。 我确实注意到了一些事情今天:在我运行 Catalina 和 JMP Pro 16.1 的 13 英寸 Macbook Air 上,一切正常。 然后,我迁移到我的工作 Macbook Pro 16 英寸,也运行 Catalina 和 JMP Pro 16.1,使用完全相同的数据表和 GUI,我在访问或评估“大纲框”时得到了奇怪的“预期字符 arg 1” ,大纲框/*###*/(o_box)”,无论我输入什么。 您认为它实际上可以链接到显示器(即更大的屏幕)吗? 当然不是。 脚本在一台计算机上运行而不是在另一台计算机上运行似乎很奇怪。 有任何想法吗?
回复:构建多个神经网络模型你好@abmayfield ,
没问题,我很高兴它能有所帮助。 是的,调整 XGBoost 可能会涉及更多一些。 我找到了一个博客这里这非常有用——该页面上的最后一个博客条目,但由于某种原因,博客文章的链接没有真正响应。 它提供了如何在 Python 中完成此操作的示例,但一旦您弄清楚了模型参数的术语,它在 JMP 中基本上是相同的。 我也发现了这个地点以及随附的文档对于了解 XGBoost 的作用以及哪些参数使其或多或少保守模型非常有帮助。 我喜欢它的一件事是它比增强树或随机森林稳定得多。 这两者在 R^2 中都有一些随机行为,导致每次在所有参数相同的情况下运行拟合时,模型都会略有不同。 每次运行相同的参数集时,XGBoost 都会为您提供相同的拟合质量。
请随意在您的 Discovery 演讲中提及 NN GUI——我计划以虚拟方式参加,并打算尝试去卡里亲自参观(距离我只有一个小时),但我认为由于大流行带来的持续问题,他们停止了面对面的聚会。 我已经将 GUI 发布到了加载项页面,因此从技术上讲,我猜它已经“发布”并在那里了。 感谢您询问并考虑甚至演示它。 希望能顺利进行! 我不是最好的程序员,但我可以让事情正常运转。 如果您遇到任何问题,请告诉我,我会尽力尽快纠正。
谢谢!,
DS
回复:构建多个神经网络模型哇! 非常感谢r 表格和解释。 我在想,既然我终于熟悉了所有的 NN 术语,XGBoost 就会轻而易举,但似乎我还有很多东西要学(只是为了掌握术语)! 看起来 XGBoost 是目前机器学习世界的“宠儿”,但更重要的是,它实际上可能更适合我生成的数据类型,所以我绝对需要深入研究所有这一切(例如,当您的 GUI 在后台运行时!)。 说到这里,您介意我在 JMP Discovery 演讲(我本周正在录制)中提到 NN GUI,甚至很可能演示它吗? 我肯定会赞扬你,但如果你想成为向更多观众展示它的人并且不想“抢走你的风头”,我完全理解。 我只会使用神经平台,因为我怀疑我会在周五(当我录制演讲时)成为 XGBoost 的大师,哈哈。
回复:构建多个神经网络模型你好@abmayfield ,
我还没有升级到 16.1,所以我没有遇到同样的错误,但是我会密切关注以防发生这种情况,并在需要时发布任何更新。
至于 XGBoost,我确实有一个调整表来优化它。 它附在这里。 XGBoost 平台有许多不同的可以修改的调整参数。 有些人比其他人更有影响力。 我通常会逐步调整模型,因为它的参数空间非常大。 我没有调整表的所有可能参数,只有最有影响力的参数(您始终可以使用适当名称的列添加更多参数)。 您可以通过打开 XGBoost 窗口中的“高级选项”子菜单来访问平台中的完整参数列表。 由于您提到您有一个高度不平衡的数据集,因此您需要确保将scale_pos_weight参数设置为1。
事实上,您甚至可以从平台本身运行调整设计,它将使用空间填充 DOE 来生成调整表。 它非常方便和灵活。 然而,我发现对于 CPU 使用和 RAM 最小化,在 JMP 中像 GUI 的工作方式一样运行它会更好。
我发现对于我的情况,遵循以下步骤对于 XGBoost 非常有效:
1. 修复学习率、max_深度、min_child_weight、gamma、subsample 和 colsample_bytree,以首先找到正确的树数。 这些其他参数将在稍后调整。 我首先将它们设置为默认值。
2. 调整 max_depth 和 min_child_weight
3.调整gamma(在进行步骤4之前重新调整树的数量是个好主意)
4. 调整 subsample 和 colsample_bytree
5 调整 alpha 和 lambda,正则化参数
6. 调整学习率:降低学习率并增加树的数量。
在每个步骤中,我都会为我希望调整的参数生成一个调整表,同时将其他参数固定在该步骤的值。 我通常会重复这个序列两次。 运行 XGBoost 时使用交叉验证(K 折或验证列)至关重要。 您可以在没有交叉验证的情况下运行拟合,但是您可能会面临数据过度拟合的风险,并且最终无法真正获得那么好的预测模型。
希望这可以帮助!,
DS
回复:构建多个神经网络模型没关系第一点。 我认为对我来说有些奇怪,或者将样本适当分层为训练、验证和测试。 基本上,我有一个完全不平衡的设计,其中我试图预测的一组更为常见,所以我认为这是导致问题的原因!
回复:构建多个神经网络模型升级到 JMP Po 16.1 后,我再次开始使用您的 NN GUI,并表示再次出现“下标范围”错误。 您遇到过这个问题吗?
另一方面,你们有 XGBoost 调整表的 DOE 脚本吗? 我也将使用您的 GUI 来探索这种方法! 非常感谢
回复:构建多个神经网络模型非常感谢您提供的所有信息。 我确实会尝试构建大量模型,但根本不知道自己在做什么。 两年前,我用另一种方法做到了这一点,当时正准备写一篇《自然》文章,以为我已经改变了我们所知道的海洋生物学,然后我意识到我完全错误地解释了模型,哈哈。 值得庆幸的是,人工智能和机器学习模型在我工作的地方非常流行,所以,尽管我使用它们的动机是由传统方法驱动的,而不是削减它(而不是我想做人工智能,因为它很“性感”) ,我希望我能利用这波对这类分析的兴趣,尝试了解所有的来龙去脉。
回复:构建多个神经网络模型你好@abmayfield ,
至于 XGBoost 插件,您需要单独下载并安装该插件。 它适用于 JMP Pro 15 及更高版本。 你可以找到插件这里。 在继续进行自己的建模之前,请务必阅读文档并尝试 Russ 在帖子中解释的一些测试建模。 目前,该平台仍然需要用户对如何修改/操作拟合的超参数有更多的了解。 我找到了这个博客在调整 XGBoost 平台时非常有帮助(有许多不同的参数需要调整,这使得整个空间相当麻烦)。 尽管它是为 python 用户编写的,但相同的基本思想也适用于 JMP 平台。 这视频也很有帮助,您还需要了解模型中每个参数的作用、其工作范围是什么,以及为什么您可能想要或可能不想修改它的默认值这里。 它绝对不是一个不做任何背景作业就可以直接进入的平台。 我一开始就发现了这一点,并意识到我不知道自己在做什么。 所以,我做了一些作业,这很有帮助。 现在,我可以使用上面列出的博客中的框架快速调整模型。
祝你好运!,
DS
回复:构建多个神经网络模型非常感谢您的解释,我很高兴我问了这个问题,因为我的假设是错误的。 不过,更有意义的是,每次“运行”都将是一次随机洗牌,即哪些样本在训练模型中,哪些样本被保留。 正如您之前所说,对于我的小而宽的数据集,手动排除行或创建验证列更有意义,所以实际上我只是想确保我“掌握”所有各种选项,因为希望在将来,我将拥有一个可以使用holdback和kfold的数据集。 我特别认为后者很有吸引力/很聪明。
我有大约 15,000 个带有你们 GUI 的模型,毫不夸张。 现在我想我要尝试比较 NN 和 XGBoost,这是一种我在 GUI 之前从未听说过的技术。 我什至不知道它是否在 JMP Pro 16 中(尽管它可能隐藏在某个地方)!
回复:构建多个神经网络模型你好@abmayfield ,
抱歉这么晚才回复,上周我出去度假了。
关于您关于保留部分的问题,据我了解,JMP 将根据您的保留值随机选择行的百分比。 因此,如果您有 100 行并选择 0.3 作为保留部分,则每次 JMP 运行 NN 平台时,它将选择一组新的随机 30 行作为验证部分。 因此,就使用调优表而言,该平台称为每次迭代,其中它向 NN 平台发送一组新的模型参数。 如果您选择了保留选项进行验证并输入一个 0 到 1 范围内的数字,则调整表中的每次新运行,JMP 将根据保留部分选择一组不同的行。 但是,如果您在单个 NN 模型拟合期间运行多个游览,则它将在每个游览期间使用相同的保留行。 每次调用 NN 平台时,它都会生成一个新的子集进行验证。 至少这是我的理解。
对于上述情况,不可能知道哪些行被保留(至少我不知道)。 如果您想做类似的事情,那么我会选择排除行保留验证选项。 然后,您可以选择应排除数据表中的哪些行,并且仅将这些行用于验证。 据推测,您可以为 NN 平台提供特定的随机种子(例如 10191),用于每次带有保留部分的调整运行,并且每次都会使用该随机数来生成用于验证的子集。 由于每次调用 NN 平台时都从相同的随机种子开始,理论上 JMP 最终应该为每次调优运行选择相同的行。 然而,在这种情况下,您仍然不知道那些是哪些行。 再说一次,这是我对其工作原理的理解。
希望这可以帮助!,
DS
回复:构建多个神经网络模型感谢您出色的 GUI,我现在已经运行了 10,000 多个模型。 我确实有一个关于保留的问题。 假设我的调优表有 100 行(即要测试的不同模型)。 每行是否根据百分比获得随机保留,或者每个模型是否保留相同的 X 个样本? 我猜是后者。 换句话说,如果样本 A、B、C 和 D 被模型 #1 阻止,那么这四个样本也会被模型 #2 阻止。 我想无论如何我的后续问题是:是否有可能知道哪些样本被扣留? 无论如何,正如我们所讨论的,在我的例子中,拥有一个分层验证列确实更有意义,因为我可以确保每种处理中至少有一个样本被包含在训练、验证和测试中,而理论上随机 30% 的保留可以仅保留来自相同处理的样本(这会使预测偏向于所述处理!
回复:构建多个神经网络模型你好@abmayfield ,
我真的很高兴听到它对你有用,我希望这些错误已经得到解决。 我希望我有一个更好的解决方案来解决顶部数据表问题。 老实说,我不知道如何解决这个问题。
不管怎样,我相信你关于 Kfold xvalidation 的看法是正确的。 这种方法通常适用于高桌子,但不适用于宽桌子。 如果您的数据条目很少,那么使用对响应进行分层的验证列是一个好主意。 或者,如果您使用 GenReg 平台,则可以使用留一法。 但通常情况下,如果您需要考虑的数据点很少,Kfold 并不是最好的选择。
我绝对建议您研究一下 XGBoost,您可以从 JMP 上的插件页面下载该插件。 这是一个非常稳定和鲁棒的算法。 XGBoost 与验证列配合得非常好。
您还可以考虑研究 JMP Pro 具有的支持向量机。 它最初是为分类问题开发的,但也可以处理回归问题。 无论如何,使用未在模型训练或验证中使用的保留数据集来比较不同模型始终是一个好主意。 我通常会构建几个不同的模型,然后在全新的数据集上比较它们,看看哪个模型最能预测结果。
很高兴我能帮上忙!,
DS
回复:构建多个神经网络模型这太棒了。 我正在对每种验证方法进行 100 次迭代,但尚未遇到任何错误。 我还没有尝试过“排除行”,但我相信它会起作用。
kfold 总是给我相同的、完美的(过度拟合?)解决方案,尽管我认为这是对我的数据集的大小/格式的证明,而不是脚本的任何类型的错误。
从科学角度来说,我一直在做一些研究,看来我的“小”数据集(数十个样本和数百个潜在预测因子)可能更适合 XGBoost,否则神经网络可能会杀伤力过大,所以我将尝试一下平台也一样。 我什至根本不知道 JMP 支持 XGBoost(而我在 GUI 中见过随机森林以及可能的其他方法)。 换句话说,我期待利用这个优秀研究工具的所有组件! 非常感谢您的帮助(再次),如果我遇到任何其他错误,我会告诉您。
回复:构建多个神经网络模型你好@abmayfield ,
所以,我发现了我的编码中的问题所在。 这不是从一个版本的 JMP 到另一个版本的问题,它与名义或有序响应有多少级别有关。 这会更改报告窗口中列号框的位置。 我需要调整代码以反映当从具有 2 或 3、或 4 或 6 个级别的响应进行处理时,拟合的统计数据会更改报告中的位置。 好处是,更改的数量与级别的数量相关,因此我能够相对轻松地修复代码。 我花了一段时间才找出这个错误,因为我使用了示例数据中的 PowderMetallurgy 文件,但它只有两个级别,而不是像你的那样有 4 个级别。
附件是更新后的版本,它更通用化到不同级别的响应变量。 该代码应该已经适用于 2 级或 3 级验证列以及名义、序数和连续响应。
我使用您的数据集测试了所有适合的平台:NN、BT、Bootstrap Forest 和 XGBoost,它在所有数据类型和不同的验证选项中都能正常工作。 请注意,目前,JMP 只能使用提升树平台拟合两级响应(名义或序数)。 其他平台可以处理比这更多的级别。
我很确定它现在正在按预期工作(除了默认为最后打开的数据表 - 我不知道如何解决这个问题)。 但是,如果您确实发现其中存在错误,请告诉我。
谢谢,祝你好运!
DS
回复:构建多个神经网络模型你好@abmayfield ,
我的数据表也有同样的问题。 我认为你是对的,如果你不直接从建模的数据表运行它,它会以某种方式默认为 JMP 主窗口中最后打开的数据表。 我不知道如何解决这个问题。
嗯,代码应该与仅训练和验证或全部三个的验证列一起使用。 我编写它是为了检查验证列中的级别数并进行相应调整,这意味着无论有两个级别还是三个级别,都要记录适当的拟合统计数据。 明天我会仔细检查一下。 我认为下标范围错误很可能是由于15和16之间的变化造成的。 当 16 发布时,我没有回去仔细检查代码以确保它有效,但我在 15 中对其进行了多次测试,一切正常。 尽管如此,我会解决这个问题并纠正问题,以便它按预期工作,只是直到周五早上我才有时间去做。
再次感谢您帮助我调试代码,对于给您带来的不便,我们深表歉意。 当我检查了所有数据类型和代码类型(就像我将其作为 JMP 插件提交时所做的那样)后,我会回复您。
谢谢!,
DS
回复:构建多个神经网络模型惊人的! 现在我们用火做饭。 我现在唯一看到的是,即使 GUI 要求你告诉它哪个是数据表,哪个是调整表,它有时仍然会把它们混淆。 我认为它默认为最接近“堆顶部”的表(我倾向于打开 10-20 个表,否则这可能不会成为问题)。
是否可以添加一个简单的“规则”,即“如果验证列只有训练和验证项,则不要计算测试数据”或类似的内容? 我想另一种方法是手动检查代码并将“//”放在所有“测试”选项前面。 我问是因为有时我只使用训练和验证,而不是训练/验证/测试(因为我的样本量很小)。如果您现在输入仅包含训练和验证项的验证列,您会收到“下标范围”错误,我认为这是因为它正在寻找不存在的“测试”数据!
回复:构建多个神经网络模型你好@abmayfield ,
再次感谢您发现这一点并让我知道——我的模型往往有数字响应,因此我通常不需要编辑标称数据类型的内容。
无论如何,我认为从 JMP 15 到 16 可能发生了变化,导致报告窗口中出现不同的数字列框,因为我需要将所有相同的值从原来的值更改为现在的值,并且它之前在JMP 15,我记得测试过它。 我已经重新检查过,这个更新版本可以使用 NN 的不同验证方法正确运行:排除行保留、保留、kfold 和验证列。 对于给您带来的不便,再次表示歉意。 我很高兴您可以对其进行测试并让我知道其中的错误,以便它能够变得更好并帮助其他人。 如果您发现其他任何内容,请告诉我!
谢谢!,
DS
回复:构建多个神经网络模型感谢您对此进行研究,它现在可以与验证列一起使用,但是当我使用holdback或kfold时,我得到相同的错误代码。 我想知道是否是因为这些方法不一定将数据分层到我试图预测的每个 bin 所代表的位置? 我将尝试使用更大的数据集,看看是否出现相同的“下标范围”错误。
回复:构建多个神经网络模型你好@abmayfield ,
抱歉,过了一段时间才回复您。 我能够重现您遇到的错误,并找到我的代码中的错误所在。第 348 行和第 349 行的变量 ncol_box_v 和 ncol_box test 的值错误。 他们应该分别是 10 岁和 19 岁。 我已经纠正了这个问题,并使用验证列重新运行了神经网络,它按预期工作。 我附上更正后的代码。 带来不便敬请谅解。 感谢您发现这一点,如果您发现任何其他错误,请告诉我。
希望这可以帮助!,
DS
回复:构建多个神经网络模型哇,这个 GUI 真的升级了! 唯一的问题是现在我收到一个错误:“
无论我使用哪种验证类型,访问或评估 'V_stats[ /*###*/5]' 、 V_stats[/*###*/5" 时的下标范围。 我想知道是否是因为我的样本量太小,无法为四组(如 Y)中的每一组提供训练、验证和测试样本?
回复:构建多个神经网络模型你好@abmayfield ,
不,我猜测这是因为您选择为单选按钮选择设置一个验证列(相对于保留或排除保留等),但在将列转换为所选列时忘记将验证包含在列列表中角色。 这是我的猜测,但如果不是这样,那么我可能需要您提供逐步的描述。
我还对代码进行了一些更新,以纠正其他一些错误。 我的代码包括进度窗口,我认为您不想要它,但无论如何,我附加了新的 GenAt.jsl 文件,以便您可以获得源代码。 我一直使用它来协助我的建模——NN、提升树、随机森林和 XGBoost。 我喜欢它,但它确实需要从建模角度了解您正在做什么以及不同平台允许您做什么。
我不知道这是不是关联会起作用,但我尝试编写有关如何将其用于加载项存储库的描述。 我知道我可以通过我的 SAS 帐户访问该链接,只是不确定其他人是否可以。 不过,它尚未在存储库上公开。
希望这可以帮助!,
DS
回复:构建多个神经网络模型你好!
中断 6 个月后,我又回到了 NN 工作,我注意到,当我尝试运行 NN GUI 时,我收到一条新错误消息:“Send 需要 Scriptable Object 访问‘list’的评估,{/ *###*/“验证”})。” 您认为这可能是因为 JMP 15 和 16 之间的某些变化(即某些 JMP 15 脚本需要针对 JMP 16 进行修改吗?)
回复:构建多个神经网络模型太棒了! 当您发布时请告诉我。 我肯定会尝试一下,特别是因为我仍处于弄清楚该数据集的早期阶段(尽管 NN 明显优于我在 JMP Pro 16 上测试的所有其他模型类型)。 由于您所说的原因,我确实看到了不直接进入 NN 的价值,而且因为这对于减少响应变量来说并不是很好。 就我而言,我需要在每个样本中重复测量同一组 30-40 种蛋白质(正如您所指出的,没有丢失数据),与采用更传统的候选生物标记方法(使用一个或者只是一些预测因素)。 因此,我基本上只使用一些生物标记(通常使用 Gen-reg)制作简单、精简的模型,并将它们与脚本中优化的神经网络模型进行比较。 在这种情况下,NN 更优越,但这并不是说它总是来自我未来收集的每个数据集! 期待尝试 GUI、错误等等。
回复:构建多个神经网络模型你好@abmayfield ,
我绝对同意你关于不要有过于复杂的模型的观点。 这绝对是一个应该避免的问题。
我的看法是,神经网络建模与其他平台并没有太大不同。 每一种都有其优点和缺点。 例如,神经网络在处理缺失数据方面并不是那么出色,它们的计算可扩展性不是很好,而且众所周知,它们难以解释。 对于使用此类模型来帮助建立理论的人们来说,这种解释很重要。 神经网络也无法处理所有类型的数据集或不相关的输入。 但是,模型中没有任何假设,而且它们往往具有很高的预测能力。
但是,由于每种建模方法都有不同的优点/缺点,因此我倾向于跨不同平台进行建模,然后在新数据集上将每个平台的最佳模型与彼此进行比较,以了解哪种模型在预测结果方面表现最好。新数据集并使用该数据集。
话虽这么说,我刚刚完成了 GUI 界面的 1.0 版,该界面可以从 JMP 菜单热按钮运行(而不仅仅是从数据表中运行)。 您向其提供数据表和调整表,并根据您选择的四种方法(NN、提升树、引导森林、XGBoost)中的哪一种,它将运行您根据调整表发送的拟合次数。 它将适用于 Y 输入的不同数据类型和不同的验证列类型,甚至适用于 XGBoost 平台的多个验证列。 它绝不是没有错误的,但我很高兴在发布 NN 平台的第一个 GUI 后一周左右的时间里它就可以工作了。 它确实要求用户了解每个平台要使用哪个调整表以及其他平台的特定要求 - 就像必须知道 JMP 中的提升树平台不能处理超过 2 级的名义/序数数据(至少对于 JMP 15)或者 XGBoost 平台可以使用多个验证列,但每个验证列必须只有 2 个级别。
从事这个项目很有趣,并将对我未来的工作有所帮助。 谢谢!
祝你好运,
DS
回复:构建多个神经网络模型我认为部分原因可能与以下事实有关:对于许多建模类型,构建越来越复杂的模型并不是您想要做的:如果一个简单的模型很好地适合您的数据,并且验证或测试 RSME 值是低,然后就停在那里。 但对于神经网络来说,添加层、节点、增强、游览等不一定是坏事,因为虽然更复杂,但它们也更灵活。 所以我可以理解为什么为所有建模平台提供这个 GUI 可能会导致那些不熟悉建模的人进行彻底的数据挖掘,从而对他们造成损害。 不过,根据我对 NN 的有限理解,如果一个模型在 TanH=3 的默认条件下具有可观的验证 RSME,而另一个模型在两个隐藏层上具有 3 个 TanH、3 个线性节点和 3 个高斯节点,但具有类似的 RSME,您不会自动拒绝后一个模型,因为它更复杂,但在 RSME 方面同样足够,因为它最终可能对未来的测试数据集更加灵活。 因此,大多数人很可能会很好地构建数百到数千个神经网络模型。 不过,我完全有可能错了,神经网络与其他建模类型没有什么不同,在其他建模类型中,在其他条件相同的情况下,简单更好。 我只是吐槽为什么你没有看到更多的人尝试优化神经网络输入参数:是出于对数据挖掘的无知或恐惧吗?
回复:构建多个神经网络模型你好@abmayfield ,
感谢您的反馈和客气话。 是的,我也遇到了这个问题,如果它不是“在顶部”,它就会拉出错误的数据表。 我根本不知道为什么它会这样做。 当我在新窗口中调用某些内容以便稍后传递到合适部分时,它的响应方式也很有趣。 “取消”按钮没有像我预期的那样工作,“帮助”按钮现在也没有去任何地方,但这是一个开始! 我认为脚本专家可以轻松修复这些错误并使其按预期工作。 也许当我将其设置为在更多平台上运行并且不存在这些错误时,我可以将其发布到加载项页面。 如果能将其纳入 JMP 将是一种荣幸。
它确实对我的工作有帮助,因为它将使调整模型的过程更加自动化和简化。 我本来想为 NN 平台做一些事情,但一直推迟到你的帖子,现在我已经制作了 GUI,我想对此进行扩展,使其更具跨功能性。 调整大量模型并仅关注统计数据的能力确实有助于缩小超参数空间,以便更轻松地比较不同平台上的模型,并了解哪个最适合预测新数据。 然后,您可以返回并在标准平台中运行最佳设置,并获得 JMP 提供的所有丰富的图形反馈来可视化模型和所有其他内容。
祝你好运!,
DS
回复:构建多个神经网络模型哇! 现在这真的很棒。 唯一的小问题是,如果脚本窗口位于“调整”表的正上方,它会“调用”模型窗口中的调整表而不是数据表。 只要数据表和脚本位于屏幕的最前面,它就会正确加载模型项。 事实上,我在短短几分钟内就运行了 100 个模型。 不知能否将其放在JMP网站上的“add-in”depot(忘记了实际名称)上,以便得到更广泛的关注。 我确信这会对很多人有所帮助(如果不是立即,那么将来会有更多人看到神经网络在模型构建中的实用性)。 天哪,它可能应该以某种形式进入 JMP Pro 17(对于 16 来说可能为时已晚)。 非常感谢您的所有帮助,我希望这也对您自己的研究有所帮助。
回复:构建多个神经网络模型你好@abmayfield ,
我希望 JMP 和/或计算机重新设置能够解决问题。 如果没有,我还回去为神经网络建模构建了一个 GUI——我计划将其扩展为跨不同平台工作。 它不能完美地工作,有时我会遇到一些奇怪的错误(专家脚本编写者可能可以在几秒钟内调试它)。 但是,好处是它可以处理任何类型的输入数据列——序数、名义和连续,并且它可以处理 NN 可接受的验证方法——排除行、保留、Kfold 和验证列。 它将适用于包含测试数据和不包含测试数据的验证列。 这是数据表中名为 NN GUI 的脚本(附后)。
对于那些感兴趣的人,我在博客上大量借用了 JMP 员工的内容.@juliagong (退休)这里以及来自的支持说明.@Wendy_Murphrey这里。 我计划创建一个 GUI,可以为其他平台(我也从数据表中实现自动化)自动执行此操作:boosted 树、bootstrap 森林和 XGBoost。 我计划将其发布在社区中,但这可能需要一些时间 - 特别是要确保它已完全调试。
从以下代码到数据表中 GUI 的唯一更改是将 dt = 数据表 ("...") 更改为 dt = 当前数据表()。
我希望这有助于您的工作取得进展。 它对我有用,因为我可以改进它,使我的建模工作也更容易!
祝你好运,
DS
NN GUI代码:
Names Default To Here( 1 );
//Clear Symbols();
dt = Data Table( "Neural networking Ofav 2017 dataset" );
dt_parms = Data Table( "NN Tuning 8" );
nc = N Col( dt );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
valid_list = {"Excluded Rows Holdback", "Holdback", "KFold", "Validation Column"};
//the width of the column list box in pixels
lbWidth = 110;
/* Expression to clear all current settings */
clearRoles = Expr(
colListY << RemoveAll;
colListV << RemoveAll;
);
/* Expression to store the current settings in global variables */
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::vcolRecall = colListV << GetItems;
);
VmethodDlg = New Window( "Choose Validation Type",
<<RETURN result=""> 0,
VMeth_Insert = "Validation(" || ":" || validCol[1] || ")";
If(
coltype == "Ordinal",
set = 1;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );,
coltype == "Nominal",
set = 2;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );,
coltype == "Continuous",
set = 3;
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
);
If( VMeth == "Validation Column" & lvl == 0,
VMeth_Insert = "Validation(" || ":" || validCol[1] || ")";
If(
coltype == "Ordinal",
set = 1;
o_box = 3;
ncol_box_v = 10;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );,
coltype == "Nominal",
set = 2;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );,
coltype == "Continuous",
set = 3;
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
);
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
^VMeth_insert^,
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt_name || " - " || "Neural of " || y_resp[1] );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
If( VMeth == "Validation Column" & lvl > 0,
Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get
);
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:R² Test[i] = Test_stats[1];
dt_results:RMSE Test[i] = Test_stats[2];
dt_results:Mean Abs Dev Test[i] = Test_stats[3];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
dt_results:SSE Test[i] = Test_stats[5];
dt_results:Sum Freq Test[i] = Test_stats[6];
);
);
);</RETURN>回复:构建多个神经网络模型嗯,我下载了你的新表格,现在我每次都会收到大纲框错误。 我将尝试重新启动 JMP,然后重新启动计算机。 这似乎很奇怪,它对你有效,但对我无效!
回复:构建多个神经网络模型你好@abmayfield ,
我重新发布此内容是因为我尝试编辑的原始帖子似乎不知何故丢失了。 感谢您分享数据表,它有助于解决问题。
无论如何,我做了一些改变,所以有几点需要注意:
- 我这样做是为了让单个代码可以在序数、名义和连续建模类型上运行。 不再需要两个不同的版本。
- 您需要通过在引号之间输入列名称来编辑变量 y_resp,它是 Y 响应列(请参见第 8 行)。 您不再需要在 Neural() 内的调用中编辑它。 不过,您仍然需要编辑 X() 列表。
- 然后,代码测试 y_resp 列的建模类型并设置一些变量并在输出数据表中生成适当的列。
- 现在,输出数据表的名称取决于验证类型和主机数据表。 这样,您就可以运行所有验证类型,然后进行比较,而不会出现 JMP 中奇怪的命名问题。
- 我编辑了数据表中的每个不同的验证类型脚本,并且可以轻松地将它们复制/粘贴到新的数据表中。 我在您发送的上一张桌子上对此进行了测试,效果很好。
- 我修复了代码每次运行时写入日志文件的错误,必须将括号移动到新位置。
- 我发现你的保留和我的 k-fold 实际上没有正常工作的原因是,当你执行该类型时,你需要将 Validation() 更改为 Validation Method()。 我已经为您的不同方法做到了这一点,并且脚本是固定的。
所以,它正在一点一点地改善,这很好。 我真的更喜欢让它在生成额外列之前测试响应列类型和验证方法,但我还不知道如何做到这一点。 也许我会在下次推出时编辑它!
下面是 Kfold 验证的代码示例。 我还附上了您的新数据表,其中保存了更正后的脚本。
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning 8" );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
//edit the line below so that it has the name of the column you want to model.
y_resp = "health designation";
response_col = Column( dt, Eval( Eval Expr( Expr( y_resp ) ) ) );
dt_results = dt_parms << Subset( Output Table( "Output of " || dtp_name || " with Kfold" || " for " || dt_name ), All rows, Selected Columns Only( 0 ) );
//This tests the response column type to automatically set the values for pulling the data out of the report window.
//It also will create the appropriate columns depending on the modeling type of the response column.
coltype = response_col << Get Modeling Type;
If( coltype == "Ordinal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Nominal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Continuous",
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
//dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
//dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
Validation Method ( \!"Kfold\!", 5 ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of " || y_resp );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
//Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
//dt_results:R² Test[i] = Test_stats[1];
//dt_results:RMSE Test[i] = Test_stats[2];
//dt_results:Mean Abs Dev Test[i] = Test_stats[3];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
//dt_results:SSE Test[i] = Test_stats[5]
//dt_results:Sum Freq Test[i] = Test_stats[6];
);
);
如果您发现任何其他问题,请告诉我,我会尽力解决它们。
希望这可以帮助!,
DS
回复:构建多个神经网络模型你好@abmayfield ,
感谢分享数据表。 我找到了一些东西。
- 找出错误所在,它不断写入日志窗口并修复它。 它在 str 调用中。 必须将括号移到不同的位置。
- 我发现在进行K-fold或Holdback时,需要将Validation()更改为Validation Method()。 然后它就会工作并适当地比例数据。
- 我重新编码了它如何测试列的建模类型并进行了一些相关的更改。
- 我还编写了它,以便相同的代码可用于名义、序数和连续。 只需更改变量 y_resp(Y 响应列名称)即可完成此操作。 剩下的一切它都会自动完成。
- 我还在结果数据表中添加了一个标题,该标题随“主机”数据表和验证类型而变化,以便您可以运行所有三种方法,并且不会受到 JMP 的命名干扰。
- 现在可以将数据表中的三个 NN 拟合脚本从一个数据表复制粘贴到下一个数据表,不会出现任何问题。 我用你发送的第一个数据表进行了测试,效果很好。
现在它变得更加自动化,并且得到了一些改进。 我希望它检查验证方法,然后生成额外的列并相应地分配值。 也许在下一次推出时!
代码通常如下所示。 请注意,我正在温度列上进行测试以检查连续建模类型。
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning 8" );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
//edit the line below so that it has the name of the column you want to model.
y_resp = "temperature (1, 2, 3)";
response_col = Column( dt, Eval( Eval Expr( Expr( y_resp ) ) ) );
dt_results = dt_parms << Subset( Output Table( "Output of " || dtp_name || " with (validation type)" || " for " || dt_name), All rows, Selected Columns Only( 0 ) );
//This tests the response column type to automatically set the values for pulling the data out of the report window.
//It also will create the appropriate columns depending on the modeling type of the response column.
coltype = response_col << Get Modeling Type;
If( coltype == "Ordinal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Nominal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Continuous",
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
Validation ( :Validation with test ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of " || y_resp );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
dt_results:R² Test[i] = Test_stats[1];
dt_results:RMSE Test[i] = Test_stats[2];
dt_results:Mean Abs Dev Test[i] = Test_stats[3];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
dt_results:SSE Test[i] = Test_stats[5];
dt_results:Sum Freq Test[i] = Test_stats[6];
);
);如果还有任何其他问题,请告诉我。
谢谢!,
DS
回复:构建多个神经网络模型有点奇怪。 如果我继续运行脚本,它最终会起作用!
另一个奇怪的事情是:无论我将保留百分比更改为多少,它总是给我 11 次训练和 9 次验证(~55/45%)。 是不是不可能做到 70/30%? 我有一种强烈的感觉,这是因为我只是错误地输入了命令,而不是不可能!
回复:构建多个神经网络模型你好@abmayfield ,
轮廓框错误可能是由于它尝试从 NN 窗口获取统计值时产生的。 可以分享一下新的数据表和代码吗? 我可以对其进行故障排除,看看是否可以更轻松地将其从一个数据表移植到另一个数据表。
我认为这可能与我如何设置该部分以检查数据列类型并使 ncol_box 变量具有不同的值有关。 如果是名义值,则该值与序数值甚至数字值不同。
如果您可以分享出现此错误的数据表和代码,我相信我可以修复它。 如果需要,您可以对数据表进行匿名化:表 > 匿名化。
DS
回复:构建多个神经网络模型太好了。 这回答了我的一些额外问题。 现在,我唯一遇到的问题是,当我在新的数据表中复制、粘贴和运行脚本时,出现大纲框错误,您在脚本注释中提到了这一点。 “访问或评估大纲框时需要字符 arg 1。” 这意味着什么?? 我增加和减少了数字,但每次都会收到相同的错误消息,并且脚本不会运行。 我什至不知道轮廓框是什么。 奇怪的是树结构是相同的。 我刚刚更改了文件名。 文件名较长。 也许这意味着我需要一个更大的轮廓框?回复:构建多个神经网络模型你好@abmayfield ,
如果您返回并查看脚本,第二行定义了分析期间要使用的数据表。 JSL 代码 dt = Current Data Table() 定义了一个局部变量“dt”,然后在脚本的其余部分中使用该变量,而不必按名称调用数据表。 同样,dt_parms 是分配给 NN 调整表“NN 调整”的局部变量。 这两个表实际上是您提供给脚本的唯一内容。 其余的都是内部的。
如果您将 JSL 代码复制/粘贴到新的数据表中,它应该会自动工作,因为您是在该数据表中本地运行它。
您不应该修改调用 dt << Nerual(),除非定义 Y() 和 X(),也许还定义 Validation() 方法。 JSL 代码 dt << Nerual() 是一个命令,告诉 JMP 对数据表“dt”执行 NN 建模。 因此,dt 的定义位于代码的开头。
您还需要修改 w = Window() 调用以反映 NN 报告窗口的标题及其下方的 Regex()。 最后,根据您是否确实将“测试”数据集作为验证列的一部分,您要么想要注释掉(在行开头使用 // 命令),要么删除注释当它创建 Test 结果列以及 Test_stats 定义时,以及代码将结果写入新的输出数据表时,会在代码的开头处执行此操作。
除此之外,您根本不需要进行太多编辑。
关于您的最后一个问题,这取决于您如何实现代码。 如果您从数据表中运行它,即它保存在数据表的脚本部分中,并且您通过绿色热按钮运行它,那么您只需要更改 Y() 和 X( ) 是您用作预测变量和响应以匹配新数据表中的列名称的变量。 您当然需要打开“NN 调整”表。 另一方面,如果您将其作为单独的脚本运行,那么您可能需要将 dt 的定义从 dt = Current Data Table() 更改为 dt = Data Table (" "),在其中插入引号之间的新数据表的名称。
您所指的“神经”不是数据表,而是在指定数据表上运行神经网络模型的 JMP 命令。 “<<”命令的意思是对左边的对象执行<<右边的动作。 在代码开头附近,您可以使用新的列命令看到这一点。 其中 dt_results << New Column() 表示代码告诉 JMP 为对象 dt_results 创建一个新列,该对象是从 dt_parms 数据表生成的子集数据。
希望这可以帮助!,
DS
回复:构建多个神经网络模型我有一个(可能很简单)脚本问题。 假设我想将输入 dt 更改为另一个。 难道我不应该复制并粘贴脚本,然后将“Neural”中的 dt 替换为其他内容吗?
str = Eval Insert(
"report = (dt << Neural (
Y( :health designation ),
X(
如果我删除原始的“神经”文件并将其替换为具有完全相同信息和不同名称的另一个表,则脚本将无法工作! 是否有必要在两个数据表中拥有完全相同的数据,其中一个数据表名为“Neural”? 也许我错过了那部分!
回复:构建多个神经网络模型很高兴听到它对你有用。 祝建模顺利! 您可能还想检查其他模型平台,然后比较测试数据集上的模型,看看哪个是最佳预测变量。
DS回复:构建多个神经网络模型哇,我简直不敢相信,多亏了您的脚本帮助,我在午饭前就运行了 300 个神经网络模型。 我希望这一点能够得到重视并获得“荣誉”,正如我想象的那样,当越来越多的人开始看到 NN 平台的价值时,他们会倾向于这样的东西,特别是如果它是一个全新的数据集,而你并不真正了解它的话。知道在哪里“潜入”大量令人眼花缭乱的神经网络模型输入参数,这些参数可以稍微调整(有时即使只是增加学习率,例如从 0.05 到 0.1,有时也会导致巨大的差异)。 接下来我将尝试不同的验证方法(验证列、保留和 KFold)。 鉴于我(目前)的样本量较小(希望使用这些初步数据来获得资金来添加更多“行”,即珊瑚),绝对需要小心。
回复:构建多个神经网络模型你好@abmayfield ,
Kfold 也是验证短数据集的另一种好方法。 是的,您将设置为行状态的行排除,您可以通过选择“测试”数据集并将行状态设置为“排除”来完成。 如果您使用 Kfold 或 Holdback,JMP 将使用它们来验证数据,而不是测试数据。 希望您还有一个单独的数据集可以用作测试数据,而不是将其与训练和验证数据放在同一个数据表中。
我只会使用 Kfold 进行验证,然后注释掉运行脚本不需要的部分。 下面是针对 NN 平台的具有 5-Kfold 验证设置的编辑版本。应该有用,它对我有用。
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning" );
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( :health designation ),
X(:OFA...22_c0_g2_i1.p1 ),
Validation ( \!"KFold\!", 5 ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
)),
Go,
invisible
) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of health designation by OFA...22_c0_g2_i1.p1" );
If( !Is Missing( Regex( w << Get Window Title, "health designation by OFA...22_c0_g2_i1.p1" ) ) == 1,
ncol_box_v = 10;
//ncol_box_test =19;
);
T_stats = w[Outline Box( 3 ), Number Col Box( 1 )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
V_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_v )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
//Test_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
祝你好运!,
DS
回复:构建多个神经网络模型更多优秀的建议,尤其是关于验证类型的建议。 我看到 Neural 支持保留、Kfold 或行排除(因此我猜测我只是随机选择几行来省略)。 如果我想要更改脚本来更改验证类型,我是否只需更改“Validation (:Validation with test)”行? 在 JMP 看来,保留的样本是否等同于验证样本? 如果没有,我需要删除验证列(或重命名它们),并且测试列也必须删除。
回复:构建多个神经网络模型你好@abmayfield ,
很高兴它解决了您的问题。
通过基于树的建模(XGBoost、提升树和引导森林),您可以轻松使用 JMP 中的调整表 GUI 来运行许多模型。 但是,它的一个缺点是它会占用大量内存。 以这种方式运行它的好处是,您可以运行数十个数千个不同的参数设置,并且它不会消耗太多内存,只是消耗 CPU。 我已经使用引导森林运行了多达 40k 种不同的设置(速度很慢),并且在我的工作笔记本电脑(32 GB RAM 和 2GHz CPU)上可能需要几天时间。
我也是 JMP 16 的早期采用者,模型筛选很好,但正如您所指出的,它没有调整任何模型,这可能有点误导。 它仅使用默认设置,这并不总是创建预测模型的最佳设置。 它至少可以帮助您确定哪些平台值得花时间进一步调整,哪些不值得研究。
您可能还想考虑使用 SVM 平台对标称数据进行建模,因为这对于此类数据来说也是一种很好的方法。
至于模拟器,这是不同的,它是一种用不同的初始条件(随机化)测试估计值的方法。 这给出了估计值的分布,并为您提供了原始估计的置信区间,然后您可以决定具有给定估计的模型是否良好。
至于 DOE,您可以进行阶乘,甚至可以通过适当设置因子来运行空间填充设计,而且我认为该平台还允许条件约束。 此外,您可能会考虑对预测变量进行预测筛选或引导,看看您是否确实需要全部 89 个预测变量,或者是否真的只能使用较小的子集。
最后一点,由于您有一个短而宽的数据表,您可能需要考虑使用留一方法进行验证,而不是使用验证列。 如果您这样做,则必须为此编辑脚本。
祝你好运!,
DS
回复:构建多个神经网络模型啊哈! 非常感谢您为我重新做这件事。 我显然没有脚本知识,所以我只是将“Neural”更改为我的数据表的名称......这显然是行不通的。 当我将数据表的名称更改为“神经”、添加测试列并进行您建议的其他更改后,它就起作用了。
现在我可能做的是使用 DOE 进行条件因子设计(因为,正如您所指出的,您无法使用多个隐藏层进行提升)并在我的工作计算机上运行几百个模型(以免对我的 8 -GB RAM 笔记本电脑)。
我觉得你的脚本需要成为一个 GUI 或插件(有人接受吗?)。 我正在测试 JMP Pro 16,它有一个非常出色的“模型筛选”工具,但我认为它跨建模类型(例如 PLS 与 Gen-Reg)进行测试,而不是在可能存在的数千个模型中进行测试。构建在每个建模类型中(否则它可能永远不会停止运行)。 我听说过“模拟器”,但我认为它正在做一些不同的事情(不会生成大量的模拟模型),尽管我可能是错的。 再次非常感谢您的帮助。 这肯定会节省我几天的时间!
回复:构建多个神经网络模型你好@abmayfield ,
感谢您分享数据表,它有助于调试您在脚本中所做的更改。
我注意到一些事情:
- 您需要为要记录的“测试”数据集统计信息添加其他列。
- 你不小心删除了imax的定义,它是参数表的行数
- 您还意外地更改了对 NN 平台的调用,其中脚本中显示 dt << Neural(),这是它发送命令以对数据表“dt”执行神经网络建模的位置。 你已经把它改成了别的东西。
- 窗口“w”的定义需要具有 NN 窗口的全名,如果您只运行单个 X,那么显然 JMP 会将其作为窗口名称的一部分,因此它需要同时存在于两个窗口中GetName 命令及其下面的 IF 语句。 但这仅在使用单个 X 建模时才成立。 如果使用多个,则不需要在窗口名称或 IF 语句中包含“by......”。
- 最后一部分是确保在 Number Col Box() 命令中正确调用训练、验证和测试数据的统计数据。
下面的代码适用于您的数据表(还附有修改后的脚本)。 它与我之前给出的 NN 调优表配合使用。
如果您确实要使用所有 86 列,则需要将它们手动放入脚本的 X(col1, col2,...) 部分。 然后,您还应该编辑 GetName 部分,因为它不会包含所有 86 个名称,它只是带有响应列的窗口名称。
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning" );
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( :health designation ),
X(
:OFA...22_c0_g2_i1.p1
),
Validation ( :Validation with test ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
)),
Go,
invisible
) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of health designation by OFA...22_c0_g2_i1.p1" );
If( !Is Missing( Regex( w << Get Window Title, "health designation by OFA...22_c0_g2_i1.p1" ) ) == 1,
ncol_box_v = 10;
ncol_box_test =19;
);
T_stats = w[Outline Box( 3 ), Number Col Box( 1 )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
V_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_v )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
Test_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
希望这可以帮助!,
DS
回复:构建多个神经网络模型好吧,我失败了,但我认为这可能是因为一些微小的脚本错误。 我使用了您的神经网络调整表和我的数据(附后)并进行了所有必要的更新(我使用了三个训练+验证+测试样本)。 如果您运行最后一个脚本(“神经网络比较”),它将构建新表,但不会运行任何分析。 我只是包含了一些 X 术语,但实际上它是“标准化数据”组中的所有 86 列。 当我使用调试器时,它说出现问题
”为了(我= 1 ,i <= imax,i++,”区域。 我希望/猜测更有能力的编剧可能可以在几秒钟内找到问题!
回复:构建多个神经网络模型是的! 这正是我想要的:一个包含与 NN 平台同步的所有 NN 输入参数(例如,TanH 节点数、层数等)的表。 我还没有尝试过,我确实想象这需要一段时间,但我使用的是一个小型的 20 个样本 x 90 预测器“练习”数据集,所以它可能是可行的。 事实上,我实际上只发现激活类型和节点数量(以及游览数量)实际上降低了我的 RMSE,而提升并没有多大帮助。 但即便如此,这也会比我计划运行的所有约 500 个模型快得多(幸好没有我昨天打算运行的那么多,因为我想保持在 4 个节点/激活类型以下)。 明天我会尝试一下,让大家知道效果如何。
回复:构建多个神经网络模型你好@abmayfield ,
这是我一段时间以来一直想编写的脚本,而且非常有趣,你的帖子激发了它的热情,谢谢! 一段时间以来我一直希望有一种方法来调整神经网络平台,因为它对初始条件非常敏感,而且手动调整速度相当慢。
因此,我改编了为其他模型平台制作的一些脚本,以自动化其调整过程,例如提升树、引导森林和 XGBoost 平台。 这些脚本旨在保存到数据表中并使用绿色热按钮运行。
希望您了解一些有关脚本编写的知识,并且知道在哪里使这些脚本适应您的特定情况/数据结构/列名称等。 我已经输入了一些评论,试图帮助解释我在每个更大的组中所做的事情。 我附上两个脚本——一个用于连续 Y,另一个用于名义/序数 Y。 我确实必须包含一个测试来查看输出 Y 是名义的还是序数的,因为 Number Col Box() 值会根据此而变化。 我使用示例数据中的 Big Class Families.jmp 数据表作为测试数据集。 我还包括使用数值 NN 调整或名义/序数 NN 调整生成的两个输出数据表。 我使用 :age、:weight:、:height 对 :sex 进行了标称,然后将 :age 从 Ordinal 更改为 Continuous,并使用 :weight 和 :sex 建模年龄以进行连续 NN 调整。拟合度和统计数据都很糟糕,但它的目的只是为了看看 JSL 是否有效。 我还通过对 :age 进行分层,向数据表添加了 :Validation 列,只是为了检查其是否全部正常工作。
我确信其他人可以更优雅地编写脚本来测试 Y() 输入列是否为连续、名义或序数建模类型,然后插入适当的 Number Col Box() 值,以仅使用单个 JSL 代码。
您需要编辑 dt << Nerual() 部分以及获取报告窗口名称的部分的 Y() 和 X() 输入,因为它以您正在建模的变量命名。
原则上,NN 调整表可以像空间填充 DOE 一样处理,其中下限和上限设置是您想要设置的任何值,除了其中一些,例如 N_Layers 只能为 1 或 2,因为 JMP 只允许 1 或 2层。 Penalty_Method 仅是在 NN 平台中有效的选项,Transform Covariate 和 Robust Fit 仅采用 0 或 1(关闭或打开)值。 我还包括了 NN 调整表。
如果您有任何疑问,请告诉我。
这是我的名义/有序建模类型的代码:
Names Default To Here( 1 );
dt = Data Table( "Big Class Families" );//enter the name of the current data table
dt_parms = Data Table( "NN Tuning" );//enter name of parameter data table for tuning the NN
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );//this copies the tuning table with all the different rows in it
//these commands create columns to record the fit results
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//This part just creates a separate modelling progress, delete if you don't want it.
i = 1;
imax = N Row( dt_parms );
dlgStatus = New Window( "Overall Modeling Progress",
V List Box(
Text Box( " Overall Modeling Progress ", <<SET font="" size=""></SET>
我不明白的一件奇怪的事情是,当我在 NN 平台上运行它时,我收到了有关我创建的日志窗口的警告,但我从未从其他平台上收到过它。 我无法跟踪该警告的来源,但它仍然正确运行。 也许有人可以修复我的代码的那部分?
意想不到的“,”。 可能少了一个“)”。
尝试解析“<<”运算符的操作数。
第 23 行第 10 栏:))►,
最后一点:请小心设置,因为如果您有大量的提升、游览或传递函数,则运行建模可能需要很长时间。 只是要小心不要太过分。
希望这可以帮助!,
DS
回复:构建多个神经网络模型顺便说一句,让所有相关功能显示与您主动选择的功能相同的信息的“选项”技巧实际上是 Mac 上的“命令”技巧(因此以前不起作用)。
回复:构建多个神经网络模型马克,谢谢你的建议。 第二个是我尝试过的,但失败了。 我知道其他平台上的“制作组合表”选项,但也许由于某种原因它被排除在神经平台之外。 奇怪的是,“选项”技巧,即你按住选项键,进行选择,它适用于报告的所有部分,在神经平台中不起作用,或者可以加快速度。
如果我可以将我的神经网络参数(#nodes、#tours 等)作为 DOE 中的 X,以最小化 RSME 为目标,那就太酷了,但这似乎是不可能的,因为您必须输入神经模型启动中特定框中的参数。 您必须编写一些非常高级的脚本,即便如此,我也不确定 DOE 和 Neural 是否可以正常通信。 但是,如果有人知道我可以让神经平台基本上运行此屏幕截图中反映的模型(作为总计的子选择)的方法,我将不胜感激。 换句话说,第一个屏幕截图表中的值需要转到第二个屏幕截图中的相应输入框(即神经模型启动)。
回复:构建多个神经网络模型您可以设计一个具有较少级别的实验来拟合 RMSE 的二阶模型,然后使用该模型来优化设置。 此外,您还可以依次制作每个模型,然后通过右键单击其中一个结果表并选择“生成组合表”来一次性提取所有结果。