【问题标题】:Why my model work ok with test data from train_test_split while doesn't with the new data?为什么我的模型可以处理来自 train_test_split 的测试数据,而不能处理新数据?
【发布时间】:2018-03-29 04:12:23
【问题描述】:

我是机器学习的新手。

我有一个连续的数据集。我正在尝试使用多个功能对目标标签进行建模。我利用 train_test_split 函数将训练数据和测试数据分开。我正在使用以下代码训练和测试模型:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = Sequential()
model.add(Dense(128, input_dim=X.shape[1], kernel_initializer = 'normal', activation='relu'))
model.add(Dense(1, kernel_initializer = 'normal'))
hist = model.fit(X_train.values, y_train.values, validation_data=(X_test.values,y_test.values), epochs=200, batch_size=64, verbose=1) 

当我使用 X_test 和 y_test 进行验证数据时,我可以得到很好的结果:

https://drive.google.com/open?id=0B-9aw4q1sDcgNWt5TDhBNVZjWmc

但是,当我使用这个模型来预测另一个数据 (X_real, y_real) 时(它们与 X_test 和 y_test 没有太大区别,只是它们不是由 train_test_split 随机选择的)我得到了不好的结果:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = Sequential()
model.add(Dense(128, input_dim=X.shape[1], kernel_initializer = 'normal', activation='relu'))
model.add(Dense(1, kernel_initializer = 'normal'))
hist = model.fit(X_train.values, y_train.values, validation_data=(X_real.values,y_real.values), epochs=200, batch_size=64, verbose=1) 

https://drive.google.com/open?id=0B-9aw4q1sDcgYWFZRU9EYzVKRFk

这是过拟合的问题吗?如果是这样,为什么我的模型可以与 train_test_split 生成的 X_test 和 y_test 一起工作?

【问题讨论】:

    标签: python machine-learning neural-network regression train-test-split


    【解决方案1】:

    您的“真实数据”似乎与您的训练和测试数据不同。 为什么首先要有“真实”和“训练”数据?

    我的做法是:

    1:混合你拥有的所有数据

    2:将您的数据随机分成 3 组(训练、测试和验证)

    3:像现在一样使用训练和测试并优化分类器

    4:当它足够好时,使用您的验证集验证分类器以确保不会发生过度拟合。

    【讨论】:

    • 对不起,我不擅长术语。您可以将我的定义“real_data”算作“验证数据”。为什么我们需要验证数据? “测试数据”还不够吗?尽管“测试数据”没问题,但模型为什么会因“验证数据”而失败?我知道“测试数据”的结果差异很大。但就我而言,每次运行代码时测试数据都可以,但验证数据失败。顺便提一句。我的数据集是时间序列的。
    • 您的猜测是过拟合问题。换句话说,你训练你的分类器,直到它适合你的测试数据。为确保您的良好结果不仅适用于您的测试数据,您可以保留一些看不见的数据,以 100% 确保您的分类器在测试结果后与您认为的一样好(即您的验证数据)。但是你的验证不好而你的测试很好的明显原因是这两个数据集彼此不同。所以问题是你有什么样的数据,更重要的是:什么是“真实数据”,为什么你称之为真实?
    • 你是对的。似乎验证数据与训练和测试数据不同。
    【解决方案2】:

    如果您的数据较少,那么我建议您尝试不同的算法。神经网络通常需要大量数据才能获得正确的权重。 此外,您的真实数据似乎与训练和测试数据不属于同一分布。不要隐藏任何东西,洗牌并使用训练/验证/测试拆分。

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2017-04-17
      • 2012-12-07
      • 1970-01-01
      • 2017-02-17
      • 2020-08-07
      • 2012-05-17
      • 2015-02-22
      • 1970-01-01
      相关资源
      最近更新 更多