赞
踩
什么是监督学习?
带标签的学习,即给出的数据用标签标注,有明显的正确答案。
什么是分类算法?与分类对应的回归算法又是什么?
简单的说,分类算法用于分类;回归算法用于计算具体的值。
比如:预测明天青浦区的天气问题【雨,晴,多云】。其值是确定的(数学里面说就是离散的),那就是分类问题;预测明天的股价这就是回归问题。其值不确定,但是其值连续,任何一个数值点都有可能取到,这就是回归问题。
进行分类预测。
在推荐系统中,可以将是否点击一个商品看成一个概率事件,被推荐的商品无非只有两种可能性:被点击;不被点击。那么就可以将这个推荐问题转换成一个分类问题。哪些商品会被点击,哪些商品不会被点击?所以可以使用逻辑回归来进行一个分类预测。
逻辑回归算法可以用在很多问题上,下面就聊聊其在电影推荐上的使用。
协同过滤模型仅利用用户与物品的相互行为信息进行推荐【单一特征】。
逻辑回归模型能够综合利用用户,物品,上下文等多种不同的特征生成较全面的推荐结果【多特征融合】。融合体现在将所有的特征放到同一个向量【称之为特征向量】中。
上述描述中的问题:
sigomid
函数中,使之映射到0~1 的区间,最终得到“点击率”简单说一下sigmoid
函数:
函数公式
f
(
z
)
=
1
1
+
e
−
z
f(z) = \frac{1}{1+e^{-z}}
f(z)=1+e−z1
函数图像
前提:
(1)使用逻辑回归完成二分类
那么具体是怎么训练的?怎么样才能找到一个合适的w?
step1.初始化w
初始化可以随意进行,但是也是有讲究的,这里不再涉及。我们就以最简单的初始化方式,将其全部取成0。即w=[0,0,...,0]
step2.确定损失函数
损失函数该是什么样子呢?因为是二分类,那也就是说:每个物品都有点(记为y=1)、不点(记为y=0)两种选择。在电影评分这个系统中,虽然电影评分有高低之分,但是我们将其简化处理为 看过、没看过 两种状态【这种状态就是监督学习中所说的标签】。根据这个标签,那么就可以由 极大似然估计思想 得到一个损失函数。极大似然估计我们后面再补充。
{
p
(
y
=
1
∣
x
;
w
)
=
f
w
(
x
)
p
(
y
=
0
∣
x
;
w
)
=
1
−
f
w
(
x
)
\left \{
这里的
f
w
(
x
)
f_w(x)
fw(x)就是判断x被分类为1的概率。相应的,
1
−
f
w
(
x
)
1-f_w(x)
1−fw(x)就是被分类为0的概率。将上式综合起来【为啥要统一形式呢?为了更加方便的表达】 ,可以得到式:
p
(
y
∣
x
;
w
)
=
[
f
w
(
x
)
]
y
[
1
−
f
w
(
x
)
]
1
−
y
p(y|x;w) = [f_w(x)]^y [1-f_w(x)]^{1-y}
p(y∣x;w)=[fw(x)]y[1−fw(x)]1−y
如果再用极大似然估计去估计这个参数,那么就得到了如下的目标函数:
M
L
E
(
w
)
=
∏
i
=
1
m
p
(
y
i
∣
x
;
w
)
=
[
f
w
(
x
)
]
y
[
1
−
f
w
(
x
)
]
1
−
y
MLE(w) = \prod_{i=1}^m p(y_i|x;w) = [f_w(x)]^y [1-f_w(x)]^{1-y}
MLE(w)=i=1∏mp(yi∣x;w)=[fw(x)]y[1−fw(x)]1−y
为了计算方便,将其取对数后,再乘以系数
−
1
m
-\frac{1}{m}
−m1,得到的目标函数:
J
(
w
)
=
−
1
m
l
o
g
[
L
(
w
)
]
=
l
o
g
{
∏
i
=
1
m
p
(
y
∣
x
;
w
)
}
=
−
1
m
{
∑
i
=
1
m
[
y
i
l
o
g
f
w
(
x
i
)
+
(
1
−
y
i
)
l
o
g
(
1
−
f
w
(
x
i
)
)
]
}
J(w) =-\frac{1}{m} log[L(w)] =log\{ \prod_{i=1}^m p(y|x;w) \} = -\frac{1}{m} \{ \sum_{i=1}^m[ \space y^ilogf_w(x^i)+(1-y^i)log(1-f_w(x^i))] \space \}
J(w)=−m1log[L(w)]=log{i=1∏mp(y∣x;w)}=−m1{i=1∑m[ yilogfw(xi)+(1−yi)log(1−fw(xi))] }
注:
(1)取完log
后,阶数变成了系数。所以上面这个公式有系数
y
i
y^i
yi 和 系数
(
1
−
y
i
)
(1-y^i)
(1−yi)
(2)这个损失函数也就是处理分类问题中最常用且著名的函数——交叉熵函数
二分类的交叉熵损失函数
L = − [ y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ] L=-[ylog\hat y + (1-y)log(1-\hat y)] L=−[ylogy^+(1−y)log(1−y^)] 其中y是真实值, y ^ \hat y y^是预测值。因为是二分类,所以它们的取值集合是{0,1}。
针对上面的叙述,我来结合电影数据和我的代码来讲解如何完成一次推荐过程。
-rw-r-----@ 1 gamidev staff 1.5M 3 9 2001 u1.base
-rw-r-----@ 1 gamidev staff 383K 3 9 2001 u1.test
-rw-r-----@ 1 gamidev staff 1.5M 3 9 2001 u2.base
-rw-r-----@ 1 gamidev staff 386K 3 9 2001 u2.test
-rw-r-----@ 1 gamidev staff 1.5M 3 9 2001 u3.base
-rw-r-----@ 1 gamidev staff 387K 3 9 2001 u3.test
-rw-r-----@ 1 gamidev staff 1.5M 3 9 2001 u4.base
-rw-r-----@ 1 gamidev staff 388K 3 9 2001 u4.test
-rw-r-----@ 1 gamidev staff 1.5M 3 9 2001 u5.base
-rw-r-----@ 1 gamidev staff 388K 3 9 2001 u5.test
pytorch
在公式y = wx + b
中,需要确定各个向量中的数据是什么。这一般会结合实际的数据映映射+抽象得到。例如:结合用户信息、电影信息得到如下特征向量的格式:x=【用户id,用户年龄,性别,职业,电影id,电影类别】
其中电影类别不是一个值,是一个1*18的向量,其每个维度代表的信息是:
unknown | Action | Adventure | Animation |Children’s | Comedy
| Crime | Documentary | Drama | Fantasy |Film-Noir
| Horror | Musical | Mystery | Romance | Sci-Fi |Thriller | War | Western
例如有如下数据:
u.user => 19|40|M|librarian|02138
数据说的是:userid=19,年龄是40,性别是Male=>0, librarian => 1[统一映射]
因为需要针对这个人推荐,所以我这里找出他看过的电影以及评分记录:
19 274 2 879539794
也就是说,看过的电影id是274,那么得到的特征向量就是 x = [19,40,0,1,274,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0]
。下面给出一个得到的特征向量的例子:
featureDs 是类FeatureDataset的实例。我们主要用到其 feature 和 label 这两个属性。如下图所示:
同时,在 featureDs 这个实例中下的feature有80000条数据,每条数据都是一个特征向量,如下图所示:
我们接下来就会用这些特征向量去训练模型。
y表示的是正样本【推荐看的电影1】亦或是负样本【不推荐看的电影0】。这里有几个地方需要注意:
y=1,y=0
这个标签来训练的,利用MLE
方法进行模型的训练(所以需要分类,即有正负样本之分),得到一个最终的预测模型。简单回顾一下整个模型简图:
上图中的逻辑回归主要会做如下几件事儿:
再对应来看我的代码:
LogR(nn.Module)
实现这个部分,具体如下图所示:__init__()
函数是用于定义模型会具体使用什么包,比如说:这里的 self.linR = nn.Linear(in_features,out_features)
说明linR是pytorch 包下Linear(...)
的实例。我们指定输入数据的特征,它就会在这个数据上执行线性变换操作。self.sg = nn.Sigmoid()
同理。forward()
函数是模型真正训练时执行的。它强调的是 模型的调用顺序,比如说,由上图显示可知,我们这里是先执行线性变换,然后执行激活操作 (sigmoid
) 。现在模型已经有了输入,输出,但是还不知道模型的好坏,所以我们得搞个东西来衡量模型的好坏,这个东西就是 损失函数,同时,我们还需要将损失函数的损失降到最小,所以就需要 优化器 来优化模型。
上面方框中的分别就是我们使用的逻辑回归模型的损失函数和优化器。通常为了加速训练,可以将数条【”数条“的值=BATCH_SIZE】特征向量拼接成一个矩阵的形式,然后得到一个mini-batch
。在pytorch中,为了方便将数据搞成mini-batch 和并行加载数据。搞出来一个Dataset
类和DataLoader
类。
上面四个框,分别对应的是:
可以看到训练的正确率 在94% 上下,但是测试模型效果在 93% 左右。
本节提出逻辑回归中的系列可疑之处,供大家参考
y=1/0
,而预测得到的值却是一个概率值?y=1/0
去表示是属于1类【正样本】还是0类【负样本类】,损失函数用的是适合处理分类问题的交叉熵算法(cross entropy
)mse
)】?这个涉及到梯度下降时参数更新的问题。在mse
算法的梯度计算公式中,因为 sigmoid
导数的性质会导致参数无法更新,所以使用了交叉熵算法而不是均方误差。
在商品广告的推荐里,使用点击率无可厚非。但是在推荐电影的这个系统中,仅仅使用点击率来衡量问题是否欠妥?
常用MLE方法去估计一个参数的取值。求极大似然估计值的一般步骤如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。