我的模型中有 30 个自变量。我想根据变量的重要性修剪神经网络。我曾尝试使用 RSNNS 包的 mlp 函数,但我不知道可以为 "pruneFunc" 和 "pruneFuncParams" 提供哪些参数?
是否存在其他修剪神经网络的方法?
2 回答
mlp()(RSNNS 包)中的“pruneFunc”和“pruneFuncParams”参数用于修剪隐藏层神经元的数量。我认为您不能使用它来减少输入变量。
您可以使用“NeuralNetTools”包在您的网络上运行 Garson 算法。这个包中的函数在大多数由 RSNNS(以及其他包)创建的神经网络对象上运行。Garson 算法将根据权重为您提供每个变量的重要性。然后,您可以排除这些变量并重新训练您的网络。
有关 Garson 算法的更多详细信息,请参阅这些链接... https://beckmw.wordpress.com/2013/08/12/variable-importance-in-neural-networks/ https://beckmw.wordpress.com/标签/神经网络/
或者,您可以在开始训练神经网络之前尝试其他许多降维技术(如 PCA)。
您在评论中提到“减少变量并仅将重要变量提供给神经网络可以提供更好的预测”......但这并不准确......
具有 2 个隐藏层的 MLP 可以在经过充分训练的情况下逼近任何函数,通常具有 1 个隐藏层的 MLP 足以逼近大多数函数。如果有任何输入变量的重要性非常低(甚至在您的模型中完全没有作用),那么足够的训练量将使与该变量相关的权重非常小(接近于零),以免产生任何显着性影响你的预测。减少变量数量的唯一显着好处是预测的计算时间更短。
正在阅读一篇名为“神经网络的输入变量选择:预测美国商业周期的应用”的论文
他们推荐“基于敏感性的修剪(SBP)”
一些处理它的库
NueralSens
以及具体功能
set.fit <- nnet(frmla,data = (predict(traindataParam, trainingdata)),linear.output = T,size = best.network,maxit = 200)
sens <- SensAnalysisMLP(set.fit, trData = (predict(traindataParam, trainingdata)))
SensitivityPlots(sens)
还要查看他们的参考资料:SHAP https://www.r-bloggers.com/a-gentle-introduction-to-shap-v alues-in-r/https://www.r-bloggers.com/a-gentle -r中的shap-values简介/
基本上是交叉验证