在现代数据分析中,集成学习已经成为一种常态。这种能力不仅能够训练多个学习者对一组假设进行预测,而且还能提高模型的鲁棒性,并使其能够提供高度准确的预测。如果错过了,建议在继续之前阅读《用简单的英语解释集成学习的基础知识》。
在构建集成模型时,人们面临的一个常见挑战是找到最优权重。有些人努力解决这个挑战,而那些不太勇敢的人则说服自己应用简单的装袋方法,这种方法假设所有模型的权重相等,并取所有预测值的平均值。这种方法通常效果很好,因为它消除了个别模型的方差误差。然而,正如所知,分配相等的权重并不是获得最佳模型组合的最佳方法。那么,有没有其他方法呢?
在这篇文章中,解决了使用神经网络在R编程中找到集成学习者中最优权重的问题。让考虑一个简单的问题:假设在给定的(假设的)数据集上构建了3个模型。这些模型中的每一个都预测事件输出的概率。在下面的图表中:模型1、模型2和模型3是三个预测模型。它们各自都有其独特性,并且可以作为一个团队工作,以比单独的最佳模型表现得更好。
最初假设每个模型的权重为33.33%,并构建了一个集成模型。这里的挑战是以这样的方式优化这些权重w1、w2和w3,以构建一个非常强大的集成模型。传统的解决方法是什么?假设p1、p2和p3分别是三个模型的三个输出。需要优化w1、w2和w3以优化一个目标函数。让尝试以数学方式写下约束和目标函数:
# 约束:
w1 + w2 + w3 = 1
p = w1 * p1 + w2 * p2 + w3 * p3
# 目标函数(最大化似然函数):
最大化(所有观测值的乘积 [(p)^(y) * (1-p)^(1-y)])
其中
y 是观测值的响应标志
p 是通过集成模型预测的概率
p1、p2 和 p3:来自各个模型的预测概率
w1、w2 和 w3:分配给每个模型的权重
这是一个典型的单纯形优化案例。然而,随着需要装袋的模型数量庞大,每次都深入数学公式可能会让人感到压力和耗时。因此,需要一个更聪明的方法。
现在将学习如何在不涉及如此数学公式的情况下找到这些权重,使用神经网络实现。理解,神经网络实现有时可能会令人不知所措。因此,为了解决当前的情况,不会深入复杂的深度神经网络概念。基本上,神经网络的操作是找到输入变量到隐藏节点之间(以及隐藏节点到输出节点之间)的权重。目标是找到从输入节点直接到输出节点的正确权重组合。
# x 是来自不同学习者的多个预测的矩阵
# y 是所有输出标志的向量
# x_test 是在未见过的样本上的多个预测的矩阵
x <- as.matrix(prediction_table)
y <- as.numeric(output_flags)
nn <- dbn.dnn.train(x,y,hidden = c(1),
activationfun = "sigm",learningrate = 0.2,momentum = 0.8)
nn_predict <- n.predict(nn,x)
nn_predict_test <- n.predict(nn,x_test)