用神经网络训练模型
我们现在将神经网络库加载到R.
使用神经网络将依赖的“红利”变量“回归” 到其他自变量
根据hidden =(2,1)公式将隐藏层数设置为(2,1)
给定自变量对因变量(被除数)的影响假设是非线性的,linear.output变量设置为FALSE
阈值设置为0.01,这意味着如果迭代期间的误差变化小于1%,则模型不会进行进一步的优化
确定神经网络中隐藏层的数量并不是一门精确的科学。事实上,有些情况下,没有任何隐藏层,准确度可能会更高。因此,反复试验在这一过程中起着重要作用。
一种可能性是比较预测的准确性如何随着我们修改隐藏层的数量而改变。例如,对于该示例,使用(2,1)参数配置最终产生92.5%的分类准确度。
R
1
2
3
4
nn$result.matrix
plot(nn)
我们的神经网络看起来像这样:
我们现在生成神经网络模型的误差,以及输入,隐藏层和输出之间的权重:
测试模型的准确性
如前所述,我们的神经网络是使用训练数据创建的。然后,我们将其与测试数据进行比较,以评估神经网络预测的准确性。
R
1
2
3
4
temp_test
head(temp_test)
nn.results
结果
将预测结果与实际结果进行比较:
0.999985252611
混淆矩阵
然后,我们使用sapply对结果进行舍入,并创建一个混淆矩阵来比较真/假阳性和阴性的数量:
R
1
2
3
4
5
6
7
8
table(actual,prediction)
prediction
actual01
0170
1320
混淆矩阵用于确定由我们的预测生成的真实和错误的数量。该模型生成17个真阴性(0),20个真阳性(1),而有3个假阴性。
最终,我们在确定股票是否支付股息时产生92.5%(37/40)的准确率。
使用神经网络解决回归问题
在这个例子中,我们希望分析解释变量容量,汽油和小时数对因变量消费的影响。
数据规范化
同样,我们将数据标准化并分为训练和测试数据:
R
1
2
3
4
5
6
7
#最大最小标准化
normalize
}
#训练和测试数据
trainset
testset
神经网络输出
然后我们运行我们的神经网络并生成我们的参数:
R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Intercept.to.1layhid11.401987575173
capacity.to.1layhid11.307794013481
gasoline.to.1layhid1-3.102267882386
hours.to.1layhid1-3.246720660493
Intercept.to.1layhid2-0.897276576566
capacity.to.1layhid2-1.934594889387
gasoline.to。1layhid23.739470402932
hours.to.1layhid21.973830465259
Intercept.to.2layhid1-1.125920206855
1layhid.1.to.2layhid13.175227041522
1layhid.2.to.2layhid1-2.419360506652
Intercept.to.consumption0.683726702522
2layhid.1.to.consumption-0.545431580477
生成神经网络
以下是我们的神经网络的可视化结果:
模型验证
然后,我们通过比较从神经网络产生的估计汽油消费与测试输出中报告的实际消费来验证(或测试我们模型的准确性):
准确性
在下面的代码中,我们然后将数据转换回其原始格式,在平均绝对偏差的基础上产生90%的准确度(即估计和实际汽油消费之间的平均偏差平均为10%)。请注意,我们还将数据转换回标准值,因为它们之前使用max-min标准化方法进行了调整:
R
1
2
3
predicted=results$prediction*abs(diff(range(consumption)))+min(consumption)
accuracy
可以看到我们使用(2,1)隐藏配置获得90%的准确率。这非常好,特别是考虑到我们的因变量是区间格式。但是,让我们看看我们是否可以让它更高!
如果我们现在在神经网络中使用(5,2)隐藏层节点配置会发生什么?这是生成的输出:
R
1
2
3
accuracy=1-abs(mean(deviation))
accuracy
[1]0.9577401232
我们看到我们的准确率现已增加到近96%,表明修改隐藏节点的数量已经提高了我们的模型!