机器学习排序LTR入门(2)

使用线性回归你会更满意,包括决策确实是又一个排序信号,我们定义为t*o。或者另一个信号t2,实践中一般定义为t^2或者log(t),或者其他你认为有利于相关度预测的最佳公式。接下来只需要把这些值作为额外的列,用于线性回归学习系数。

任何模型的设计、测试和评估是一个更深的艺术,如果希望了解更多,强烈推荐统计学习概论

使用sklearn实现线性回归LTR

为了更直观地体验,使用Python的sklearn类库来实现回归是一个便捷的方式。如果想使用上文数据通过线性回归尝试下简单的LTR训练集,可以把我们尝试的相关度等级预测值记为S,我们看到的信号将预测该得分并记为X。

我们将使用一些电影相关度数据尝试点有趣的事情。这里有一个搜索关键词“Rocky”的相关度等级数据集。召回我们上面的评判表,转换为一个训练集。一起来体验下真实的训练集(注释会帮助我们了解具体过程)。我们将检查的三个排序信号,包括标题的TF*IDF得分、简介的TF*IDF得分以及电影观众的评分。

grade,titleScore,overviewScore,ratingScore,comment:# keywords@movietitle 4,10.65,8.41,7.40,# 1366 rocky@Rocky 3,0.00,6.75,7.00,# 12412 rocky@Creed 3,8.22,9.72,6.60,# 1246 rocky@Rocky Balboa 3,8.22,8.41,0.00,# 1374 rocky@Rocky IV 3,8.22,7.68,6.90,# 1367 rocky@Rocky II 3,8.22,7.15,0.00,# 1375 rocky@Rocky V 3,8.22,5.28,0.00,# 1371 rocky@Rocky III 2,0.00,0.00,7.60,# 154019 rocky@Belarmino 2,0.00,0.00,7.10,# 1368 rocky@First Blood 2,0.00,0.00,6.70,# 13258 rocky@Son of Rambow 2,0.00,0.00,0.00,# 70808 rocky@Klitschko 2,0.00,0.00,0.00,# 64807 rocky@Grudge Match 2,0.00,0.00,0.00,# 47059 rocky@Boxing Gym ...

所以接下来直接来到代码的部分!下面的代码从一个CSV文件读取数据到一个numpy数组;该数组是二维的,第一维作为行,第二维作为列。在下面的注释中可以看到很新潮的数组切片是如何进行的:

from sklearn.linear_model import LinearRegression from math import sin import numpy as np import csv rockyData = np.genfromtxt('rocky.csv', delimiter=',')[1:] # Remove the CSV header rockyGrades = rockyData[:,0] # Slice out column 0, where the grades are rockySignals = rockyData[:,1:-1] # Features in columns 1...all but last column (the comment)

不错!我们已准备好进行一个简单线性回归了。这里我们使用一个经典的判断方法:方程比未知数多!因此我们需要使用常最小二乘法来估算特征rockySignals和等级rockyGrades间的关系。很简单,这就是numpy线性回归所做的:

butIRegress = LinearRegression() butIRegress.fit(rockySignals, rockyGrades)

这里给出了系数(即“权重”)用于我们的排序信号,:

butIRegress.coef_ #boost for title, boost for overview, boost for rating array([ 0.04999419, 0.22958357, 0.00573909]) butIRegress.intercept_ 0.97040804634516986

漂亮!相关度解决了!(真的吗?)我们可以使用这些来建立一个排序函数。我们已经学习到了分别使用什么样的权重到标题和简介属性。

截至目前,我忽略了一部分事项,即我们需要考量如何评价模型和数据的匹配度。在本文的结尾,我们只是想看看一般情况下这些模型是如何工作。但不只是假设该模型非常适合训练集数据是个不错的想法,总是需要回退一些数据来测试的。接下来的博文会分别介绍这些话题。

使用模型对查询打分

我们通过这些系数可以建立自己的排序函数。做这些只是为了描述目的,sk-learn的线性回归带有预测方法,能评估作为输入的模型,但是构建我们自己的更有意思:

def relevanceScore(intercept, titleCoef, overviewCoef, ratingCoef, titleScore, overviewScore, movieRating): return intercept + (titleCoef * titleScore) + (overviewCoef * overviewScore) + (ratingCoef * movieRating)

使用该函数我们可以获得检索“Rambo”时,这两部候选电影的相关度得分:

titleScore,overviewScore,movieRating,comment 12.28,9.82,6.40,# 7555 rambo@Rambo 0.00,10.76,7.10,# 1368 rambo@First Blood

现在对Rambo和First Blood打分,看看下哪一个跟查询“Rambo”更相关!

# Score Rambo relevanceScore(butIRegress.intercept_, butIRegress.coef_[0], butIRegress.coef_[1], butIRegress.coef_[2], titleScore=12.28, overviewScore=9.82, movieRating=6.40) # Score First Blood relevanceScore(butIRegress.intercept_, butIRegress.coef_[0], butIRegress.coef_[1], butIRegress.coef_[2], titleScore=0.00, overviewScore=10.76, movieRating=7.10)

结果得分分别是Rambo 3.670以及First Blood 3.671。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/53e08f9bbcdc77c156734f46f0093ac8.html