我正在尝试使用神经网络来解决问题。我从 Coursera 上提供的机器学习课程中了解到它们,并且很高兴地发现 FANN 是神经网络的 Ruby 实现,因此我不必重新发明飞机。
但是,我真的不明白为什么 FANN 会给我这样奇怪的输出。根据我在课堂上学到的知识,
我有一组匹配结果的训练数据。给玩家一个数字,给他们的对手一个数字,结果是 1 为赢,0 为输。由于不安,数据有点嘈杂,但并非如此。我的目标是找出哪些评分差距更容易引起不安——例如,我的直觉告诉我,评分较低的比赛往往会带来更多的不安,因为评分不太准确。
所以我得到了一个包含大约 100 个示例的训练集。每个示例都是(评级,增量)=> 1/0。所以这是一个分类问题,但我认为它并不适合逻辑回归类型的图表,神经网络似乎更正确。
我的代码开始
training_data = RubyFann::TrainData.new(:inputs => inputs, :desired_outputs => outputs)
然后我用
network = RubyFann::Standard.new(
:num_inputs=>2,
:hidden_neurons=>[8, 8, 8, 8],
:num_outputs=>1)
在课堂上,我了解到一个合理的默认设置是让每个隐藏层具有相同数量的单元。由于我真的不知道如何工作或我正在做什么,所以我选择了默认设置。
network.train_on_data(training_data, 1000, 1, 0.15)
最后,我以增量方式检查了一组样本输入评级,并且在每次增量时,增加 delta 直到结果从 > 0.5 切换到 < 0.5,我认为它是大约 0 和大约 1,尽管实际上它们是更像是 0.45 和 0.55。
当我运行一次时,每个输入都给了我 0。我用相同的数据再次运行了两次,得到了负数的减少趋势和正数的增加趋势,与预测完全相反。
我想也许我没有包含足够的功能,所以我添加了 (rating**2
和delta**2
)。不幸的是,然后我开始为每次输入获取我的起始增量或最大增量。
我真的不明白为什么我会得到如此不同的结果或 Ruby-FANN 告诉我什么,部分原因是我不了解库,但我怀疑,因为我刚刚开始学习神经网络并且遗漏了一些东西大而明显。我是否没有足够的训练数据,是否需要包含更多功能,问题是什么,我该如何解决它或学习如何做得更好?