【问题标题】:GridSearchCV results are not reproducableGridSearchCV 结果不可重现
【发布时间】:2020-11-16 12:06:52
【问题描述】:

我是 Keras 的新手,我需要您的专业帮助。 我已经使用 GridSearchCV 来优化我的回归网络。当我尝试使用结果时,新创建的网络在均方误差方面比 GridSearch 计算的差得多。 GridSearchCV 代码:

import os
import numpy as np
import pandas as pd
import tensorflow as tf
from time import time
from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler, MinMaxScaler

from tensorflow import keras

from keras.callbacks import ModelCheckpoint, EarlyStopping, TensorBoard
from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Flatten, Input, Dropout, LeakyReLU
from keras.utils import plot_model
from keras.optimizers import SGD, rmsprop, adam
from keras.wrappers.scikit_learn import KerasClassifier, KerasRegressor
from keras.initializers import uniform, normal, glorot_uniform
from keras.losses import MAPE

#Data preprocessing

def get_data():
    data = pd.read_csv("test.csv", sep=";", usecols=["rHsubLS","b","lowerSetpoint"])
    test = data.loc[:,['rHsubLS','b']]
    target = data.loc[:,'lowerSetpoint']
    print(test.shape)
    print(target.shape)
    return test.astype(float), target.astype(float)

def split_data(test, target):
    X_train, X_test, y_train, y_test = train_test_split(test, target)
    X_train = np.array(X_train)
    X_test = np.array(X_test)
    y_train = np.array(y_train)
    y_test = np.array(y_test)

    stdsc1 = StandardScaler()
    train_data_std = stdsc1.fit_transform(X_train)
    test_data_std = stdsc1.fit_transform(X_test)

    y_train_1 = np.reshape(y_train, (-1, 1))
    y_test_1 = np.reshape(y_test, (-1, 1))
    train_target_std = stdsc1.fit_transform(y_train_1)
    test_target_std = stdsc1.fit_transform(y_test_1)

    return train_data_std, test_data_std, train_target_std, test_target_std

#Network Creation

def create_NN(optimizer='rmsprop', init='glorot_uniform', alpha=0.15, activation_func='tanh'):
    NN_model = Sequential()
    #input layer
    NN_model.add(Dense(128, kernel_initializer=init, input_dim=2, activation=activation_func))
    #hidden layers
    NN_model.add(LeakyReLU(alpha=alpha))
    NN_model.add(Dense(256, kernel_initializer=init, activation='relu'))
    #output layer
    NN_model.add(Dense(1, kernel_initializer=init, activation='linear'))

    NN_model.compile(loss='mean_squared_error', optimizer=optimizer, metrics=["mse", "mape"])
    NN_model.summary()

    return NN_model

#GridSearchCV 

def train_NN(NN_model, train_data, train_target):
    seed = 4
    np.random.seed(seed)
    
    model = KerasRegressor(build_fn=create_NN, verbose=1)

    optimizers = ['rmsprop', 'adam', 'SGD']
    inits = ['glorot_uniform', 'normal', 'uniform', 'he_uniform']
    activation_funcs = ['tanh','relu','softmax']
    epochs = [50, 100, 150]
    batches = [50, 100, 500]
    alphas = [0.15, 0.45, 0.3]

    grid_parameter = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, init=inits, alpha=alphas, activation_func=activation_funcs)#, dropout_rate=dropout)

    if __name__ == '__main__':
        grid = GridSearchCV(estimator=model, scoring='neg_mean_squared_error' , param_grid=grid_parameter, verbose=1, cv=3) 
        grid_results = grid.fit(train_data, train_target, use_multiprocessing=True, shuffle=True, workers=8) 
        print("Best: %f using %s" % (grid_results.best_score_, grid_results.best_params_))
        means = grid_results.cv_results_['mean_test_score']
        stds = grid_results.cv_results_['std_test_score']
        params = grid_results.cv_results_['params']
        for mean, stdev, param in zip(means, stds, params):
            print("%f (%f) with: %r" % (mean, stdev, param))


try:
    
        test, target = get_data()
        train_data, test_data, train_target, test_target = split_data(test, target)
        print("Data split\n")
        NN_model = create_NN()

        train_NN(NN_model, train_data, train_target)



except (KeyboardInterrupt, SystemExit):
    raise

GridSearch 的结果:

最佳:-0.000064 使用 {'activation_func': 'relu', 'alpha': 0.3, 'batch_size': 50, 'epochs': 150, 'init': 'he_uniform', 'optimizer': '亚当'}

当我尝试使用此代码重现此网络时:

import os
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from time import time
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error
from sklearn.preprocessing import StandardScaler, MinMaxScaler

from tensorflow import keras

from keras.callbacks import ModelCheckpoint, EarlyStopping, TensorBoard
from keras.models import Sequential, Model
from keras.layers import Dense, Activation, Flatten, Input, Dropout, PReLU, LeakyReLU
from keras.utils import plot_model
from keras.optimizers import SGD
from keras.losses import MeanAbsolutePercentageError


def get_data():
    data = pd.read_csv("test.csv", sep=";", usecols=["rHsubLS","b","lowerSetpoint"])
    test = data.loc[:,['rHsubLS','b']]
    target = data.loc[:,'lowerSetpoint']
    print(test.shape)
    print(target.shape)
    return test.astype(float), target.astype(float)

def split_data(test, target):

    X_train, X_test, y_train, y_test = train_test_split(test, target)
    X_train = np.array(X_train)
    X_test = np.array(X_test)
    y_train = np.array(y_train)
    y_test = np.array(y_test)

    stdsc1 = StandardScaler()
    train_data_std = stdsc1.fit_transform(X_train)
    test_data_std = stdsc1.fit_transform(X_test)
    y_train_1 = np.reshape(y_train, (-1, 1))
    y_test_1 = np.reshape(y_test, (-1, 1))
    train_target_std = stdsc1.fit_transform(y_train_1)
    test_target_std = stdsc1.fit_transform(y_test_1)

    return train_data_std, test_data_std, train_target_std, test_target_std

def create_NN():
    NN_model = Sequential()
    #input layer
    NN_model.add(Dense(128, input_dim=2, kernel_initializer='he_uniform', activation='relu'))
    #hidden layers
    NN_model.add(LeakyReLU(0.3))
    NN_model.add(Dense(256, kernel_initializer='he_uniform', activation='relu'))
    #output layer
    NN_model.add(Dense(1, activation='linear'))

    keras.backend.set_epsilon(1)
    NN_model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mse','mape'])
    NN_model.summary()
    return NN_model

def train_NN(NN_model, train_data, train_target, test_data, test_target):
    history = NN_model.fit(train_data, train_target, epochs=150, shuffle=True, batch_size=50, verbose=1, use_multiprocessing=True)
    return history

def test_NN(NN_model, test_data, test_target, train_data, train_target):
    mean_test = NN_model.evaluate(test_data, test_target, verbose=1)
    mean_train = NN_model.evaluate(train_data, train_target, verbose=1)
    return mean_test, mean_train


try:
    seed = 4
    np.random.seed(seed)
    test, target = get_data()
    train_data, test_data, train_target, test_target = split_data(test, target)
    print("Data split\n")
    NN_model = create_NN()
    print("Neural Network created\n")
    history = train_NN(NN_model, train_data, train_target, test_data, test_target)
    mean_test, mean_train = test_NN(NN_model, test_data, test_target, train_data, train_target)
    print("Durchschnittliche Abweichung Training: ", mean_train)
    print("Durchschnittliche Abweichung Test: ", mean_test)
    print(NN_model.metrics_names)

    NN_model.save('Regelung_v1.h5')
    print("Neural Network saved")

except (KeyboardInterrupt, SystemExit):
    raise

我得到这个结果: mse loss 训练数据:0.028168134637475015; mse loss测试数据:0.028960488473176955

平均平均百分比误差约为 9%。这个结果不是我所期望的。 我的错在哪里?

提前感谢您的帮助

祝你有美好的一天!

电脑规格:

英特尔 i5 4570 16GB RAM + 16GB 页面文件 英伟达 GTX 1070 3TB 硬盘

软件:

Windows 10 Geforce 游戏就绪驱动程序 451.48 张量流 2.2.0 凯拉斯 2.3.1 Sklearn 0.23.1 库达 10.1 Python 3.7.7

编辑:这里有几行 test.csv

TIMESTAMP;rHsubLS;b;lowerSetpoint
20200714091423000.00000000000;2.28878288783;-0.74361743617;-0.27947195702
20200714091423000.00000000000;0.13274132741;-0.94552945529;-0.32351276857
20200714091423000.00000000000;1.85753857539;0.77844778448;0.22244954249
20200714091423000.00000000000;1.31896318963;0.44518445184;0.33573301999
20200714091423000.00000000000;2.55885558856;-0.77792777928;-0.28837806344

【问题讨论】:

  • 您好,欢迎来到堆栈溢出。如果您尝试将代码精简为minimal reproducible example,您将更快地获得帮助。您可能还想在示例中嵌入从 test.csv 加载的数据。

标签: python tensorflow keras grid-search


【解决方案1】:

输出层缺少初始化权重:

NN_model.add(密集(1, kernel_initializer='he_uniform', activation='linear'))

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 2017-05-29
    • 2021-09-09
    • 2018-05-06
    • 2023-02-22
    • 2016-07-16
    • 2019-09-29
    • 2020-09-26
    • 2020-03-09
    相关资源
    最近更新 更多