1.标准化
首先标准化可以解决不同范围数据的情况,解决其中一种特征受制于scale而导致的弱影响问题。
此时不同特征同属于接近的scale,梯度下降的速度是最快的。
代码如下:
mean = train_data.mean(axis=0)
std = train_data.std(axis=0)
train_data -= mean
train_data /= std
test_data -= mean
test_data /= std
可以注意到,这里的平均和标准差是沿着样本轴方向进行的,并且,测试资料在进行标准化时,也只能使用训练资料的均值和标准差。
2.K折交叉验证
K折交叉验证常用在数据集较小的情况下,此时由于分割出的训练集分布可能无法代表原来整体的分布,就需要进一步使用可信度较高的方法划分验证集。
具体来说K折交叉验证会将训练集分成n份,以5份举例,每次会选取其中一份作为训练集,其他几份连接起来作为训练集,训练集训练出的模型拿给当下验证集进行预测,最后将几次预测的结果取平均(分类任务还有投票制等)。
k折交叉验证有些类似于多模型的集成学习,因为实际上我们是产生了多个模型并对结果进行集成。
代码如下:
import numpy as np
k = 5
num_val_datas = len(train_datas)//k # 确定每折的数据量
all_scores = [] # 存储每个模型的结果
for i in range(k):
val_x_trains = train_datas[i*num_val_datas:(i+1)*num_val_datas]
val_y_trains = train_targets[i*num_val_datas:(i+1)*num_val_datas]
partitial_x_train = np.concatenate([train_datas[:i*num_val_datas],
train_datas[(i+1)*num_val_datas:]],axis=0)
partitial_y_train = np.concatenate([train_targets[:i*num_val_datas],
train_targets[(i+1)*num_val_datas:]],axis=0)
model = build_model()
model.fit(partitial_x_train,partitial_y_train,epochs=5,batch_size=1,verbose=2)
loss,e = model.evaluate(val_x_trains,val_y_trains,verbose=2)
all_scores.append(e)