Я пытаюсь выбрать лучший набор гиперпараметров для моих моделей 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, которые сильно отличаютсяиз результатов гиперопция достигнута.В чем может быть причина?