搜索 | 会员  
机器学习从抬脚到趴倒在门槛
来源:    作者:大蕉  日期:2017-9-7  类别:大数据  主题:机器学习  编辑:Carey
机器学习就是根据已有特征,训练模型,然后根据模型来预测未知的数据。很多小伙伴一开始就会扎进去什么支持向量机、Logistic回归、LASSO啊、决策树啊这类算法里面,一下去就去非常深入去理解他

0x00 前言

好像一下子,进入了AI时代,很多小伙伴其实都很迷茫,自己现在该如何去做好准备,去迎接即将到来的All in AI。

所以就有了今天这篇文章啦。今天呢,跟大家分享分享目前机器学习的历程吧,我到现在都没觉得我入门了机器学习,所以也没有什么所谓的经验啊,成功实践啊,没有,都是体验。


0x01 甩三句总结

首先甩三句始终相信的话。

不要为了机器学习而机器学习。

机器学习只有洞悉来自业务的需要,配合业务落地,才能发挥作用,单纯的机器学习没什么用。

python大法好,用2.7。

业界的前沿机器学习基本都是只支持python和C++,行业标准,就用python。

大数据下还是Spark更实用。

在现有大数据的环境下,落地最实用,场景最多的,还是Spark。


0x02 开眼界

脚抬起了3cm。目标:开眼界。

该怎么去下手?

首先从比较宏观的角度,全面了解机器学习的全貌。看看机器学习能做些什么,能解决什么问题,是什么样的套路。

机器学习就是根据已有特征,训练模型,然后根据模型来预测未知的数据。

很多小伙伴一开始就会扎进去什么支持向量机、Logistic回归、LASSO啊、决策树啊这类算法里面,一下去就去非常深入去理解他们的原理,个人认为这种切入方式是有一点问题的,如果仅仅是为了学习一下这些算法,那还行。长远来说,还是要现有大局观。

《图解机器学习》

《集体智慧编程》

《机器学习》周志华

《统计学习方法》李航

这四本书我都买了,循序渐进。

第一本呢,是通俗易懂的机器学习算法图解,作为趣味性入门来说非常好。

第二本是当前机器学习能做些什么事情,以及python怎么实现这些机器学习算法,代码狂人可以在这里面找到一些成就感,推荐先快速翻一遍,再回头,重新一章一章看,一行代码一行代码打,有时候不知道它啥意思也不要紧,打出来跑跑看。

第三本是比较系统地说机器学习的过程,以及每个算法比较严格的数学推导过程,非常严谨,数学要求较高,数学不太好的可以暂时不买,买了也看不懂。

第四本呢,是经典的的机器学习的学习宝典

嘛,也不用四本都买,看不完。小伙伴要是急呢,其实把第一本看了也就行了,眼界也算是开了,只是手头一点米可以下锅都没有而已····


如果对于深度学习有兴趣的小伙伴,可以看看下面这个书,是现在最权威的深度学习的书籍,没有之一,官方已经出了中文版,英文可以的小伙伴还是买英文原版吧。非常详细地说明了机器学习与深度学习的关系,以及深度学习的学习路径。

《DEEP LEARNING》《深度学习》Ian,Goodfellow

image.png

0x03 算法原理


脚抬了5cm了。目标:了解算法。

这个阶段,可以把所有的算法原理都开始看了,主要的书是上面的《机器学习》。如果英语够好的话呢,在coursera上学学Andrew NG的机器学习公开课。如果英语不好的话呢,可以试试邹博老师的《机器学习实战》,中文解释来说还是非常不错的入门教程。

当然,师傅领进门,修行在个人。

教程和书再好都没有用,还是需要你花时间,慢慢慢慢地,去一点点理解透每个算法背后的原理,以及各种各样的优化方法是怎么发生的。

举例线性回归可以这样进阶地去学习:

第一步:纯线性回归。什么是最小二乘法,损失函数怎么求。

第二步:核函数。什么叫多项线性回归,什么叫高斯核线性回归。

第三步:正则化。什么叫正则化,正则化的目的是什么?L0、L1、L2正则各代表什么东西。LASSO,岭回归,ElasticNet都是什么。

第五步:优化方法。如何选择优化方法?随机梯度下降,牛顿法都是些什么?

第四步:广义线性模型。广义线性模型把什么东西涵盖起来了,是怎么抽象怎么推导的?

大概就这样,一点一点去深入,不用一次性把所有的模型都学完。但是个人建议,线性回归,Logistic回归,决策树这三个必须必须完完整整先看完。毕竟很好理解又很好用,太难的臣妾真的做不到啊!!!逃避可耻但有用吖。

0x04 框架应用

脚抬了6cm了。目标:利用成熟框架。

这个阶段呢,就没什么好的书介绍了,使用scikit-learn,libsvm,xgboost去解决前面集体智慧编程里面介绍的一些数据集以及算法吧~会发现超级简单,而且还特么比自己实现的快很多勒。
即使你数学基础很差,即使你编程能力不是很好,但是你依然可以借助框架的力量,去完成你想完成的事情,遇到事情多查一下scikit-learn的官方文档。来来来,大蕉跟你说,怎么利用框架来打造自己的机器学习铠甲。
没有数据集训练模型?大丈夫。scikie-learn为我们准备了sklearn.dataset的数据集套餐。
线性模型比如线性回归、逻辑回归、LASSO、岭回归、ElasticNet不会自己实现?大丈夫。scikie-learn为我们准备sklearn.linear_model进行线性模型训练的套餐
数据预处理太麻烦不会写程序?大丈夫。scikie-learn为我们准备sklearn.preprossing特征预处理套餐。
决策树实现起来太麻烦?太多细节要考虑?
大丈夫。scikie-learn为我们准备了sklearn.tree 进行决策树训练的套餐。
集成方法太难写了?总是写不出推导公式?大丈夫。scikie-learn为我们准备了sklearn.ensemble进行集成方法比如AdaBoost、XGBoost、随机森林、GBDT等进行训练的超级大套餐。


好了就差调参了。


如果你知道哪个模型怎么调参,再Google一下调参技巧,成为机器学习大师的日子就不远了,嗯。


0x05 深度学习初探


脚抬了6.5cm了。目标:开始接触神经网络。

把Tensorflow官网的demo看懂,打一遍。一层一层拨开,看看RNN(循环神经网络) ,CNN (卷积神经网络) ,GAN(对抗生成网络)  这些现在非常流行的神经网络结构的原理是怎么样的,深度学习目前来说离不开这三兄弟。如果还是看不懂呢,可以搜索一下莫凡Tensorflow,蛮入门的,但也仅仅是入门而已。大概了解了解也可以了。

我们使用的数据集是MNIST这个强大的数据集,这个数据集所有都是手写的数字,现在有60000的训练集以及10000的测试集,可以用于我们很多的算法的训练。(至少在学习阶段是这样的嘛~)

我们可以先用Softmax回归实现一个伪深度学习。

http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html

再用卷积神经网络,实现一个真●深度学习算法。

http://www.tensorfly.cn/tfdoc/tutorials/mnist_pros.html

这是一个经典的AlexNet卷积神经网络,就是当年在ImageNet上把深度学习一下子提高到新高度的一个网络结构。也可以用循环神经网络RNN,试试看怎么玩,至于怎么实现,留给小伙伴们去思考吧~


如果你已经完成了上面的步骤,好,你已经可以跟我一样出来是一个demo代码修改工程师,可以出来吹牛逼了,但是其实并没有什么卵用。


当前现在也出现了  fashion-mnist这个数据集,目标就是替代MNIST数据集,大伙也可以下载下来玩玩,API跟MINIST一样一样的。

https://github.com/zalandoresearch/fashion-mnist


0x06 Kaggle实战

脚抬了7cm了。目标:开始实操。

进入Kangle,注册账号,开始进行泰坦尼克号吧。上面会有很多Tutorials(教程)的Kernels(也就是别人写好的一些教程),直接点一个进去。

Titanic: Machine Learning from Disaster


比如说这个:https://www.kaggle.com/jeffd23/scikit-learn-ml-from-start-to-finish

还有这个:https://www.kaggle.com/datacanary/xgboost-example-python


开始学习一下Kaggle是怎么玩的。数据怎么看?数据怎么可视化?用最简单的Logistic回归试试看。提交一下自己的成果上去。怎么提交上面的教程都有说。哇这样就完成第一次Kanggle实战了喂。


前期就好好学习参照别人写好的Kernel,自己手打一遍好好理解一下吧。

当然你可以用决策树,SVM,xgboost,甚至Tensorflow的CNN,RNN来试试看,看看怎么调参,怎么进行特征工程,好好玩把很多的算法都试一遍,争取得到一个比较高的高分吧。

即使得不到高分也没关系。毕竟万事开头难,然后中间难,然后后面巨难嘛~


0x07 落地架构


脚抬了7.5cm了。目标:开始关注落地的事情。

上面说了那么多其实都没开始任何落地的东西,你的模型要怎么训练,怎么开始结合业务来实际应用起来。

作为一个机器学习工程师,如果对于架构不了解,那你的很多想法都是无法落地的,都只能停留在你自己的分析体系中,没法实际应用到生产环境上。这对你来说,是一个很大的欠缺,你的想法跟实际落地还是有很大的鸿沟的。

但是我想说的是少年你对力量还是一无所知,别再自己造轮子了,现在用成熟的开源框架可以直接搭一个非常不错的系统了。

服务层可以用Redis,SparkStreaming,Django。

模型训练层可以使用scikit-learn,libsvm,xgboost等,保存模型用joblib。训练用Spark的话,可以把RDD直接持久化到HDFS上。训练Tensorflow的话,可以直接用框架提供的Saver进行保存喔。

至于特征库层,也就是基础数据存储层可以使用Oracle,Mysql,HBase,ElasticSearch,Redis等,根据数据量和相应速度任君选择。

如果各个组件有需要通讯的,除了api调用外,如果是不需要消费端响应的,可以使用Apache kafka喔。

这样就搭建完成一个完整的能提供在线服务的架构啦。


0x08 数学基础


脚抬了10cm了。目标:开始发现自己数学不够用了。

《概率论与数理统计》陈希孺

《线性代数应该这样学》

这个嘛,慢慢补吧,一时半会补不上来的T_T。


0x09 特征工程


脚抬了11cm了。目标:关于特征工程。

好的特征是成功的一半。业界有这么一句半玩笑但是有点道理的话。特征选择和特征清洗,决定了你模型的上限,你的算法和优化只是不断逼近这个上线而已。该系统学学特征工程的东西了。

特!征!工!程!非!常!重!要!

特征工程,顾名思义,就是批量生产特征的工程化,特征工程一般来说分为两部分,特征提取和特征选择。

好的特征是成功的一半嘛,这个步骤的结果直接决定了你最终模型训练的上限。




关于特征提取


那么特征提取的套路呢,就分五步走,分别解决两个问题,提什么,以及怎么提。

◇  拍一拍  ◇  看一看  ◇  抽一抽  ◇  洗一洗  ◇  改一改  ◇

拍一拍

拍啥呢?

拍脑门啊。

管它啥玩意特征提取,先按照业务场景的实际需求先拍一些想去抓取的数据范围出来先。


看一看

那要看什么呢?

看的目的是对数据进行可用性评估。

评估数据获取的难度,数据的规模,数据的准确率,数据的覆盖率。

1.数据获取的难度?

比如你想知道整个城市垃圾场的数据,一桶一桶称?

啊,咋获取,你告诉我咋获取。

难度非常大,这些难度非常大的数据,如果我们觉得它们很重要,我们得换别的思路去代替。

2.数据的规模

数据的规模是十万,一百万还是几千亿?这个一定要摸清楚啊,跟后面处理的工具有很大关系。

3.数据的准确率

社交媒体上的年龄能信?

社交媒体上的性别能信?我看到真人我都无别甄别性别好吗?

4.数据的覆盖率

你所想要实现的业务需求的场景,数据能覆盖吗?会不会有些地方,根本就没有这个数据。或者数据只会存在在某些特定的用户,而其他用户根本就不会有这些数据的?

比如某个农村小白比如小蕉的资产信息,哪来哪来?

“EI,我跟你说,不存在的。”

??

“那你很棒棒喔。”

??


抽一抽

啊,这个有技术含量了。

抽完放哪?抽哪些子集?

放哪?

喏,放那里。??

离线部分,可以抽完放HDFS上,或者RDBMS上。

在线部分,可能就要分级放在HBase、ElasticSearch,或者KV数据库等能快速索引的地方了。

抽哪些子集?

有时候数据上千亿,难道全部拿出来咩?也处理不了这么多啊。

只能按照数据分布来采集子集啦。

常用方法有随机采样啦,固定比例采样啦,接受-拒绝采样啦,重要性采样啦,Gibbs采样啦。

抽完还要看看数据分布,看看是不是要重采样啦,是不是要降采样啦,这样。


洗一洗

1.结合业务场景,进行数据列规则进行过滤

"钞票小于100元的我通通都不要。"

"这种拿小钱的粗活累活就让我来承担吧"

2.使用算法进行异常点检测

常用的套路有这些。

K均值聚类啊,层次聚类啊,谱聚类啊,DBSCAN啊,KNN啊。

以及四分位啊,极差啊,标准差,均差,看看数据分布大概是怎样的。

至于偏离太远的,得看看是特殊用户,还是垃圾数据,反正不太应该出现在我们接下里的过程里。


改一改

主要有三个套路要去弄。

标准化,离散化,缺省值。

1.什么叫标准化?

嗯,就是把所有的特征呢,都归到同一个值域里面。头长砍头,脚长砍脚。

??"咦,好血腥。。你再这样这个发不出去的小蕉。"

比如颜色像素,有256个值对不对,归到0-1就是全部处于256啦。这个叫归一化。

比如1、3、5、7、9。这种咋办呢?直接每个值都除以(最大值-最小值),这个叫最大最小值归一化。

也可以用Logistic函数,直接映射到0-1上,这个叫函数映射。

也可以直接排序,给他们强行改成新值,这个叫排序归一化。

2.什么叫离散化?

就是将连续的数值进行分箱啦。

(1元,5元]的一箱,(5元,10元]的一箱,这样

“都说了少于100元的我都不要了”

“妈蛋又不是给你的”

3.什么叫缺省值?

就是肯定有些值不知道什么鬼原因,反正就不见了嘛。咋办?

普遍的做法呢,要么就填个众数,要么就填个平均值,要么就用其他机器学习方法预测一个填进去。

别填过头,会粗事的。。




关于特征选择

1.相关性筛选

观察每个变量与其他变量的相关性,线性相关的特征不应该同时出现在模型中。

2.模型打分选择

使用逻辑回归,随机森林等算法,对特征重要性进行打分,再进行下一面的操作。

3.单一特征选择

使用单个特征进行模型训练,得出每个特征的准确率,再进行筛选

4.使用L1,L2正则项进行特征选择

模型,通过L1,L2正则项,得出特征的重要度。

5.特征组合

使用特征组合的方式生成新特征,再进行特征重要度选择。

6.深度学习特征选择

深度学习天生自带特征选择特效,可以直接把数据丢到深度学习算法中进行特征选择。


0x10 持续学习

趴倒在门槛上。目标:深入理解前沿的底层原理。

跟进一些过去的优秀论文,比如MapReduce原理的,比如李沫的Parameter原理的,比如GAN原理的,比如LPA原理的。非常非常多的论文,边实践边看呗。

推荐一点经典的论文。

《MapReduce: Simplified Data Processing on Large Clusters》

《Generative Adversarial Net》

《Parameter Server for Distributed Machine Learning》


0x11 结束语

路漫漫其修远兮,吾边吃酸奶边看书看论文打代码。

所以我就趴倒在门槛上,依然还没入门,还在上面某些阶段努力ing。


德仔网尊重行业规范,每篇文章都注明有明确的作者和来源;德仔网的原创文章,请转载时务必注明文章作者和来源:德仔网;
头条那些事
大家在关注
我们的推荐
也许感兴趣的
干货