我正在开始学习机器学习工具,并希望能更深入了解我在做什么。例如,以下脚本:
from keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activation, BatchNormalizationfrom keras.initializers import RandomUniformimport numpynumpy.random.seed(13)RandomUniform(seed=13)model = Sequential()model.add(Dense(6, input_dim=6))model.add(BatchNormalization())model.add(Activation('tanh'))model.add(Dropout(0.01))model.add(Dense(11))model.add(Activation('tanh'))model.add(Dropout(0.01))model.add(Dense(1))model.add(Activation('sigmoid'))model.compile(optimizer='sgd', loss='mean_absolute_error', metrics=['accuracy'])data = numpy.loadtxt('train', delimiter=' ')X = data[:, 0:6]Y = data[:, 6]model.fit(X, Y, batch_size=1, epochs=1000)data = numpy.loadtxt('test', delimiter=' ')X = data[:, 0:6]Y = data[:, 6]score = model.evaluate(X, Y, verbose=1)print ('\n\nThe error is:\n', score, "\n")print('\n\nPrediction:\n')Y = model.predict(X, batch_size=1, verbose=1)print('\nResult:\n', Y, '\n')
这是一个我从网上找到的几个例子拼凑而成的“弗兰肯斯坦”,我有很多关于它的未解问题:
- train 文件有60行。1000个周期是否太少?还是太多?是否会导致欠拟合/过拟合?
- 从
model.evaluate()
得到的结果是什么意思?我知道这是损失值,但如果我得到的是[7.0506157875061035, 0.0],这是否意味着我的模型有7%的误差? - 最后,我得到的预测值是0.99875391, 0.99875391, 0.9362126, 0.99875391, 0.99875391, 0.99875391, 0.93571019,而预期值接近7.86, 3.57, 8.93, 6.57, 11.7, 8.53, 9.06,这意味着这是一个非常糟糕的预测。显然,我有很多地方做错了。你们能给我一些建议吗?
我知道这都取决于我使用的数据类型,但有什么是我绝对不应该做的吗?或者有什么是我应该做的?
回答:
1
关于多少个周期是一个好的数字,从来没有一个现成的答案。这取决于你的数据大小、模型以及你想要达到的目标。通常,小模型需要较少的周期,大模型需要更多的周期。你的模型看起来足够小,1000个周期似乎太多了。
这也取决于学习率
,这是给优化器的一个参数,定义了模型更新权重时步长的长度。较大的学习率意味着较少的周期,但有可能会因为调整权重过度而永远找不到一个好的点。较小的学习率意味着更多的周期和更好的学习效果。
通常,如果损失达到一个极限,你就接近了一个训练不再有用的点。(当然,模型本身也可能有问题,这真的没有一个简单的答案)。
要检测过拟合,除了训练数据(X和Y)外,你还需要另一组测试数据(例如Xtest和Ytest)。
然后你可以在model.fit(X,Y, validation_data=(Xtest,Ytest), ...)
中使用它
测试数据不用于训练,它被单独保留,只是为了看看你的模型是否能从它从未见过的数据中做出好的预测。
如果训练损失下降,但验证损失不下降,你就出现了过拟合(粗略地说,你的模型能够记住训练数据而不是真正理解它)。
相反,欠拟合发生在你永远达不到预期的准确率
时(当然我们总是期望100%的准确率,没有错误,但好的模型通常能达到90%左右,有些应用能达到99%,有些更差,这也是非常主观的)。
2
model.evaluate()
会给你损失值和你在compile方法
中添加的度量值。
损失值是模型在训练过程中总是试图减少的东西。它大致意味着你的模型与精确值之间的距离。没有规则规定损失值的含义,它甚至可能是负数(但通常Keras使用正损失)。关键是:它必须在训练过程中减少,这意味着你的模型在进化。
准确率值表示你的模型输出的正确预测与真实值(Y)的对比。看起来你的准确率是0%,你的模型全错了。(从你输入的值可以看出)。
3
在你的模型中,你使用了激活函数
。这些函数将结果归一化,以避免结果过大。这可以避免溢出问题、数值错误传播等。
在这样的界限内工作是非常常见的。
tanh
– 输出值在-1到1之间sigmoid
– 输出值在0到1之间
好吧,如果你在最后一层使用了sigmoid激活函数,你的模型永远不会输出3这样的值。它会尝试,但最大值是1。
你应该做的就是准备你的数据(Y),使其在0到1之间。(这在分类问题中是最好的做法,通常也用于图像)
但如果你确实想要数值结果,那么你应该移除激活函数,让输出可以达到更高的值。(这完全取决于你希望模型实现什么)