【发布时间】:2020-07-29 20:13:31
【问题描述】:
我正在尝试使用 keras 和 tensorflow 构建一个简单的回归模型。在我的问题中,我有(x, y) 形式的数据,其中x 和y 只是数字。我想构建一个 keras 模型,以便使用 x 作为输入来预测 y。
因为我认为图片能更好地解释事情,所以这些是我的数据:
我们可以讨论他们是否好,但在我的问题中我不能真正欺骗他们。
我的 keras 模型如下(数据分为 30% 测试 (X_test, y_test) 和 70% 训练 (X_train, y_train)):
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(32, input_shape=() activation="relu", name="first_layer"))
model.add(tf.keras.layers.Dense(16, activation="relu", name="second_layer"))
model.add(tf.keras.layers.Dense(1, name="output_layer"))
model.compile(loss = "mean_squared_error", optimizer = "adam", metrics=["mse"] )
history = model.fit(X_train, y_train, epochs=500, batch_size=1, verbose=0, shuffle=False)
eval_result = model.evaluate(X_test, y_test)
print("\n\nTest loss:", eval_result, "\n")
predict_Y = model.predict(X)
注意:X 包含 X_test 和 X_train。
绘制我得到的预测(蓝色方块是预测predict_Y)
我经常使用层、激活函数和其他参数。我的目标是找到训练模型的最佳参数,但这里的实际问题略有不同:事实上,我很难强迫模型过度拟合数据(从上面的结果可以看出)。
有人对如何重现过拟合有某种想法吗?
(红点在蓝色方块下面!)
编辑:
这里我给你提供上面例子中使用的数据:你可以直接复制粘贴到python解释器中:
X_train = [0.704619794270697, 0.6779457393024553, 0.8207082120250023, 0.8588819357831449, 0.8692320257603844, 0.6878750931810429, 0.9556331888763945, 0.77677964510883, 0.7211381534179618, 0.6438319113259414, 0.6478339581502052, 0.9710222750072649, 0.8952188423349681, 0.6303124926673513, 0.9640316662124185, 0.869691568491902, 0.8320164648420931, 0.8236399177660375, 0.8877334038470911, 0.8084042532069621, 0.8045680821762038]
y_train = [0.7766424210611557, 0.8210846773655833, 0.9996114311913593, 0.8041331063189883, 0.9980525368790883, 0.8164056182686034, 0.8925487603333683, 0.7758207470960685, 0.37345286573743475, 0.9325789202459493, 0.6060269037514895, 0.9319771743389491, 0.9990691225991941, 0.9320002808310418, 0.9992560731072977, 0.9980241561997089, 0.8882905258641204, 0.4678339275898943, 0.9312152374846061, 0.9542371205095945, 0.8885893668675711]
X_test = [0.9749191829308574, 0.8735366740730178, 0.8882783211709133, 0.8022891400991644, 0.8650601322313454, 0.8697902997857514, 1.0, 0.8165876695985228, 0.8923841531760973]
y_test = [0.975653685270635, 0.9096752789481569, 0.6653736469114154, 0.46367666660348744, 0.9991817903431941, 1.0, 0.9111205717076893, 0.5264993912088891, 0.9989199241685126]
X = [0.704619794270697, 0.77677964510883, 0.7211381534179618, 0.6478339581502052, 0.6779457393024553, 0.8588819357831449, 0.8045680821762038, 0.8320164648420931, 0.8650601322313454, 0.8697902997857514, 0.8236399177660375, 0.6878750931810429, 0.8923841531760973, 0.8692320257603844, 0.8877334038470911, 0.8735366740730178, 0.8207082120250023, 0.8022891400991644, 0.6303124926673513, 0.8084042532069621, 0.869691568491902, 0.9710222750072649, 0.9556331888763945, 0.8882783211709133, 0.8165876695985228, 0.6438319113259414, 0.8952188423349681, 0.9749191829308574, 1.0, 0.9640316662124185]
Y = [0.7766424210611557, 0.7758207470960685, 0.37345286573743475, 0.6060269037514895, 0.8210846773655833, 0.8041331063189883, 0.8885893668675711, 0.8882905258641204, 0.9991817903431941, 1.0, 0.4678339275898943, 0.8164056182686034, 0.9989199241685126, 0.9980525368790883, 0.9312152374846061, 0.9096752789481569, 0.9996114311913593, 0.46367666660348744, 0.9320002808310418, 0.9542371205095945, 0.9980241561997089, 0.9319771743389491, 0.8925487603333683, 0.6653736469114154, 0.5264993912088891, 0.9325789202459493, 0.9990691225991941, 0.975653685270635, 0.9111205717076893, 0.9992560731072977]
其中X 包含x 值的列表,Y 包含相应的y 值。 (X_test, y_test) 和 (X_train, y_train) 是 (X, Y) 的两个(非重叠)子集。
为了预测和显示模型结果,我只需使用 matplotlib(导入为 plt):
predict_Y = model.predict(X)
plt.plot(X, Y, "ro", X, predict_Y, "bs")
plt.show()
【问题讨论】:
-
嗯...数据不遵循任何线性函数或任何模式。因此,您的模型的预测能力必须为零。玩图层对你没有帮助。正如您从蓝色方块中看到的那样,它们排成一行。这就是模型期望数据的方式。如果确实存在某种相关性,则必须使用其他技术。但是根据我的观察,我认为没有任何功能可以映射这些点......
-
我认为这样的功能也不存在。但是我希望,从过拟合模型中,如果我尝试从训练部分中使用的相同 x 预测 y ......我也会从模型中得到相同的 y ......(问题是“如何重现过拟合” ,而不是“如何使模型正常工作”)
-
这无济于事,但有助于回答我的问题:)(我添加了所需结果的图像)。您说“只需创建一个数组来学习所有值并调用它”。也许这就是我要找的东西:你能解释得更好吗?
-
您能否分享一些示例数据,以便我尝试重现自己?一般来说,如果你想过拟合,那么你需要让你的模型对数据过度拟合。这些数据看起来很嘈杂,因此您需要一个相对较大的模型来记忆它。您可以通过增加每层的大小或层数来轻松做到这一点,“更多层”通常会提供更多的权力。但请注意:您将无法预测提供的测试数据。过拟合会记住训练数据,但在它看不到和记忆的任何数据上表现会越来越差。
-
谢谢。我知道这一点:我不是想让模型工作,只是研究它的行为。我读了很多关于过度拟合的文章,但从未设法重现它(在这个例子中)。我已经修改了问题,最后添加了我正在使用的数据(与我发布的图片中显示的相同)。
标签: machine-learning keras neural-network tf.keras