一篇长文学懂入门推荐算法库:surprise( 二 )


这三个提到的内容,我们在接下来的文章可以再进一步体会 。
 
2 从第一部分的数据载入开始【一篇长文学懂入门推荐算法库:surprise】我们前面分析了数据载入部分,由 Reader 和 Dataset 两个类来提供功能 。接下来要做的就是捋顺这部分内容,然后自己尝试写出来对应的模块,并且替代进去,看看我们前面的代码能不能继续正常运行 。
当我们到了这一步的时候,首先就是打开这两个模块,看一看代码,了解一下它们的功能 。在【第二篇文章:推荐实践(2):数据集的载入与切割】中,对这两部分的内容进行了仔细分析,我在这里就总体性的介绍一下,不深入到代码细节上去了 。
reader = Reader(line_format="user item rating", sep=',', skip_lines=1)对于这个 Reader 类,主要的功能是设置一个读取器 。从 Reader 的使用也可以看出来,要求的输入是每行的格式,每行的分隔符,要忽略的行数 。
从这个类实例时的输入上,我们可以判断出来,这个 Reader 类的作用是构造一个读取器对象 reader,这个读取器 reader 包含了一些如何去读数据的属性 。比如 reader 知道每行的数据是按照 “user item rating” 来分布的,知道每行数据由符号 "," 分割开,知道第一行的数据应该被跳过 。
所以我们在构建了这个 reader 以后,就可以将它传给 Dataset 类,来辅助我们从数据集中,按照我们想要的格式读取出来数据内容 。
data = https://www.isolves.com/it/cxkf/yy/Python/2020-05-28/Dataset.load_from_file('./ml-latest-small/ratings.csv', reader)由于这里我们选择了使用自己已经下载的数据集,调用的就是 Dataset.load_from_file 方法 。可以看到的是,这个方法的输入有两个参数,第一个是数据集的路径,第二个就是刚刚实例化的读取器 reader 。
所以这个 load_from_file 在读取数据时,就会按照 reader 的定义的格式来读取,最终返回一个自定义的数据格式 。其实如果看了代码,我们可以看到这里返回的数据格式是:dataset.DatasetAutoFolds,但是正如我们前面说的,对于源码不要陷入细节 。我们知道这两步对原始的数据集文件进行了处理,得到了后续可以处理的数据格式,就 OK 啦 。
 
3 进行结果交叉验证在完成数据集的载入以后,我们选择的是利用 cross_validate 执行算法并交叉检验 。这一部分的内容,我们分为两部分去介绍 。
首先忽略掉算法的实现,直接调用算法的接口 。这也是一个很实用的 trick,适当的时候忽略掉一些代码实现,即使你接下来要用到它,也可以直接调源码的接口 。所以我们这里忽略了 KNN 算法的实现,直接调用它来实现训练拟合以及后续在测试集上的预测 。
那么 cross_validate 里面是什么呢?我们看一下 validate 中的内容:

一篇长文学懂入门推荐算法库:surprise

文章插图
validate 中有两个函数,分别是 cross_validate 和 fit_and_score 。我们简单的介绍一下它们的功能,让大家可以继续没有障碍的阅读当前这篇文章,至于具体的代码和功能分析可以看【第三篇文章:推荐实践(3):调用算法接口实现一个 demo】 。
algo = KNNBasicperf = cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=2, verbose=0)可以看到 cross_validate 是被调用的外部接口,很容易可以猜到,fit_and_score 是在 cross_validate 中被调用的 。
对 cross_validate 而言,它的输入有算法对象,数据集,需要测量的指标,交叉验证的次数等 。这里简单的介绍一下它的内部逻辑 。它对输入的数据 data,分成 cv 份,然后每次选择其中一份作为测试集,其余的作为训练集 。在数据集划分完后,对它们分别调用 fit_and_score,去进行算法拟合 。
这里注意一个小细节,对数据集的划分不是静态全部划分完,然后分别在数据集上进行训练和验证,而是利用输入的 data 构造一个生成器,每次抛出一组划分完的结果 。
对 fit_and_score 函数,它对输入的算法在输入的训练集上进行拟合,然后在输入的测试集上进行验证,再计算需要的指标 。
在进行到这里的时候,同样忽略掉对预测结果进行指标测量的步骤,直接调用 surprise 中的 accuracy 来进行处理 。当然到后面我们会补充这些内容,这里要注意的重点是如何进行交叉验证 。
这一部分内容的核心是,在有了我们第 2 节输入的数据后,该如何进行数据集的划分以及如何进行算法的训练和验证 。所以我们关注的重点是数据集在进行 k 折交叉验证时如何划分,又如何调用接口完成算法在数据集上的训练和测试 。


推荐阅读