【问题标题】:What is the smallest Keras regression neural network model will give me a perfect fit on cars data?什么是最小的 Keras 回归神经网络模型,可以完美拟合汽车数据?
【发布时间】:2020-01-30 22:20:50
【问题描述】:

我正在寻找this cars dataset。我使用此代码构建和训练回归模型,改编自 this articlethis one。我正在使用所有的训练数据(没有训练/测试拆分):

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
dataset=np.loadtxt("cars.csv", delimiter=",", skiprows=1)
x=dataset[:,0:5]
y=dataset[:,5]
y=np.reshape(y, (-1,1))
scaler_x = MinMaxScaler()
scaler_y = MinMaxScaler()
print(scaler_x.fit(x))
xscale=scaler_x.transform(x)
print(scaler_y.fit(y))
yscale=scaler_y.transform(y)
model = Sequential([
    Dense(2048, activation='relu', input_dim=5),
    Dense(1024, activation='relu'),
    Dense(512, activation='relu'),
    Dense(1)
  ])
model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
history = model.fit(xscale, yscale, epochs=1000, batch_size=577,  verbose=1, validation_split=0)
Xnew= scaler_x.transform(Xnew)
ynew= model.predict(Xnew)
ynew = scaler_y.inverse_transform(ynew) 
Znew = scaler_y.inverse_transform(y_train)
plt.figure(figsize=(15,8))
plt.scatter(Znew,ynew);

在 1000 个 epoch 之后,此模型将紧密但不完全拟合输入训练数据:

这个模型有 2,635,777 个可训练参数(数据本身只有 5,778 个数字)。

什么是最小的 Keras 回归模型(就可训练参数的总数而言),它可以训练到几乎完美地拟合此数据(具有 5 个输入参数、1 个输出参数和 963 个样本)?

【问题讨论】:

    标签: tensorflow keras regression


    【解决方案1】:

    这里是 Michael Grogan - 我是这些数据和示例的原始作者,所以希望我能帮助您。

    您提到您没有在数据中调用验证拆分。请问这有什么原因吗?分为训练和验证的目的是让模型从验证参数中获取反馈,然后相应地更新预测。

    自从我查看此示例以来已经有一段时间了,但这里是训练/验证拆分的示例,训练和验证损失似乎在 20 个 epoch 后触底 - 所以 1000 不是严格要求.我写的原始教程在示例中使用了 150 个 epoch。

    x 和 y 拆分如下:

    x_train, x_val, y_train, y_val = train_test_split(xscale, yscale, random_state=0)
    

    然后我使用您的配置运行模型:

    model = Sequential([
        Dense(2048, activation='relu', input_dim=5),
        Dense(1024, activation='relu'),
        Dense(512, activation='relu'),
        Dense(1)
      ])
    model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
    history = model.fit(x_train, y_train, epochs=20, batch_size=577,  verbose=1, validation_data=(x_val, y_val))
    

    这是训练和验证损失图:

    什么是最小的 Keras 回归模型(就可训练参数的总数而言),它可以训练到几乎完美地拟合此数据(具有 5 个输入参数、1 个输出参数和 963 个样本)?

    当您说“最小的 Keras 回归模型”时,您似乎指的是使用最少数量的特征来实现相同(或更好的准确度)的模型。确定这一点的一种方法是使用特征选择工具,例如 ExtraTreesClassifier,其中每个特征都根据其重要性进行排名(数字越高,越重要)。

    鉴于年龄、性别、里程、债务和收入等特征,结果如下:

    In:
    
    from sklearn.ensemble import ExtraTreesClassifier
    model = ExtraTreesClassifier()
    model.fit(x, y)
    print(model.feature_importances_)
    
    Out: [0.23371284 0.01554055 0.23787049 0.25267784 0.26019827]
    

    除性别外,其他特征的重要性排名相似。

    在这方面,让我们再次运行模型,但这次没有性别变量。

    这是模型(唯一的变化是 input_dim = 4),这是新的训练和验证损失:

    model = Sequential([
        Dense(2048, activation='relu', input_dim=4),
        Dense(1024, activation='relu'),
        Dense(512, activation='relu'),
        Dense(1)
      ])
    model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
    history = model.fit(x_train, y_train, epochs=20, batch_size=577,  verbose=1, validation_data=(x_val, y_val))
    

    您的示例中的隐藏层看起来很大,所以让我们尝试简化一下:

    model = Sequential([
        Dense(12, activation='relu', input_dim=4),
        Dense(8, activation='relu'),
        Dense(1, activation='linear')
      ])
    model.compile(loss='mse', optimizer='adam', metrics=['mse','mae'])
    history = model.fit(x_train, y_train, epochs=20, batch_size=577,  verbose=1, validation_data=(x_val, y_val))
    

    现在当模型再次训练时,这里是新的训练和验证损失:

    我们现在看到,获得类似的训练和验证损失大约需要 50 个 epoch 而不是 20 个。在这方面,隐藏层的大小与用于训练模型的 epoch 数之间似乎存在权衡。

    一般来说,该模型需要 4 个输入参数和远少于 1000 个 epoch 才能生成良好的拟合。

    一个警告 - 关于数据是否“完美”拟合的真正测试是针对看不见的数据测试预测。例如,我们使用训练和验证数据来构建模型。此数据的一部分应完全分开,然后与模型预测进行比较以确保准确性 - 这是关于模型是否真正有效的试金石 - 我建议将此作为下一步以确保您的模型稳健。

    希望以上内容有所帮助。

    【讨论】:

    • 我正在研究类风湿性关节炎 X 射线阅读挑战:synapse.org/#!Synapse:syn20545111/wiki/594083。输入是图像,输出是像 0,1,2,3,4,5 这样的分数。但是,训练数据缺少 3,4 的示例。所以我需要一个回归模型。我以前从未在神经网络中做过回归。我的问题实际上是关于模型的表达能力。因为我不知道神经网络中的回归,所以我正在寻找最紧凑/最聪明的层架构来进行回归学习。注意:欢迎您加入挑战!
    • 听起来很有趣,如果能听到更多,那就太好了。我的个人资料页面中包含我的联系方式 - 请随时与我们联系。
    • 您可以从上面的链接在 Synapse 网站上注册挑战。我不参加挑战,我是一名求解者,但作为一名求解者,我欢迎更多的竞争。目前我认为我们有点卡住了,因为文档没有给我们足够的训练数据。
    猜你喜欢
    • 2018-11-09
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多