Shl*_*rtz 8 python machine-learning keras tensorflow
我用Keras写了一个LSTM网络(下面的代码):
df = pd.read_csv("../data/training_data.csv")
# Group by and pivot the data
group_index = df.groupby('group').cumcount()
data = (df.set_index(['group', group_index])
.unstack(fill_value=0).stack())
# getting np array of the data and labeling
# on the label group we take the first label because it is the same for all
target = np.array(data['label'].groupby(level=0).apply(lambda x: [x.values[0]]).tolist())
data = data.loc[:, data.columns != 'label']
data = np.array(data.groupby(level=0).apply(lambda x: x.values.tolist()).tolist())
# shuffel the training set
data, target = shuffle(data, target)
# spilt data to train and test
x_train, x_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=4)
# ADAM Optimizer with learning rate decay
opt = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0001)
# build the model
model = Sequential()
num_features = data.shape[2]
num_samples = data.shape[1]
model.add(LSTM(8, batch_input_shape=(None, num_samples, num_features), return_sequences=True, activation='sigmoid'))
model.add(LeakyReLU(alpha=.001))
model.add(Dropout(0.2))
model.add(LSTM(4, return_sequences=True, activation='sigmoid'))
model.add(LeakyReLU(alpha=.001))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=opt,
metrics=['accuracy', keras_metrics.precision(), keras_metrics.recall(),f1])
model.summary()
# Training, getting the results history for plotting
history = model.fit(x_train, y_train, epochs=3000, validation_data=(x_test, y_test))
Run Code Online (Sandbox Code Playgroud)
监控的指标包括损失,准确性,精确度,召回率和f1分数.
我注意到验证损失度量开始在300个时期内攀升,所以我认为过度拟合!然而,召回仍在攀升,精确度略有提高.
这是为什么?我的模特是否过度装修?
验证损失指标开始攀升约 300 epochs (...) 召回率仍在攀升,精度略有提高。(...) 这是为什么?
准确率和召回率是衡量分类器在预测类别标签方面表现如何的指标。另一方面,模型损失是交叉熵的度量,即分类概率的误差:
在哪里
y = predicted label
p = probability of predicted label
Run Code Online (Sandbox Code Playgroud)
例如,对于不同的时期,一个观察的模型的(softmax)输出可能看起来像这样,说
# epoch 300
y = [0.1, 0.9] => argmax(y) => 1 (class label 1)
loss = -(1 * log(0.9)) = 0.10
# epoch 500
y = [0.4, 0.6] => argmax(y) => 1 (class label 1)
loss = -(1 * log(0.6)) = 0.51
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,准确率和召回率指标将保持不变(仍然正确预测类标签),但是模型损失增加了。一般而言,该模型对其预测变得“不太确定”,但它仍然是正确的。
请注意,在您的模型中,损失是针对所有观察值计算的,而不仅仅是单个观察值。为了简单起见,我限制了讨论。通过取所有观测值的损失的平均值,损失公式被简单地扩展到 n > 1 个观测值。
我的模型是否过拟合?
为了确定这一点,您必须比较训练损失和验证损失。您不能仅通过验证损失来判断。如果训练损失减少而验证损失增加,则您的模型过度拟合。