深度学习——评估学习模型

        在我们进行输出处理时要将数据集划分为训练集、验证集、测试集。当我们模型训练后为什么不在训练集上对模型进行评估呢?原因很简单:我们如果采用训练集进行模型评估,仅仅过去几轮,模型就会过拟合,也就是模型在训练数据上始终在提高,但是在前所未见的数据(也就是不在训练集内的数据)上的性能则不再变化,甚至是开始下降。

        机器学习的目的是得到可以泛化的模型,在前所未见的数据上表现得很好的模型。所以我们就有了我们通过评估模型,来可靠的衡量模型泛化的能力。

        评估模型的重点在于将数据划分为三个集合:训练集、验证集、测试集。当然我们有新的问题了,为什么为什么不是两个集合?一个训练集一个测试集?在训练集上训练模型,在测试集上进行评估模型。但是我们在开发模型时需要调节模型配置,这个调节过程需要使用模型在验证集数据上的性能作为反馈信号,当然这个调节过程的本质就是一种学习:在某个空间上寻找良好的模型配置。所以基于模型在验证集上的性能来调节模型配置时,会很快导致模型在验证集上过拟合,即使你并没有在验证集上直接、训练也是如此。造成这一现象的原因就是信息泄露,每次在基于模型在验证集上的性能来调节模型的超参数(比如选择层数和层数的大小),都会有一定有关于验证数据的信息泄漏到模型中去;如果对每个参数只调节一次,那么泄露的信息就会很少;验证集也能很好的评估模型,但是我们是多次重复这一过程,会造成越来越多的验证集信息泄露到模型中去;最后你得到的模型在验证集上的性能非常的好,但是我们关注的不是验证集的性能,而是模型在一个前所未有的数据上的性能。

        我们将数据划分为训练集、验证集、测试集听起来很简单,但是如果可用的数据很少,还有几种高级的方法,这里介绍一下三种经典的评估方法:简单的留出验证、K折验证,以及带有打乱数据的重复K折验证。

1.简单的留出验证

        流出一定比例数据作为测试集。再剩余的数据上训练模型,然后在测试集上评估模型,如前所述,为了防止信息泄露,你不能基于测试集来调节模型,所以应该留出一个验证集。


num_validation_samples=10000

np.random.shuffle(data) #打乱数据

validation_data = data[:num_validation_sample]#定义验证集
data = data[num_validation_sample:]

training_data = data[:] #定义训练集

model = get_model()
model.train(training_data)
validation_score = model.evaluate(validation_data)

model=get_model()
model.train(np.concatenate([training_data,validation_data]))

test_score = model.evaluate(test_data)


这个是最简单的评估方法,但是有一个缺点:如果可用的数据很少,那么可能验证集和测试集包含的样本就太少,

2.K折验证法

   将数据划分为大小相同的K个分区,对于每个分区在剩余的K-1个分区上训练模型,然后在分区i上评估模型,最终分数等于K个分数的平均值,对于不同的训练集、测试集划分,如果模型性能变化不太大,这个方法很有用。

k=4
num_val_samples = len(train_data)//k
num_epochs =100
validation_scores = []

for i in range(k):
    print('processing fold#',i)
    validation_data = train_data[i*num_val_samples:(i+1)*num_val_samples]
    
    
   training_data =data[:i*num_val_samples]+data[(i+1)*num_val_samples:]
    
    model = get_model()
    model.train(trian_data)
    validation_score =model.evaluate(validation_data)
    validation_scores=model.append(validation_score)
validation_score = np.average(validation_scores)

model=get_model()
model.train(data)
test_score = model.evaluate(test_data)
    

3带有打乱数据的重复K折验证

      如果可用的数据相对较少,而你又需要尽可能精确的评估模型,那么可以选择带有打乱数据的重复K折验证。具体做法:多次使用K折验证,在每次将数据划分为K个分区之前都先将数据打乱,最终分数是每次K折验证分数的平均值。

注意:评估模型的注意事项:

        数据代表性:希望训练集和测试集能代表当前的数据,在将数据划分为训练集和测试集之前应当随机打乱数据。

        时间箭头:如果要根据过去预测未来,那么在划分数据前不应该随机打乱数据。

        数据冗余:如果数据中的某些数据点出现了两次,那么打乱数据集会导致数据冗余,那么打乱的训练集和验证集会导致训练集和验证集之间的数据冗余。所以我们一定要确保训练集和验证集之间没有交集。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值