Как воспроизвести результаты MLP с лучшим набором, выбранным с помощью hyperopt - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь выбрать лучший набор гиперпараметров для моих моделей MLP в 4-кратном резюме, используя hyperopt.Как видно из кода ниже, усредненное значение rsq пытается максимизироваться.Набор данных содержит данные временного ряда, относящиеся к фондовому рынку.Более того, rsq - не единственная метрика, которая меня интересует, то есть я также пытаюсь получить положительную корреляцию с возможным наименьшим rsq (-0.02).

С помощью функции hyperopt я получил лучшие параметры, ведущиедо наименьшего RSQ с корреляцией 0,26, что было вполне приемлемо для меня.Однако, когда я повторяю модель с выбранными параметрами, я получаю совсем другие результаты.Пожалуйста, смотрите код ниже:

space = {

    'act': hp.choice('act', ['tanh','relu']),
    'batch' : hp.choice('batch', [32,64,128]),
    'dropout': hp.choice('dropout', [0, 0.25, 0.5, 0.75]),
    'epochs' :  hp.choice('epochs', [10, 20, 50, 100]),
    'hidden': hp.choice('hidden', [1, 2, 3, 4]),
    'l2': hp.choice('l2', [0.1, 0.01, 0.001, 0.0001]),
    'lr': hp.choice('lr', [0.1,0.01,0.001,0.0001]),
    'neurons': hp.choice('neurons', [1, 2, 4, 6]),
    'opt': hp.choice('opt', ['adam','rmsprop'])

}

def objective(params):
    from keras.regularizers import l1,l2

    import keras
    from keras import backend as KB
    import tensorflow as tf
    from sklearn.metrics import r2_score,mean_squared_error
    from keras.callbacks import EarlyStopping
    from keras.layers.normalization import BatchNormalization
    from keras.layers import GaussianNoise

    dfResultsCV = pd.DataFrame()

    mseList = []
    corrList = []
    rsqList = []

    print(mseList)

    for i in range(0,4):

        if i == 0:
            trainCV = pd.concat([train[train['fold'] == 0], train[train['fold'] == 1], train[train['fold'] == 2]], axis=0, ignore_index=True)
            testCV = train[train['fold'] == 3]
            fold = 4
            sel_colsCV = CVcols[0]
        elif i == 1:
            trainCV = pd.concat([train[train['fold'] == 0], train[train['fold'] == 1], train[train['fold'] == 3]], axis=0, ignore_index=True)
            testCV = train[train['fold'] == 2]
            fold = 3
            sel_colsCV = CVcols[1]
        elif i == 2:
            trainCV = pd.concat([train[train['fold'] == 0], train[train['fold'] == 2], train[train['fold'] == 3]], axis=0, ignore_index=True)
            testCV = train[train['fold'] == 1]
            fold = 2
            sel_colsCV = CVcols[2]
        else:
            trainCV = pd.concat([train[train['fold'] == 1], train[train['fold'] == 2], train[train['fold'] == 3]], axis=0, ignore_index=True)
            testCV = train[train['fold'] == 0]
            fold = 1
            sel_colsCV = CVcols[3]


        ### Scale the trainCV data
        ###
        trainCVsca = trainCV.copy()
        testCVsca = testCV.copy()

        trainCVsca[sel_colsCV] = scaler.fit_transform(trainCV[sel_colsCV])
        testCVsca[sel_colsCV] = scaler.transform(testCV[sel_colsCV])

        ###
        ### Scale the trainCV data

        np.random.seed(0)
        tf.set_random_seed(0)
        sess = tf.Session(graph=tf.get_default_graph())
        KB.set_session(sess)

        early_stop = EarlyStopping(monitor='val_loss', min_delta=0.00001, patience=5, verbose=2, mode='auto')
        MLPmodel = Sequential()
        MLPmodel.add(GaussianNoise(0.001, input_shape=(len(sel_colsCV),)))
        MLPmodel.add(Dense(params['neurons'], input_dim=trainCVsca[sel_colsCV].shape[1], activation=params['act'], 
                           activity_regularizer=l2(params['l2'])))

        for j in range(0,params['hidden']):

            MLPmodel.add(Dense(params['neurons'], activation=params['act'], activity_regularizer=l2(params['l2'])))
            MLPmodel.add(BatchNormalization())
            MLPmodel.add(Dropout(params['dropout']))

        MLPmodel.add(Dense(1, activation='linear'))

        if params['opt'] == 'adam':
            optim = keras.optimizers.Adam(lr=params['lr'])
            MLPmodel.compile(loss='mse', optimizer=params['opt'])
        else:
            optim = keras.optimizers.RMSprop(lr=params['lr'])
            MLPmodel.compile(loss='mse', optimizer=params['opt'])

        MLPmodel.fit(trainCVsca[sel_colsCV], trainCVsca[target], batch_size=params['batch'], epochs=params['epochs'], 
                                validation_data=(testCVsca[sel_colsCV],testCVsca[target]),callbacks=[early_stop],verbose=2)

        mse = mean_squared_error(testCVsca[target], MLPmodel.predict(testCVsca[sel_colsCV]))
        rsq = r2_score(testCVsca[target], MLPmodel.predict(testCVsca[sel_colsCV]))
        corr = np.corrcoef(pd.DataFrame(testCVsca[target])['IT_3M_REL_RETURN'],pd.DataFrame((MLPmodel.predict(testCVsca[sel_colsCV]).reshape(-1,1)))[0])[0][1]

        mseList.append(mse)
        rsqList.append(rsq)
        corrList.append(corr)

        del MLPmodel
        KB.clear_session()

    AvgMse = np.average(mseList)
    AvgRsq = np.average(rsqList)
    AvgCorr = np.average(corrList)

    print("Average Mse is: ", AvgMse)
    print("Average Rsq is: ", AvgRsq)
    print("Average Corr is: ", AvgCorr)

    score = -AvgRsq

    return {'loss': score, 'status': STATUS_OK}

trials = Trials()

best = fmin(objective, space, algo=tpe.suggest, trials=trials, max_evals=500, rstate=np.random.RandomState(23))

Когда я запускаю модель с параметрами:

act = space_eval(space, best)['act']
batch = space_eval(space, best)['batch']
dropout= space_eval(space, best)['dropout']
epoch = space_eval(space, best)['epochs']
hidden = space_eval(space, best)['hidden']
l2_reg = space_eval(space, best)['l2']
lr = space_eval(space, best)['lr']
neurons = space_eval(space, best)['neurons']
opt = space_eval(space, best)['opt']

, я получаю rsq -2,02 со значением корреляции 0,155, которые сильно отличаютсяиз результатов гиперопция достигнута.В чем может быть причина?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...