小白理解的机器学习

机器学习给大多数人的感觉就是3个字:”高大上”。

我看到的大多数关于机器学习的博客,读起来要么是说了等于没说(太笼统),要么是逼格极高(太细节),始终没有找到高屋建瓴,直击本质的好文章(我个人特别喜欢追求问题本质,即渴望解决20%的核心问题 or 疑惑)。

不过在好奇心的驱动下,我还是找到了做机器学习的同事,以推荐系统为例把我的疑惑问了个遍,答案让我豁然开朗。

在同事推荐下,快速扫完了一本推荐的入门书籍,结合之前我自己对机器学习懵懵懂懂的认识,对机器学习有了更贴近本质的认识,也更容易给大家讲明白。

先搞明白机器学习在干嘛

实际工作中的用到的机器学习,大多都是在做“预测未知”

我们世界杯赌球买彩票,顶多叫”猜测”,”瞎蒙”,而赌场的精算师则是在做”预测”。

为何精算师预测的准呢?他们会利用大量掌握的数据(控制比赛不算),分析已知

算法

机器学习就是各式各样的算法,这些算法都在做同样的事情:”根据已知,预测未知”。

所以,无论你听到任何高大上的算法缩写(LC、SVC、NBC、KNC、DTC、RFC、LR、SVR、DTR、RFR…),把它们先当作黑盒即可,不会影响我们理解机器学习自身。

输入与输出

机器学习有各式各样开源的算法黑盒,现在问题就是给你这些黑盒,你也不知道怎么拿来”预测”,以及”预测什么”。

问题就是,我们首先要知道机器学习算法的input和output是什么,这样我们才知道怎么应用这些便捷的黑盒。

机器学习要分2个阶段使用,首先是训练阶段。

第1个阶段,机器学习的input是”已知”数据,我们称为”训练数据”:

  • (小明,男,学生,每月支出500) -> 单身
  • (小红,女,职员,每月支出5000) -> 单身
  • (小李,男,职员,每月支出300) -> 已婚
  • (小王,男,职员,每月支出4000)-> 单身

左侧称为”特征向量”,右侧称为”目标”。

该阶段的output叫做模型(model),是算法基于各种复杂数学计算,得到的一个文件,它可以拿来做”预测”。

第2个阶段,我们继续用算法黑盒加载model,对外号称”算命师父”。

只要你告诉我下面3个信息:

  • 是男 or 是女?
  • 是学生 or 是职员?
  • 每月支出?

算法黑盒就能”预测”你是单身狗还是已婚青年,但是一定要注意算法的预测结果并不是说1不2的,即结果是基于概率的判定:

你是”单身”的概率是80%,你是”已婚”的概率是40%,所以判定你是”单身”。

然后呢?

好的,对于小白来说,机器学习就是这样一个黑盒,大概5,6行代码就可以拿来预测了。

但是,即便懂了这么浅显的道理,我们依旧过不好这一生。

所以,下面我需要用稍微专业一些的知识结构和介绍,让大家建立更加具体的认识,并告诉大家推荐系统的实现机制是什么。

复杂算法简单讲

算法模型

大方向上,分为监督学习与非监督学习。

监督就是上面的例子,要提供标注好的训练数据 “特征(是男是女…)+目标(单身,已婚”),是我们工作中常用的一类。

非监督,只需要特征,不需要标注目标,也有自己的应用场景。

监督学习

主要分为2类算法,分类(Classifiers)与回归(Regression)。

分类

之前的例子属于分类算法,我们输入特征向量,模型预测每种分类的概率。

在机器学习中,”目标”和”特征”大多数情况是离散的值,比如:男、女,已婚、单身。

回归

回归呢,用来预测连续值,比如我们把之前例子中的”目标”换成”年收入”:

  • (小李,男,职员,每月支出300) -> 10万
  • (小王,男,职员,每月支出4000)-> 40万

那么,这时候就选择回归算法,它可以直接预测出某个人的年薪。

非监督学习

主要分2类算法,聚类与特征降维。

聚类

还是以之前的例子来说,我们把目标”已婚”、”单身”删除掉,仅保留”特征矩阵”,作为input直接丢给聚类算法训练,那么会得到什么呢?

会发现特征相似的人,会被算法聚簇到一起,最终会得到几个簇,每一簇内有一些人,它们是类似的人,这就是聚类算法的功能,很容易拿来分析人群的相似性,相同簇内的用户可能兴趣爱好相近,貌似可以拿来用到推荐场景~

特征降维

特征降维是什么意思呢?意思就是,假设我们的业务很复杂,描述一个用户的特征有很多很多,这就导致算法计算会比较慢,其实很多特征是用户区分度不大的,有点浪费。

降维就是用一个前置的黑盒算法,帮我们在训练数据里进行一波分析与运算,把一个列数很多的特征矩阵,转换为一个列数很少的特征矩阵。

特征降维算法的厉害之处在于,经过转换后并不会对后续的机器学习算法产生太多影响,”预测”依旧相当准确。

算法工程化

特征抽取

我常听见”特征工程”这个词,可能差不多吧。

业务数据一般都是原始日志或者业务表里的各种字段,我们需要转换成”特征矩阵”。

特征矩阵的每一列代表什么含义,都需要我们自己定义,因为它们与业务以及我们应用机器学习的目标直接相关。

因为机器学习算法是根据特征矩阵的各个列综合计算的,所以但凡我们觉得对预测有用的信息,都应该放到特征矩阵里。

但是大多数业务字段又不能直接放进特征矩阵,因为机器学习是数学运算,大多数机器学习算法需要的都是数字,而不是文本。

下面举3个例子,都是特征抽取的典型场景。

  1. 用户最近对某个品类的热爱程度,是需要你基于用户的访问历史进行挖掘计算的。
  2. 用户的收入有年薪10万的、500万的、1000万的,如果直接把收入数字当作特征的一列,对于统计数学角度来说,500万和1000万在数字上差别很大,但是在业务角度他俩都是土豪用户,因此应该做离散化(比如>100万的是土豪,<100万的是中产),或者归一化(对收入取对数,缩小到一个很小的数字区间)处理。
  3. 基于文本的机器学习,比如做垃圾邮件识别常用的贝叶斯机器学习算法,input就是一大堆标记过的邮件文本,该怎么转换成特征向量?一般就是每个邮件先做分词,得到所有词组后作为特征矩阵的维度,之后对每一封邮件计算特征向量,通常就是统计邮件中对应词组出现的次数作为列值,高级的还有用TF/IDF作为列值。

可见,根据业务需要,确定特征矩阵有哪些特征,以及每个特征的值怎么计算而来,是首先要做的事情。

特征筛选

当然,特征不是越多越好,因为特征越多计算量越大。

除了人工来精简特征外,机器学习也有黑盒算法,帮我们分析哪些特征区分效果好,哪些特征垃圾会干扰算法准确度。

最终,特征筛选黑盒会帮我们删掉很多无用的特征(我们天真的觉得有用,实际没用),保留重要的特征,让我们的特征工程更科学。

注意,这和特征降维是两码事,特征降维不仅仅是减少特征个数,而且是对特征做了组合计算,降维后的矩阵已经没有了原先的特征对应关系。

缺省值

若特征矩阵缺少某列,可以利用样本均值或者默认值的方式填坑,即缺省特征值。

欠拟合与过拟合

拟合是指基于训练集学习的模型,对训练集自身的预测准确率。

当我们选择一个复杂度一般的算法黑盒时,可能模型对训练集的准确度一般,称为欠拟合。

当我们换一个复杂度更高的算法黑盒时,会得到更准确的拟合,也就是基本可以正确预测训练集自身。但是注意,对训练集准确,不意味着对未知的输入预测准确,这种反例就叫做过拟合。

过拟合的模型,对未知数据的预测准确度低,也称为泛化能力差。

正则化

因为我们追求更好的拟合,但是又容易过拟合,所以需要平衡。

复杂模型能够支持”范数正则化”,可以理解成优化过的复杂算法黑盒,可以打压过拟合问题,既可以得到更好的预测准确率,又不会导致模型泛化差。

模型校验

为了验证模型的准确性,需要科学验证。

方法就是把标注过的训练数据,切一部分出来作为训练集,剩余的作为验证集。

算法基于训练集计算模型,然后将验证集的特征作为模型输入预测结果,与验证集的目标比对。

标注过的数据可以按多种方式切分成2份,每种切分方式都可以执行一轮训练与验证,这个称为交叉验证,可以更客观的评估模型效果。

验证函数会输出算法的得分,召回率,准确率等统计信息,具体怎么算的就不说了,总之就是说明这个算法预测到底有多准,也间接反馈了你的特征准备的到底好不好。

超参数搜索

OK,如果我们决定了特征,决定了算法,并且模型验证准确率还行。

那么接下来,我们就得来一波调参了,碰碰运气能不能提升模型的预测准确率。

算法一般都可以调好几个参数,那么多参数值互相组合,我们手动去试就太困难了。

好在黑盒会提供给我们自动化的调参能力,我们只需要给出标注好的数据、算法、每一种参数的枚举值,那么黑盒就会帮我们组合各种参数的枚举值,完成多次的模型训练和验证,最后告诉我们哪一种参数组合是最有效的。

这里面常见的是网格搜索,也就是黑盒帮我们枚举各种参数组合,真正的去跑,去验证。

最近都在谈这些

XGboost集成学习模型

2015年某大神发明,对我们而言仍旧是一个黑盒,但是内部实现是创新过的,是一个预测准确率很高的模型。

Tensorflow框架

2015年谷歌发明,是一个给机器学习做的分布式计算框架。

里面提供了很多机器学习的算法黑盒,开发者像写单机机器学习一样开发代码,但是计算被调度在tensorflow集群里进行,有点类似于spark的开发感觉。

python最著名的单机机器学习黑盒scikit-learn库在tensorflow上也有对应实现,开发起来没有太大区别,但是计算已经分布式完成。

tensorflow最著名的是深度学习等高级算法,本质做的事情还是训练模型。

推荐算法

推荐算法这里特指”千人千面”,类似于淘宝首页给用户推荐商品,今日头条给用户推荐文章,不是指猜你喜欢等基于协同过滤的场景。

下面记录一下基本实现思路。

用户画像

我们经常听到用户画像,基本上就是给每个用户打标签:

男,帅,有钱,爱体育,爱音乐。

用户对各个品类的爱好作为多个特征存在,随着用户使用网站逐渐积累行为日志,通过离线计算挖掘出用户对不同品类的喜好程度,作为特征值存储到用户画像里。

推荐算法选取哪些画像属性作为特征参与到推荐模型的训练中,还需要我们根据具体业务需求决定。

商品画像

商品也需要画像,一般就是商品的一些自身属性居多。

比如:耐克品牌、体育分类、价格中等,点赞100次,评论50次。

其实商品的特征就可以定为:品牌,分类,价格,点赞次数,评论次数。

对于点赞次数和评论次数等,因为不同文章差距比较大,不同特征之间的量级不同,应该做归一化处理(比如取对数)。

总之,特征工程在预处理特征时有很多技巧,包括归一化、离散化、缺省值(比如没有点赞过就记为0),对于预测效果和模型训练速度都有影响。

怎么推荐

假设A用户访问网站,我们先获取A的画像,组成用户特征矩阵(性别、长相、收入、爱好体育、爱好音乐…)。

为了推荐商品,我们最简单粗暴的就是遍历所有商品(或者近期商品),计算一下用户与每一个商品之间的关联程度。

但是怎么算呢?用户特征矩阵和商品特征都不同,直接计算余弦距离等方法是无法使用的。

训练推荐模型

按照机器学习的套路,我们需要先训练模型,才能完成预测。

假设A用户曾经访问过B商品,我们可以取A的特征矩阵与B的特征矩阵,首尾拼接得到特征矩阵C。

我们将(C,感兴趣)加入到待训练数据集合中。

当我们收集了大量训练数据后,直接丢给算法黑盒算模型,作为线上推荐算法的依据。

完成推荐

现在有了模型,该怎么使用呢?

我们拿着用户A的特征矩阵,遍历每个商品,将商品的特征矩阵拼接到A之后得到特征矩阵D。

将D作为模型的输入,就可以预测出A用户对该商品的感兴趣概率。

我们计算完所有商品的感兴趣概率后,就可以返回概率最高的TOP N个商品。

实际工程中,需要考虑先在海量候选池里按照业务规则召回1000或者10000级别的商品,即先缩小计算规模,然后再做模型预测,大概思路就是这样的。

如何实现类似今日头条的推荐去重,其原理又是什么?麻烦懂的同学留言指点,多谢。

 

 

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~