推荐系统为什么要分测试集与训练集


链接:https://www.zhihu.com/question/22872584/answer/620691257
来源:知乎


1、训练集和测试集

一般来说,训练集用来估计模型中的参数,使模型能够反映现实,进而预测未来或其他未知的信息,而测试集用来评估模型的预测性能。

例如:已知1000个小朋友的体重和身高数据,想建立体重与身高的线性回归模型。我们可以用900个小朋友的身高和体重数据(训练集)来拟合模型中的参数,进而预测另外100个小朋友的体重(已知身高数据),预测值和实际值的差别就可以用来衡量模型的预测性能(测试集是100个小朋友的体重和身高);或者使用1995-2018年的GDP数据建立线性回归模型来预测2019年的GDP数据;

这里可能会有个疑问:

为什么不用1000个小朋友的数据拿来做拟合?

将1000个小朋友的数据输入到模型拟合过程中,这在技术上是可以实现的,也可以计算出来每个小朋友的实际值和预测值,进而计算出误差。但是,这可能存在过拟合问题,即模型预测性能在其他数据集中表现会有明显降低。也就是说,用一个数据集既做训练又做测试,性能评估指标是不准确的,相当于你考试时做的都是平常做过的课后题,无法检测出实际水准。

为了更好地评价我们的模型,除非我们在1000个小朋友之外,再去找一些小朋友作为测试集。此时希望不会有人提出为什么不把新找的数据加入到训练集。同理,如果我们想测试基于1995-2018年GDP数据而建立的预测模型准确度,需要2019年的GDP数据(这可能就要等一年才行了)。

数据当然没那么容易获取,所以我们只能把现有的数据集人工分为训练集和测试集。此时,比如只能获得1995-2017年的数据,然后用2018年的GDP数据来检验模型预测的准确性。

2、推荐系统与机器学习

机器学习模型中的训练集和测试集的划分是很好理解的,而推荐系统中有一些,特别是协同过滤算法,训练集和测试集的划分有所不同。

2.1 机器学习

假如我们要给银行开发一个信用违约风险预测模型,通过每个客户的个人信息、消费行为、资产状况、借贷数额等状况来预测该客户是否会按时还贷。

这是一个经典的分类问题,我们可以使用机器学习模型来处理,像决策树、逻辑回归、神经网络等,用80%的用户作为训练集来拟合这些模型中的参数,然后把训练好的模型放到剩余那20%的用户中做测试,从而得到模型的性能指标。

这时,训练集和测试集的划分方法是基于用户的,训练集的作用是拟合模型中的参数。

2.2 推荐系统

推荐系统中也有一些基于机器学习的推荐模型,这些和2.1是相同的,在这里不提。

我们着重提的是基于用户的协同过滤推荐算法,它与机器学习模型直观上有两点不同。

  1. 协同过滤推荐算法中没有像线性回归模型中那样待估计的参数α、β等。(无监督)
  2. 协同过滤推荐算法不能基于用户划分训练集和测试集。因为协同过滤推荐模型要输入的必须是个矩阵(需要近邻用户的购买行为信息),而不是某用户的一行数据(而决策树、逻辑回归模型是可以的)。

我最初的想法也是觉得协同过滤推荐算法的训练集根本没有什么用,没有什么能贡献给测试集。后来才发现个推荐算法的不同之处。

训练集和测试集的划分方法

协同过滤推荐算法的训练集划分不是基于用户的,而是基于值的,即【用户,项目,评分】三元组。如果训练集为80%,测试集为20%,我们就可以将用户-项目评分中的80%抽取出来作为训练集,没抽取的那20%当做测试集(这些项目的值在训练集中表示为不存在)

假如,某用户-项目评分矩阵中有100个项目,其中用户张三购买并评价了20个项目,也就是有80个项目未购买。这时,我们将20个项目中抽取80%,也就是16个项目作为训练集,另外4个项目作为测试集。即假设张三只购买并评价了100个项目中的16个项目,实际上已经购买的那4个项目就当做未购买。

训练集在推荐算法中的作用

协同过滤推荐算法中的第一步就是寻找近邻用户,近邻用户的质量和数量都会影响最终的模型性能。而训练集要训练的,其实就是目标用户的近邻用户,也可以说是用户相似矩阵。

举个例子就是,我们以用户张三的16个项目得出的近邻用户,和使用20个项目得出的近邻用户是不同的,而后者往往更加准确。拓展到所有用户,使用80%数据得到的用户相似矩阵,当然不如使用100%数据得到的用户相似矩阵。但是正如第一节所说的,为了保证测试的准确性,我们必须分出来一些数据作为测试集。

 
参考:https://www.zhihu.com/question/22872584/answer/620691257
 
原文地址:https://www.cnblogs.com/spp666/p/12166874.html