回归问题中,为了调节网络参数(如训练轮数)的同时对网络进行评估,一般将数据集分为训练集和验证集。但有时由于数据集比较小,验证集会非常小。因此会导致验证结果会有很大波动,无法对模型进行可靠的评估,此时,最佳的做法就是使用K折交叉验证。
K折交叉验证的思路就是将数据集划分为K个分区,通常K=4或K=5,创建K个相同的模型,将每个模型在K-1个分区上训练,并在剩下的一个分区进行验证评估,最后模型的验证分数等于K个验证分数的平均值。代码实现如下:
import numpy as np
#输入K值(默认5折)
#训练轮数
#训练数据
#训练目标数据(标签)
def k_fold(k=5, val_samples_num, num_epchos=100,train_data, train_target): #训练集均分为K份
val_samples_num = len(train_data) // k
all_scores = []
for i in range(k):
print('now is %d fold' % i)
val_data = train_data[i*val_samples_num:(i+1)*val_samples_num]
val_targets = train_target[i*val_samples_num:(i+1)*val_samples_num]
partial_train_data = np.concatenate([train_data[:i*val_samples_num],
train_data[(i+1)*val_samples_num :]],
axis=0)
partial_train_targets = np.concatenate([train_target[:i*val_samples_num],
train_target[(i+1)*val_samples_num :]],
axis=0)
model = build_model()
model.fit(partial_train_data, partial_train_targets, epochs=num_epchos, batch_size=1, verbose=0)
val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0)
all_scores.append(val_mae)
mae_mean = np.mean(all_scores)
print(mae_mean)
可以通过画出每轮mae的走势图来观察训练情况,判断是否有过拟合,同时找到一个相对好的轮数值。