K折验证
2019-03-25 本文已影响0人
庵下桃花仙
K折验证(K-fold validation)将数据划分为K个分区。对每个分区 i,在剩余的 K-1 个分区上训练模型,在分区 i 上评估模型。最终分数是 K 个分数的平均值。
3 折验证.PNG
K 折交叉验证
k = 4
num_validation_samples = len(data) // k
np.random.shuffle(data)
validation_scores = []
for fold in rank(k):
validation_data = data[num_validation_samples * fold:
num_validation_samples * (fold + 1)] # 选择验证数据分区
training_data = data[:num_validation_samples * fold] +
data[num_validation_samples * (fold + 1):]
# 使用剩余数据作为训练数据。注意,+ 运算符是列表合并,不是求和
model = get_model() # 创建一个全新的模型实例(未训练)
model.train(training_data)
validation_score = model.evaluate(validation_data)
validation_scores.append(validation_score)
validation_score = np.average(validation_scores) # 最终验证分数:K折验证分数的平均值
model = get_model() # 在所有非测试数据上训练模型
model.train(data)
test_score = model.evaluate(test_data)
带有打乱数据的重复 K 折验证
多次使用 K 折验证,在每次将数据划分为 K 个分区前,先将数据打乱。最终分数是多次 K 折验证分数的平均值。这种方法一共要训练和评估 P * K 个模型,P 是重复次数,计算代价很大。
评估模型注意事项
- 数据代表性(data representativeness),在将数据划分为训练集和测试集之前,应该随机打乱数据;
- 时间箭头(the arrow of time),如果想要预测未来(明天天气),在划分数据前不应该打乱数据,以免造成时间泄露(temporal leak)。要保证测试集上的所有数据时间,都晚于训练集数据;
- 数据冗余(redundancy in your data),确保训练集和验证集之间没有交集。