【发布时间】:2019-09-04 02:56:27
【问题描述】:
我一直在尝试调整神经网络一段时间,但不幸的是,我无法从中获得良好的性能。我有一个时间序列数据集,我正在使用 RandomizedSearchCV 进行二进制分类。我的代码如下。任何建议或帮助将不胜感激。一件事是我仍在试图弄清楚如何合并是提前停止。
编辑:忘了补充一点,我是根据 F1 宏观指标来衡量性能的,我不能得到高于 0.68 的分数。我注意到的另一件事是,我尝试一次估计的参数越多(增加我的网格),我的得分就越差。
train_size = int(0.70*X.shape[0])
X_train, X_test, y_train, y_test = X[0:train_size], X[train_size:],y[0:train_size], y[train_size:]
from numpy.random import seed
seed(3)
from tensorflow import set_random_seed
set_random_seed(4)
from imblearn.pipeline import Pipeline
def create_model(activation_1='relu', activation_2='relu',
neurons_input = 1, neurons_hidden_1=1,
optimizer='adam',
input_shape=(X_train.shape[1],)):
model = Sequential()
model.add(Dense(neurons_input, activation=activation_1, input_shape=input_shape, kernel_initializer='random_uniform'))
model.add(Dense(neurons_hidden_1, activation=activation_2, kernel_initializer='random_uniform'))
model.add(Dense(2, activation='sigmoid'))
model.compile (loss = 'sparse_categorical_crossentropy', optimizer=optimizer)
return model
clf=KerasClassifier(build_fn=create_model, verbose=0)
param_grid = {
'clf__neurons_input':[5, 10, 15, 20, 25, 30, 35],
'clf__neurons_hidden_1':[5, 10, 15, 20, 25, 30, 35],
'clf__optimizer': ['Adam', 'Adamax','Adadelta'],
'clf__activation_1': ['softmax', 'softplus', 'softsign', 'relu', 'tanh', 'sigmoid', 'hard_sigmoid', 'linear'],
'clf__activation_2': ['softmax', 'softplus', 'softsign', 'relu', 'tanh', 'sigmoid', 'hard_sigmoid', 'linear'],
'clf__batch_size': [40,60,80,100]}
pipe = Pipeline([
('oversample', SMOTE(random_state=12)),
('clf', clf)
])
my_cv = TimeSeriesSplit(n_splits=5).split(X_train)
rs_keras = RandomizedSearchCV(pipe, param_grid, cv=my_cv, scoring='f1_macro', refit='f1_macro', verbose=3, n_jobs=1,random_state=42)
rs_keras.fit(X_train, y_train)
print("Best: %f using %s" % (rs_keras.best_score_, rs_keras.best_params_))
from sklearn.metrics import classification_report, confusion_matrix
y_pred=rs_keras.predict(X_test)
clfreport = classification_report(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)
print (clfreport)
print (cm)
scores_test = rs_keras.score(X_test,y_test)
print ("Testing:", scores_test)
【问题讨论】:
-
您的数据似乎非常不平衡。你怎么办?也许问题是你所有的模型都因为不平衡而不是由于超参数优化而找不到好的解决方案?
-
通过管道使用 SMOTE。
-
好的,有道理,我现在可以在代码中找到它。在无法访问数据的情况下,我想到的下一个问题是:为什么你认为 0.68 的 F1 已经不是很好了?也许您的网络架构不适合这个问题? (时间序列通常使用 RNN 而不是全连接网络来处理)或者
class 1的统计数据波动很大(因为它的比例很小)并且您的测试样本与训练有很大不同? (训练集的表现如何?您是否使用 EDA 来比较训练集和测试集之间的分布?) -
我将再次查看测试集。我想知道 SMOTE 是否真的把底层分布搞得这么混乱,那个测试集不再是平衡训练集的代表。
-
为了消除
SMOTE伪影,您还可以尝试在训练中使用权重而不是重采样。有一些相关的问题here
标签: python keras time-series grid-search hyperparameters