软姐之机器学习讲义

转自池建强老师的公众号文章,原网站如下:
http://mp.weixin.qq.com/s?__biz=MjM5ODQ2MDIyMA==&mid=401277768&idx=1&sn=a6b13c3ce5a6b82fcc0d182af85c55bb&scene=0#wechat_redirect
软姐之机器学习讲义_第1张图片
年关将近,又到一年总结时。丁香园的冯老师已经开始挖空心思预测2016年的互联网了,这个事冯老做了很多年,在不远的未来也看不出他停止预测的步伐。如果他老人家坚持预测了几十年,你们觉得会发生什么?我觉着,肯定是他累积预测错误越来越多了呗。

不知道大家开始总结没有,反正我们团队的阿毛已经开始了,他是这么写的:忙活了一年,梦想近了还是远了?远了。年初制定的计划都实施了吗?没有。bug 改完了吗?没有。数据修完了吗?没有。

我的回复是:饭你少吃一口了吗?他的回答是:没有。于是总结被打回重写了。供参考。

2015对我来说是非常重要的一年,我找到了十五年前在洪恩的那种感觉,战火纷飞中,人也变年轻了,这一年,差不多可以写部小说。邻近年底,又发生了几件不大不小的事。羽毛球活动彻底恢复了,吸引了一大票热爱运动的同事,大冷天也打得热火朝天。新书《MacTalk·跨越边界》上市了,责编杨海玲老师说,势头和反馈都不错,感谢大家的捧场。我对这本书没有任何预期,如果它的销售量竟然超过10万,可能会有一点惊喜,其他的就随缘吧。「攻城狮之路」的收费群也是这个月建的,依着我不愿张罗事的性子,是不会去做这件事的。不过笑来老师说,尝试,才能重生,于是就有了这个群,目前已经440人了,月底之前招满500人,会先停一下,想清楚了,再往前走。

12月最重要的事,我们的新产品就要发布了,准确的时间请关注官方消息。效果图我看了,帅。新产品我用了,美。2015,锤子科技收官之战,希望大家喜欢。

今天的正文来自「攻城狮之路」群的第一次语音分享:「软姐之机器学习」(文字版)。作者是硅谷女博士朱赟,毕业于科大少年班和美国莱斯大学,现在 Airbnb 任职。集美貌与智慧于一身,并世无双,请欣赏:
软姐之机器学习讲义_第2张图片

内容比较多,分两次又不合适,建议保存到电脑阅读。
群内的分享不会每次都发在 MacTalk,如果你不想错过太多……

池哥让我分享下机器学习,开始的时候我的内心是拒绝的。原因有两个。一是这个领域的水实在是太深了,不仅是我,很多比我在这个领域倒腾更久的人都不敢称自己是专家,而我只是读博士期间在对生物信息做数据分析时有所涉猎,当时研究学习了一把。二是我认识的人里面很多都是比我在机器学习这一块道行要深得多得多,想到他们看到我分享这个,估计肯定会觉得我有点不自量力了。

想着就觉得难为情。

可是为什么还是决定做这个分享呢?还是这两个同样的原因。这个领域的水很深,潜的比我深的人也大有人在,但是毕竟在莱斯的时候也是正规的学习过,所以基本的理论和常识以及一定的实践经验还是有的。第二呢,正是因为我周围有很多高手,我也有机会或多或少接触更多相关的问题和讨论,有不懂不明白的,可以随时向他们请教。这次为了做这个分享,也是跟周围的同事们讨教了很多。于是就鼓着勇气班门弄斧、贻笑大方一次。我没法细讲机器学习的技术和理论,只能大概就我了解的,说一下机器学习在 Square 以及 Airbnb 的应用。

机器学习的应用面很广,几乎应用在所有跟人工智能沾边的领域,换句话说,就是可以帮助人做决定或是识别一些有用的信息。常见一点的例子,比如电脑里面的棋类游戏的对弈决策,无人驾驶飞机或汽车的控制程序,手机的语音识别和手写识别,Google 百度的搜索引擎等等,都可以用到机器学习。机器学习大致可以分成三类,监督学习,无监督学习,和增强学习。

软姐之机器学习讲义_第3张图片

今天主要就讲讲监督学习。它的一个比较严格的书面定义是:

监督学习(supervised learning)从给定的训练数据集(training set)中学习出一个函数,当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求是包括输入和输出,也可以说是特征(feature)和目标(target)。训练集中的目标是由人标注的。

举个简单的例子。假如你知道一些房子,每个房子的大小和房价,这里房子大小就是特征,是输入,房价是目标,是输出。那么,你可以根据这些已知的房子大小和房价,学习出一个函数,然后可以用这个函数预测一个新的房子的房价,如果已知它的大小特征。

在实际工作中,特征和目标都可能更复杂,特征通常不是单一特征,而是很多特征。举个 Square 支付的例子。顺便提一下,我进 Airbnb 之前在 Square 工作了两年, Square 是美国的一家移动支付公司,主要产品是一个移动信用卡读卡器,可以配合智能手机或者平板电脑使用,在任何网络状态下,甚至某些无网状态下,让商家安全方便的接受消费者的信用卡支付。这一技术大大的降低了刷卡消费支付的技术门槛和硬件需求。 Square 后期也有很多新的产品,如小商户提供贷款,帮他们提供网上商店的网站等等等等。

就说 Square 的读卡器吧,该产品是一个四四方方的小方块插到手机的耳机输出口后,在手机上装一个 app 并且设置好你的收钱银行账户,别人就可以用信用卡在读卡器上刷卡给你付钱。这对一些需要收信用卡的小商贩如出租车司机,小商贩老板等是非常有用的。对于每一笔信用卡交易, Square 收取顾客的信用卡支付确认后24小时后将把这笔钱转到商家的银行账户。而 Square 实际收到信用卡公司的这笔钱却是一个月之后甚至更久。所以一笔成功的交易,现金流是 Square 先给钱给商家,然后信用卡公司一段时间后转钱给 Square 。假如有一个顾客的信用卡其实是偷来的或者有别的问题,那么如果 Square 接受了这笔信用卡交易,并且付钱给了商家,但是后来信用卡公司又以正当理由拒付这笔钱,那么 Square 就要承担这笔交易的损失。所以,当一笔交易发生时, Square 需要决定是不是应该接受一笔交易。那么这个决定是怎么做的呢?用的就是机器学习的技术。每一笔信用卡交易有很多 feature(特征),比如,这张卡的国家,哪个银行发的卡,这张卡有没有在 Square 有交易记录,记录如何,这张卡的持卡人有没有交易记录,有没有别的卡也是这个持卡人,都有什么记录,等等。 Square 积累了很多的交易记录,以及每笔交易的最后有没有从信用卡公司收到钱。那么训练集所有的这些交易记录,每笔记录的输入就是该笔交易的特征,输出是该笔交易是不是欺诈。我们希望通过学习这个训练集,找到一个函数,这样当 Square 有了一笔新的交易的时候,就能够比较可靠的预测这笔交易最后会不会成功收到钱,是不是欺诈。

软姐之机器学习讲义_第4张图片

那么机器学习到底是怎么来做这些事呢?机器学习的理论涉及到很多门学科,如概率论、统计学、逼近论、凸分析、计算复杂性理论等。在学术界,研究机器学习的人就是把各种各样的问题抽象成一个机器学习的问题,也就是:从给定的训练数据集中学习出一个函数,当新的数据到来时,可以根据这个函数预测结果。目标就是让这个预测结果越准确越好。具体的机器学习的算法很多,通过回归分析和统计分类来构造条件概率,如人工神经网络,各种决策树等等。每个算法,当训练集满足一定的条件,预测的误差都是可以量化的控制在某一个范围的。

既然学术界已经有了这些算法,那么实际工作中,又需要一些怎样的机器学习的的技能呢?首先,对已有的机器学习的算法有个比较全面的了解,知道哪一类问题可以使用的算法有哪些,每个算法的理论是什么,有什么优缺点。这个算法被用到一个特定的问题上时,需要你的训练集达到什么样的条件,比如,已有信用卡记录有多少,概括了多少种情况。而对于你现有的训练集,预测的误差从理论上来讲可以保证控制到什么范围。有了对算法的基本把握,才有可能在实践中把合适的工具用到合适的问题上。

然后,针对具体的问题,如何界定训练集以及他的的输入和输出。对于训练集里面的每个输入,也就是每个输入我们关心哪些特征,怎样把这些特征从实际数据中抽象出来,并合理的表示。并不是考虑的特征越多越有效,为什么呢?一是特征的个数,也称维数,特征维数越高,需要用的算法模型就会越复杂,这样很容易产生机器学习中称为过度拟合的问题,尤其是数据集不够大的情况。简单的说,过度拟合就是训练出的函数对于训练集匹配的很好。但是对新数据的预测往往偏差反而大。所以特征维数高的第二个问题就是对训练集的大小的要求也会变得很高。这样,如果不断增大训练级,就会带来第三个问题,也就是训练,测试,和存储的开销都会变得很大。因此,我们希望从实际的特征中进行选择,尽量以最小的特征集来完成机器学习。那么怎样筛选界定不同的特征,需要一定的经验,也需要实践中不停的尝试和调整。另一方面,现实中,目标函数,也就是要预测的东西,也不是一定就很一目了然的。比如信用卡诈骗。预计过于保守,虽然能保证单笔交易的损失减少,但是,拒绝了一个实际上非诈骗的交易,对产品长期的使用率和用户体验也是有很大的负面影响的。

此外,数据集本身也是很容易有一些问题的。举两个例子。用信用卡交易从他的特征区分是不是成功的交易还是诈骗交易。我们称所有结果是成功的交易叫做正样本,所有结果是诈骗的交易为负样本。那么经常遇到的一个问题就叫做数据不平衡问题。从名字就不难看出,比如你的训练数据正样本很少负样本很多,那么直接拿来训练很容易有偏差,如何处理这个情况?还有,如果数据集中有一些异常值,他们的存在会可能是训练中的噪音,可是如果完全剔除,又可能减少了模型的实际覆盖度,这种情况应该怎么处理等等。

最后,训练集不是静态的,每天可能都有新的数据产生,需要相应的更新你学习出的函数,这样对新数据的目标预测才能相对保持更新。怎样保证训练集被有效的用到你所选用的算法模型中呢?这个通常被称为建立数据管道(build data pipeline)。这里面根据不同的应用会有很多不同的技术问题。举几个例子。首先,怎样,收集以及保存这些数据。这就可能牵涉到一些大数据相关的技术。通常需要 Hive 相关的支持,完全是一个独立的大主题。(顺便说一句,Hive 是基于 Hadoop 的一个数据仓库工具,它用 MapReduce 的方式来处理类似数据库的结构化存储和 sql 查询。)然后,输入集可能是有很多 noise 和 bias 的(干扰数据和误导数据)怎样有效的对输入集进行预处理和筛选,这是根据不同的应用,可能需要大量的工程师资源来做的事。而且,这些输入的特征有些并不是可以很直观的用数字来表示的,怎样抽象出这些特征,怎样量化,也是需要一个决策-实践-调整的过程的。

下面再说说机器学习在 Airbnb 的应用吧。 Airbnb 是一个房屋短租的网络平台。房主可以把房子放到 Airbnb 上出租,然后住客可以通过 Airbnb 租房子。 Airbnb 有很多地方用到机器学习,大致有三处:

一是用在对用户风险和安全的预测上,这样我们可以有效的冻结一些用户在我们网络平台上的违规操作。
二是 Airbnb 的搜索引擎,机器学习让搜索结果最大程度可能是用户感兴趣的租房,这样可以增加用户租房的频率。
三是 Airbnb 通过已有租房的各种参数,如大小,地理位置,季节等以及相应的租房历史,就可以通过机器学习试图预计一个最佳的定价范围。

重点说一下第三个吧。现在假设你有一个房子,你想把它放到 Airbnb 上出租,那么你会觉得定价多少合适呢?多少才会让你最大可能的既能租出去,又能赚到钱呢?哪些因素会影响你定价的决定呢?

首先,房子的硬件条件,包括路段,房子大小,房子的新旧状况,装潢装饰的档次,布局的方便性,也就是,你对房子的投入算到每一天,你觉得多少合适。
其次,如果你是第一次在 Airbnb 上出租,你可能会想,我周围和我差不多的房子收多少钱呢?你会拿那个做个参照,尽量不要比平均价落差太多。
第三,这里是不是旅游热点,可能入住的人多不多?周围可选的宾馆有多少,也就是房子如果出租的供需大概是在什么一个情况。当然,除了这些,还有一些动态的定价调整。比如,如果最近房子周围有个什么球赛或者演唱会,你知道最近会有突然增多的需求,那么适当上调肯定是必须的。

另外,随着你出租慢慢有了一些日子,通过过去的这个房子的入住率,房客的反馈意见,等等,你也可以适当的调整你的定价。

这样看来,定价这件事,既是需要很多因素的综合考虑,又是含有一些主观的直觉和经验的成分。如果 Airbnb 想提供一个工具能对房主定价提供建议,那么,这个软件工具需要做到上面提到的类似的各种考虑。一个确定性算法(deterministic)通常是无法很好的处理这种多维的随机的预测的。机器学习在这个问题上是一个很自然被应用的技术。 Airbnb 在2015年六月开源/发布了一个基于于机器学习的一个工具包,帮助解决这样的定价预测的问题。这个工具包叫做 Aerosolve 。

Aerosolve 有些什么样的特点呢?首先, Airbnb 提供定价建议比房主自己去做这件事的最大优势,就是我们有着多年的实际数据记录了不同房子不同定价的入住情况。这是一个很大量的数据源,也是我们做这件事的绝对优势。

每个房子,就包含着我们上边提到的人工定价需要考虑的各种特征(feature),那么,第一件事,就是怎样有效直观的把这些特征表达出来,并且可以更简单的去考虑每一个特征在对价格上可能有多大的影响。我们的房源,每个房子可能有几十甚至上百的特征属性,比如是否有独立浴室,是不是提供车库,在什么地段等等等等。Aerosolve 的一个最大的特点就是它对特征有着很方便的支持,它可以对特征进行逻辑分组,可以自动对特征进行上下文转换和存储,以使得这些特征既能很有效的来训练算法模型中的参数,又很容易被终端用户理解控制。这样在不断检查价格预测的效果时,我们可以有效的从训练模型中增加新的特征或者减去一些没用的,并且调整每个特征的权值。使房子特征可以更好的用来预测一个成功的定价。

第二,每个房子装修是不是好看,新旧程度,材料的档次,这些不是数据记录的,而是反映在大量的房间照片上,所以,Aerosolve 的另一个重要特点,就是它包括了一个图片内容分析器,可以对图片特征进行量化处理,也就是排序。

第三,我们说过,人工定价会考虑到如果你周围有房子在 Airbnb 上出租,会被作为一个参考,那么,怎么定义这个「周围」的概念呢?很显然,以绝对距离来作为是不是一个可以进行定价参照是不准确的,因为,打个比方,比如在巴黎,虽然在塞纳河两边的房子都不错,但仅仅相隔百米距离的公寓都会有非常大的价格差异。同样的情况在世界各个城市可能有着类似的甚至更为明显的问题。所以, Aerosolve 有一个对「微街区」动态界定的算法,通过该算法不断地调整我们 Aerosolve 的地图以反映街区边界的变化。这个街区不是一定与标准的街区边界相匹配,而是每个街区存在一些共同的局部特征,这些特征在影响定价上有着类似的效应。

第四, Aerosolve 不是给房主一个价格建议,而是三个价格范围,每个价格范围,对应一个可能被预订的概率。比如,对于2016年一月一号,定价90-100是一个绿色区,表示可能很容易租出去,定价100-120是一个黄色区,表示可能租出去,但是可能不是那么有保障,定价120-130是红色区,表示还是有可能有人租,但是没人租的风险也比较大。这样用户可以根据他想冒的风险,来决定当天的定价。第五,Areosolve在学习过程中,可以加入季节性或者特殊事件或者竞争的因素。比如,国庆或劳动节或元旦,是大家出游的旺季,如果你的房源在旅游景区,那么价格即使上调,租出去的可能性还是很大。

软姐之机器学习讲义_第5张图片

因为 Aerosolve 对特征的处理,如对特征的分组和图片的处理等可以用到除了定价以外的机器学习应用中,因此 Airbnb 开源发布了这一工具,有兴趣的人可以用它来了解机器学习中的特征和目标来训练一个函数大概是一个什么样的过程。

说到这里,我都没有对具体的算法进行展开。实际上,在实际应用中,其实很简单的算法和模型反而很有效而且广泛的被应用。最简单最著名的两个,可能一个是线性回归,一个是决策树。大家稍微搜索就能找到很多介绍。简单点说,线性回归就是试图用一个线型函数作为模型,通过训练集来调整这个函数的参数。决策树可以理解成根据特征来写 if else 语句,每个特征值都被离散化,层层 if else 的结果就是所有特征值决定的输出。线性回归种如果把每个特征的值都离散化,比如四舍五入成整数或者大于某个值作为1,小于这个值作为0这样二进制话,就称为逻辑回归。 Square 的risk用的是 random forest,是决策树的一个变种。 Airbnb 的 risk 用的是决策树,search 用的是 gradient boosting tree, 是回归的一个变种。 Aerosolve 用的就是逻辑回归,也就是离散化了的线性回归。

说到这里都是说的监督学习。通俗点说就是可以帮助人做一个决定。最后简单提一下无监督学习和增强学习。

那么什么是无监督学习呢?无监督学习与监督学习相比,训练集没有人为标注的结果。我在做生物信息学的数据分析时,用的其实是这一类。但是解释起来有太多生物学的比较生僻的概念,所以还是拿一个很有名的鸡尾酒会效应来打比方。当我们和朋友在一个鸡尾酒会或某个喧闹场所谈话时,尽管周边的噪音很大,我们还是可以听到朋友说的内容。因为我们的大脑可以帮我们识别出应该注意的声音,区分出背景声音。那么怎么样用算法来模拟人脑的这个功能呢?这种功能做成算法,有很多的应用,如,在生物信息的 DNA 里找到负责同一生物功能的 DNA 群,比如一个演唱会里又多个录音点,后期处理怎么从这多份录音里分析处理出想要的歌手的声音,比如图形图像处理里的人脸识别等等。这一类问题不像前面我们说的信用卡欺诈的识别那样对每个新输入做一个预测,而是从一个输入集里选择识别隐藏的有用的信息。常见的研究方法有聚类分析等。

最后是增强学习。这是很有意思的一种机器学习。增强学习通过观察来学习应该如何的动作。每个动作都会对环境有所影响,学习对象根据观察到的周围环境的反馈来做出判断。比如,无人机的驾驶。如果驾驶的不好,就会撞墙,也就是坏结果,如果保持不撞,就是好结果,它没有精确的输入/输出对,而是强调在未知领域的探索和对现有知识的遵从之间找到平衡。以取得最大化的预期利益。其灵感来源于心理学中的行为主义理论,即人或动物如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预测,产生能获得最大利益的习惯性行为。

当然,这些都是我对机器学习一些很肤浅的了解和认识。网上有很多资源,尤其是讲算法和理论的,有很多。如果你想更进一步的了解这个领域,可以花些功夫去学习。每一个应用的算法和实际问题都不一样。如果能找一个实际案例,从他的算法选择,特征参数选取调整,以及数据管道的建立等系统的感受一下,应该对机器学习的应用会有更深的体会。

倾听更多牛人线上分享,用支付宝扫描二维码加入「攻城狮之路」社群,年费1024。群介绍参考文章「三个原则」。加入请谨慎,静默期已过,加入不再退群退费,没时间折腾。

软姐之机器学习讲义_第6张图片

你可能感兴趣的:(机器学习,互联网,预测,机器学习)