吴恩达机器学习笔记EP12

【异常检测相关和推荐系统】吴恩达机器学习笔记EP12(P111-P120)

从今天开始我将学习吴恩达教授的机器学习视频,下面是课程的连接1.1 欢迎来到机器学习!_哔哩哔哩_bilibili。一共有142个视频,争取都学习完成吧。


开发和评估异常检测系统

首先介绍异常评估系统的y,1表示异常数据,0表示正常数据。

因为无监督学习没有标签,所以训练时只用数据集中的正常数据,先让模型认识什么是正常的数据。

在交叉验证集和测试集中添加异常数据,看模型是否能异常检测。

或者也可以没有test集,全部放到cv集中进行验证。

在训练集中用正常数据,在cv/test中添入异常数据进行推理预测。

一般的评价指标有:

TP、FP、FN、TN

精确率/召回率

F1值

最后用cv集去选择合适的ε。

异常检测 VS 监督学习

下面是异常检测和监督学习的比较。

有很多不同类型的异常,任何算法都很难学习到异常数据的样子,可能有迄今为止都没见过的异常数据。这种时候通常会选择异常检测算法。使用的例子比如说信息欺诈领域的应用。

有一些正常样例(即使很少),可以让算法知道这些正例是什么样的,并且未来也大概率会有类似的样例出现,这种时候可以使用最早介绍过的监督学习的方法。使用的例子比如说垃圾邮件的检测处理。

选择要使用的特征

高斯分布的数据集有利于训练。

但如果原始数据集不是高斯分布,可以通过一些转换,变换成高斯分布。

一般异常检测算法,我们希望p(x)在正常数据中大,在异常数据中小。

如下图,只有一个特征的图不是很好区分异常数据,这个时候添加特征类有助于提高算法新能,相比之下就更容易辨认异常数据。

提出建议

下面的内容基本就是之前学过内容的实际应用。

比如下面这个推荐系统,这里以预测电影分数为例,其它方面的推荐系统也是同理。

首先是对符号的定义:

nu表示用户的数量。

nm表示电影的数量。

r(i, j)表示用户j是否对电影i评分,1是有评分,0是无评分。

y(i, j)是实际用户j对电影i的评分。

如下图表格,里面有的数据是?说明该用户对该电影还没有评价,系统的目标就是根据其它相关的数据去预测出这个?的值是多少。

使用每项特征

下图表格的x可以理解为当前特征类型(电影类型)的概率。

然后是使用线性回归去拟合数据,用户对于电影的评分预测可以写为w·x+b,就是之前介绍的线性回归模型。

有了模型的定义,自然就可以写出线性回归的成本函数,下面这个成本函数在之前的课程中也有提过。

就是对于每个数据的预测值减去实际值(图里面写反了!)的平方,然后全部加起来求平均再除以2(除以2是为了方便之后的计算)。

最后跟之前讲的一样,为了尽可能减小过拟合,在函数后面加一个正则化模块。

上面只是对一组参数的成本函数定义,扩展到多组函数就可以写成下图的函数。

协同过滤算法

和面给出x不同,如果特征类型的值未知,就可以使用协同过滤算法。

下面给出了用户的相关参数w和b,然后根据之前说的线性回归预测结果,计算用户j对电影i评价的预测。

下面是一个电影i的特征向量对应代价函数的计算方法,这里的代价函数更之前的差不多,最后少了一个除以m求平均的过程。再推广到多个特征向量x的代价函数计算方法。

通过上面两个代价函数的定义,有了用户相关参数w和b的代价函数和特征向量x的代价函数,可以使用协同过滤将w,b和x的代价函数整合成一个代价函数。

协同过滤的梯度下降和早些课程里面介绍的一样。这里因为有三个参数,所以更新参数的过程也成了三步。

Binary labels —— favs, likes and clicks

如果用户对于电影的评价不是一个分数,而是喜欢或者不喜欢。1表示喜欢,0表示不喜欢,?表示为评价。这样系统的目标自然就变成了预测?是0还是1。

很明显这是一个二分类问题。所以这里的模型自然就成了logistic回归的模型。

因为之前说过了线性回归的代价函数的由来,之前也说过logistic回归的损失函数和代价函数,结合上面说的,就可以得到损失和代价函数的计算方法,具体就不展开说了。

均值归一化

然后如果遇到有用户没有对任何一部电影评价的情况。

将该用户的y值都写成0虽然可以加快学习速度,但是并不利于模型性能的提升。

均值归一化,先算用户数据矩阵每一个行的平均,然后矩阵中所有数据都减去μ。

所以计算用户j对电影i的评价预测时要加上μ(因为之前减了μ)。

这时候我们计算这个没有做任何评价用户的预测值时发现,因为该用户没有做任何评价,所以下图红框中的式子就是0,然后加上μ,就直接预测该用户会打一个平均值μ才是合理的。

协同过滤的TensorFlow实现

然后是协同过滤的TensorFlow的实现,我们可以用如下代码自定义训练循环:

w = tf.Variable(3.0) # 要优化的参数
x = 1.0
y = 1.0
alpha = 0.01

iterations = 30
for iter in range(iterations):
    with tf.GradientTape() as tape:
        fwb = w * x
        costJ = (fwb - y) ** 2 # 代价函数
    
    [dJdw] = tape.gradient(costJ, [w]) # 梯度(计算导数)
    
    w.assign_add(-alpha * dJdw) # 赋值

然后是对应这里的梯度下降算法:

optimizer = keras.optimizers.Adam(learning_rate=1e-1)

iterations = 200
for iter in range(iterations):
    with tf.GradientTape() as tape:
        cost_value = cofiCostFuncV(x, w, b, Ynorm, R, num_users, num_movies, lambda)
        
        grads = tape.gradient(cost_value, [x, w, b])
        
        optimizer.apply_gradients(zip(grads, [x, w, b]))

查找相关算法

查找相关算法和之前介绍的聚类有些类似,或者说就是聚类的一个应用。

查找就是找一个与x(i)相近的x(k)。找最小距离的一个向量。

最后是协同过滤的局限性相关:

一个是冷启动的问题,就是如何对用户打分少的项目排名?还有如何向新用户展示合理内容?

常见的做法是使用项目或者用户的侧面信息。

对于项目来说就是根据类型、电影明星、工作室等等。

用户来说就是人口统计(年龄、性别、住址)、表达偏好等等。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇