argszero.github.io

Created: 2014-05-19 09:46
Updated: 2014-05-21 08:31

README.md

白话机器学习

为什么要写这个呢?因为:

  1. 领导要求掌握机器学习
  2. 我只听得懂白话
  3. 目前没有白话讲机器学习的书
  4. 领导要求不止要学会,还要大家用起来,用好
  5. 我只会说白话

罗嗦不?白话嘛,讲究的就是罗嗦

协同过滤

为什么开始就选择协同过滤呢?很简单,我们现在最有可能用到的就是协同过滤。我们的场景如下:

  1. 我们有所有用户,访问、收藏、购买过哪些商品的信息 表: 用户电商基础日志(用户标识,动作[浏览|收藏|购买],商品标识,次数,日期) user_action_logs(user_id,action,itemId,count,date)
  2. 我们希望给不同的用户,尽可能的推荐他感兴趣的商品广告

协同过滤算是一个黑话。所谓黑话就是,说的人很爽,听的人很郁闷。啥叫协同过滤呢?协同过滤的英文为Collaborative Filtering。 先说过滤,所谓过滤,就是把不感兴趣的滤掉,剩下的就是感兴趣的,即推荐的内容。再说协同,所谓协同,就是说大家一起的意思,也就是根据跟你相似的其他所有人的口味,来给你推荐的意思。所以说,协同过滤其实就是朋友推荐。当然啦,白话归白话,行业规矩还是要遵守的,所以我们下面还是使用协同过滤这个词。

照理说下面该研究协同过滤的原理了,不过这玩意儿长什么样子都不知道,就开始分析原理,太违背白话精神了。所以呢,先跑起来,接触接触,然后再深入研究。

mahout上搞协同过滤

我们准备采用mahout,搞一下这个协同过滤。为什么选择mahout呢?

  1. 数据量大,一个机器搞不定,需要并行计算
  2. 外行比较容易上手mahout
  3. mahout也正在往spark平台迁移
  4. 我们有现成的yarn集群,即可以跑hadoop,也可以跑spark

当然,后面还会在spark之上的mllib上再搞一遍来比照

1. 预处理数据

为了适应各种模型、各种场景下的协同过滤需求,mahout对协同过滤的输入数据做了标准化抽象: (用户(userId)、商品(itemId)、评分(Preference))。我们的数据里包含了用户、商品,但没有评分。怎么搞呢?理想情况下,这个评分大约为(浏览的次数×浏览的权重+收藏的次数×收藏的权重+购买的次数×购买的权重)×时间衰减函数。因为用户不同的动作,体现出用户对这个商品的喜爱程度是不同的,所以需要使用不同的权重来打分。另外,时间的影响也是很大的,越是最近的购买,越能反映出用户的喜好。

难题出来了,有两个东西很难确定:

  1. 不同动作的权重
  2. 时间衰减函数

这两个东西,肯定会影响我们的推荐结果的。有两种方法确定这两个东西:

  1. 训练:根据现有的数据,采用适当的算法做训练。
  2. 拍脑袋

本着解决主要矛盾,忽略次要矛盾的原则,我们采用第二种方法,即拍脑袋决定:

  • 浏览的权重:1
  • 收藏的权重:2
  • 购买的权重:3
  • 时间衰减函数:f(x)=k/k+x ,其中(k=5)
  • 即评分=![(浏览的次数×1+收藏的次数×2+购买的次数3)5/(5+(当前日期-数据日期))](http://latex.codecogs.com/png.latex?\\frac{(viewCount + favoriteCount2 + payCount*3)*5}{5+(now - dataDate)})
Cookies help us deliver our services. By using our services, you agree to our use of cookies Learn more