机器学习应用场景
机器学习应⽤场景
1、分类问题
根据数据样本上抽取出的特征,判定其属于有限个类别中的哪⼀个。⽐如:
垃圾邮件识别(结果类别:1、垃圾邮件 2、正常邮件)
⽂本情感褒贬分析(结果类别:1、褒 2、贬)
图像内容识别识别(结果类别:1、喵星⼈ 2、汪星⼈ 3、⼈类 4、 5、都不是)。
2、回归问题
根据数据样本上抽取出的特征,预测⼀个连续值的结果。⽐如:
星爷《美⼈鱼》票房
⼤帝都2个⽉后的房价
隔壁熊孩⼦⼀天来你家⼏次,宠幸你多少玩具
3、聚类问题
根据数据样本上抽取出的特征,让样本抱抱团(相近/相关的样本在⼀团内)。⽐如:
google的新闻分类
⽤户体划分
我们再把上述常见问题划到机器学习最典型的2个分类上。
分类与回归问题需要⽤已知结果的数据做训练,属于“监督学习”
聚类的问题不需要已知标签,属于“⾮监督学习”。
如果在IT⾏业(尤其是互联⽹)⾥溜达⼀圈,你会发现机器学习在以下热点问题中有⼴泛应⽤:
1、计算机视觉
典型的应⽤包括:⼈脸识别、车牌识别、扫描⽂字识别、图⽚内容识别、图⽚搜索等等。
2、⾃然语⾔处理
典型的应⽤包括:搜索引擎智能匹配、⽂本内容理解、⽂本情绪判断,语⾳识别、输⼊法、机器翻译等等。
3、社会⽹络分析
典型的应⽤包括:⽤户画像、⽹络关联分析、欺诈作弊发现、热点发现等等。
4、推荐
典型的应⽤包括:虾⽶⾳乐的“歌曲推荐”,某宝的“猜你喜欢”等等。
三、⼊门⽅法与学习路径
OK,不废话,直接切重点丢⼲货了。看似学习难度⼤,曲线陡的机器学习,对⼤多数⼊门者也有⼀个⽐较通⽤的学习路径,也有⼀些优秀的⼊门资料可以降低⼤家的学习门槛,同时激发我们的学习乐趣。
简单说来,⼤概的⼀个学习路径如下:
简单说⼀点,之所以最左边写了『数学基础』『典型机器学习算法』『编程基础』三个并⾏的部分,
是因为机器学习是⼀个将数学/算法理论和⼯程实践紧密结合的领域,需要扎实的理论基础帮助引导数据分析与模型调优,同时也需要精湛的⼯程开发能⼒去⾼效化地训练和部署模型和服务。
需要多说⼀句的是,在互联⽹领域从事机器学习的⼈,有2类背景的⼈⽐较多,其中⼀部分(很⼤⼀部分)是程序员出⾝,这类同学⼯程经验相对会多⼀些,另⼀部分是学数学统计领域的同学,这部分同学理论基础相对扎实⼀些。因此对⽐上图,2类同学⼊门机器学习,所⽋缺和需要加强的部分是不⼀样的。
下⾯就上述图中的部分,展开来分别扯⼏句:
3.1 数学基础
有⽆数激情满满⼤步向前,誓要在机器学习领域有⼀番作为的同学,在看到公式的⼀刻突然就觉得⾃⼰狗带了。是啊,机器学习之所以相对于其他开发⼯作,更有门槛的根本原因就是数学。每⼀个算法,要在训练集上最⼤程度拟合同时⼜保证泛化能⼒,需要不断分析结果和数据,调优参数,这需要我们对数据分布和模型底层的数学原理有⼀定的理解。所幸的是如果只是想合理应⽤机器学习,⽽不是做相关⽅向⾼精尖的research,需要的数学知识啃⼀啃还是基本能理解下来的。⾄于更⾼深的部分,恩,博主⾮常愿意承认⾃⼰是『数学渣』。
基本所有常见机器学习算法需要的数学基础,都集中在微积分、线性代数和概率与统计当中。下⾯我们先过⼀过知识重点,⽂章的后部分会介绍⼀些帮助学习和巩固这些知识的资料。
3.1.1 微积分
微分的计算及其⼏何、物理含义,是机器学习中⼤多数算法的求解过程的核⼼。⽐如算法中运⽤到梯度下降法、⽜顿法等。如果对其⼏何意义有充分的理解,就能理解“梯度下降是⽤平⾯来逼近局部,⽜顿法是⽤曲⾯逼近局部”,能够更好地理解运⽤这样的⽅法。
凸优化和条件最优化 的相关知识在算法中的应⽤随处可见,如果能有系统的学习将使得你对算法的认识达到⼀个新⾼度。
3.1.2 线性代数
⼤多数机器学习的算法要应⽤起来,依赖于⾼效的计算,这种场景下,程序员GG们习惯的多层for循环通常就⾏不通了,⽽⼤多数的循环操作可转化成矩阵之间的乘法运算,这就和线性代数有莫⼤的关系了
向量的内积运算更是随处可见。
矩阵乘法与分解在机器学习的主成分分析(PCA)和奇异值分解(SVD) 等部分呈现刷屏状地出现。
3.1.3 概率与统计
从⼴义来说,机器学习在做的很多事情,和统计层⾯数据分析和发掘隐藏的模式,是⾮常类似的。
极⼤似然思想、贝叶斯模型 是理论基础,朴素贝叶斯(Naive Bayes )、语⾔模型(N-gram)、隐马尔科夫(HMM)、隐变量混合概率模型是他们的⾼级形态。
常见分布如⾼斯分布是混合⾼斯模型(GMM)等的基础。
3.2 典型算法
绝⼤多数问题⽤典型机器学习的算法都能解决,粗略地列举⼀下这些⽅法如下:
处理分类问题的常⽤算法包括:逻辑回归(⼯业界最常⽤),⽀持向量机,随机森林,朴素贝叶斯(NLP中常⽤),深度神经⽹络(视频、图⽚、语⾳等多媒体数据中使⽤)。
处理回归问题的常⽤算法包括:线性回归,普通最⼩⼆乘回归(Ordinary Least Squares Regression),逐步回归(Stepwise Regression),多元⾃适应回归样条(Multivariate Adaptive Regression Splines)
处理聚类问题的常⽤算法包括:K均值(K-means),基于密度聚类,LDA等等。
降维的常⽤算法包括:主成分分析(PCA),奇异值分解(SVD) 等。
推荐系统的常⽤算法:协同过滤算法
模型融合(model ensemble)和提升(boosting)的算法包括:bagging,adaboost,GBDT,GBRT
其他很重要的算法包括:EM算法等等。
我们多插⼀句,机器学习⾥所说的“算法”与程序员所说的“数据结构与算法分析”⾥的“算法”略有区别。前者更关注结果数据的召回率、精确度、准确性等⽅⾯,后者更关注执⾏过程的时间复杂度、空间复杂度等⽅⾯。 。当然,实际机器学习问题中,对效率和资源占⽤的考量是不可或缺的。
3.3 编程语⾔、⼯具和环境
看了⽆数的理论与知识,总归要落到实际动⼿实现和解决问题上。⽽没有⼯具所有的材料和框架、逻辑、思路都给你,也⼨步难⾏。因此我们还是得需要合适的编程语⾔、⼯具和环境帮助⾃⼰在数据集上应⽤机器学习算法,或者实现⾃⼰的想法。对初学者⽽⾔,Python和R语⾔是很好的⼊门语⾔,很容易上⼿,同时⼜活跃的社区⽀持,丰富的⼯具包帮助我们完成想法。相对⽽⾔,似乎计算机相关的同学⽤Python 多⼀些,⽽数学统计出⾝的同学更喜欢R⼀些。我们对编程语⾔、⼯具和环境稍加介绍:
3.3.1 python
python有着全品类的数据科学⼯具,从数据获取、数据清洗到整合各种算法都做得⾮常全⾯。
⽹页爬⾍:scrapy
数据挖掘:
1、pandas:模拟R,进⾏数据浏览与预处理。
2、numpy:数组运算。
3、scipy:⾼效的科学计算。
4、matplotlib:⾮常⽅便的数据可视化⼯具。
机器学习:
大数据要学什么1、scikit-learn:远近闻名的机器学习package。未必是最⾼效的,但是接⼝真⼼封装得好,⼏乎所有的机器学习算法输⼊输出部分格式都⼀致。⽽它的⽀持⽂档甚⾄可以直接当做教程来学习,⾮常⽤⼼。对于不是⾮常⾼纬度、⾼量级的数据,scikit-learn胜任得⾮常好(有兴趣可以看看sklearn的源码,
也很有意思)。
2、libsvm:⾼效率的svm模型实现(了解⼀下很有好处,libsvm的系数数据输⼊格式,在各处都⾮常常见)
3、keras/TensorFlow:对深度学习感兴趣的同学,也能很⽅便地搭建⾃⼰的神经⽹络了。
⾃然语⾔处理:
1、nltk:⾃然语⾔处理的相关功能做得⾮常全⾯,有典型语料库,⽽且上⼿也⾮常容 易。
交互式环境:
1、ipython notebook:能直接打通数据到结果的通道,⽅便⾄极。强⼒推荐。
3.3.2 R
R最⼤的优势是开源社区,聚集了⾮常多功能强⼤可直接使⽤的包,绝⼤多数的机器学习算法在R中都有完善的包可直接使⽤,同时⽂档也⾮常齐全。常见的package包括:RGtk2, pmml, colorspace, ada, amap, arules, biclust, cba, descr, doBy, e1071, ellipse等等。另外,值得⼀提的是R的可视化效果做得⾮常不错,⽽这对于机器学习是⾮常有帮助的。
3.3.3 其他语⾔
相应资深程序员GG的要求,再补充⼀下java和C++相关机器学习package。
Java系列
WEKA Machine Learning Workbench 相当于java中的scikit-learn
其他的⼯具如Massive Online Analysis(MOA)、MEKA 、 Mallet 等也⾮常有名。
更多详细的应⽤请参考这篇⽂章《25个Java机器学习⼯具&库》
C++系列
mlpack,⾼效同时可扩充性⾮常好的机器学习库。
Shark:⽂档齐全的⽼牌C++机器学习库。
3.3.4 ⼤数据相关
Hadoop:基本上是⼯业界的标配了。⼀般⽤来做特征清洗、特征处理的相关⼯作。
spark:提供了MLlib这样的⼤数据机器学习平台,实现了很多常⽤算法。但可靠性、稳定性上有待提⾼。
3.3.5 操作系统
mac和linux会⽅便⼀些,⽽windows在开发中略显⼒不从⼼。所谓⽅便,主要是指的mac和linux在下载安装软件、配置环境更快捷。
对于只习惯windows的同学,推荐anaconda,⼀步到位安装完python的全品类数据科学⼯具包。
3.4 基本⼯作流程
以上我们基本具备了机器学习的必要条件,剩下的就是怎么运⽤它们去做⼀个完整的机器学习项⽬。其⼯作流程如下:
3.4.1 抽象成数学问题
明确问题是进⾏机器学习的第⼀步。机器学习的训练过程通常都是⼀件⾮常耗时的事情,胡乱尝试时间成本是⾮常⾼的。
这⾥的抽象成数学问题,指的我们明确我们可以获得什么样的数据,⽬标是⼀个分类还是回归或者是聚类的问题,如果都不是的话,如果划归为其中的某类问题。
3.4.2 获取数据
数据决定了机器学习结果的上限,⽽算法只是尽可能逼近这个上限。
数据要有代表性,否则必然会过拟合。
⽽且对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有数个数量级的差距。
⽽且还要对数据的量级有⼀个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否能够放得下。如果放不下就得考虑改进算法或者使⽤⼀些降维的技巧了。如果数据量实在太⼤,那就要考虑分布式了。
3.4.3 特征预处理与特征选择
良好的数据要能够提取出良好的特征才能真正发挥效⼒。
特征预处理、数据清洗是很关键的步骤,往往能够使得算法的效果和性能得到显著提⾼。归⼀化、离
散化、因⼦化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花在它们上⾯。这些⼯作简单可复制,收益稳定可预期,是机器学习的基础必备步骤。
筛选出显著特征、摒弃⾮显著特征,需要机器学习⼯程师反复理解业务。这对很多结果有决定性的影响。特征选择好了,⾮常简单的算法也能得出良好、稳定的结果。这需要运⽤特征有效性分析的相关技术,如相关系数、卡⽅检验、平均互信息、条件熵、后验概率、逻辑回归权重等⽅法。
3.4.4 训练模型与调优
直到这⼀步才⽤到我们上⾯说的算法进⾏训练。现在很多算法都能够封装成⿊盒供⼈使⽤。但是真正考验⽔平的是调整这些算法的(超)参数,使得结果变得更加优良。这需要我们对算法的原理有深⼊的理解。理解越深⼊,就越能发现问题的症结,提出良好的调优⽅案。
3.4.5 模型诊断
如何确定模型调优的⽅向与思路呢?这就需要对模型进⾏诊断的技术。
过拟合、⽋拟合 判断是模型诊断中⾄关重要的⼀步。常见的⽅法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。⽋拟合的基本调优思路是提⾼特征数量和质量,增加模型复杂度。
误差分析 也是机器学习⾄关重要的步骤。通过观察误差样本,全⾯分析误差产⽣误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本⾝的问题……
诊断后的模型需要进⾏调优,调优后的新模型需要重新进⾏诊断,这是⼀个反复迭代不断逼近的过程,需要不断地尝试, 进⽽达到最优状态。
3.4.6 模型融合
⼀般来说,模型融合后都能使得效果有⼀定提升。⽽且效果很好。
⼯程上,主要提升算法准确度的⽅法是分别在模型的前端(特征清洗和预处理,不同的采样模式)与后端(模型融合)上下功夫。因为他们⽐较标准可复制,效果⽐较稳定。⽽直接调参的⼯作不会很多,毕竟⼤量数据训练起来太慢了,⽽且效果难以保证。
3.4.7 上线运⾏
这⼀部分内容主要跟⼯程实现的相关性⽐较⼤。⼯程上是结果导向,模型在线上运⾏的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运⾏的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。
这些⼯作流程主要是⼯程实践上总结出的⼀些经验。并不是每个项⽬都包含完整的⼀个流程。这⾥的部分只是⼀个指导性的说明,只有⼤家⾃⼰多实践,多积累项⽬经验,才会有⾃⼰更深刻的认识。
3.5 关于积累项⽬经验
初学机器学习可能有⼀个误区,就是⼀上来就陷⼊到对各种⾼⼤上算法的追逐当中。动不动就我能不能⽤深度学习去解决这个问题啊?我是不是要⽤boosting算法做⼀些模型融合啊?我⼀直持有⼀个观点,『脱离业务和数据的算法讨论是毫⽆意义的』。
实际上按我们的学习经验,从⼀个数据源开始,即使是⽤最传统,已经应⽤多年的机器学习算法,先完整地⾛完机器学习的整个⼯作流程,不断尝试各种算法深挖这些数据的价值,在运⽤过程中把数据、特征和算法搞透,真正积累出项⽬经验 才是最快、最靠谱的学习路径。
那如何获取数据和项⽬呢?⼀个捷径就是积极参加国内外各种数据挖掘竞赛,数据直接下载下来,按照竞赛的要求去不断优化,积累经验。国外的Kaggle和国内的DataCastle 以及阿⾥天池⽐赛都是很好的平台,你可以在上⾯获取真实的数据和数据科学家们⼀起学习和进⾏竞赛,尝试使⽤已经学过的所有知识来完成这个⽐赛本⾝也是⼀件很有乐趣的事情。和其他数据科学家的讨论能开阔视野,对机器学习算法有更深层次的认识。
有意思的是,有些平台,⽐如阿⾥天池⽐赛,甚⾄给出了从数据处理到模型训练到模型评估、可视化到模型融合增强的全部组件,你要做的事情只是参与⽐赛,获取数据,然后使⽤这些组件去实现⾃⼰的idea即可。具体内容可以参见阿⾥云机器学习⽂档。
3.6 ⾃主学习能⼒
多⼏句嘴,这部分内容和机器学习本⾝没有关系,但是我们觉得这⽅⾯的能⼒对于任何⼀种新知识和技能的学习来说都是⾄关重要的。 ⾃主学习能⼒提升后,意味着你能够跟据⾃⼰的情况,到最合适的学习资料和最快学习成长路径。
3.6.1 信息检索过滤与整合能⼒
对于初学者,绝⼤部分需要的知识通过⽹络就可以到了。
google搜索引擎技巧——组合替换搜索关键词、站内搜索、学术⽂献搜索、PDF搜索等——都是必备的。
⼀个⽐较好的习惯是到信息的原始出处,如个⼈站、、博客、专业⽹站、书籍等等。这样就能够到系统化、不失真的⾼质量信息。
百度搜到的技术类信息不够好,建议只作为补充搜索来⽤。各种搜索引擎都可以交叉着使⽤效果更好。
学会去常见的⾼质量信息源中搜索东西:stackoverflow(程序相关)、quora(⾼质量回答)、wikipedia(系统化知识,⽐某某百科不知道好太多)、知乎(中⽂、有料)、⽹盘搜索(免费资源⼀⼤把)等。
将搜集到的⽹页放到分类齐全的云端收藏夹⾥,并经常整理。这样⽆论在公司还是在家⾥,在电脑前还是在⼿机上,都能够到⾃⼰喜欢的东西。
搜集到的⽂件、代码、电⼦书等等也放到云端⽹盘⾥,并经常整理。
3.6.2 提炼与总结能⼒
经常作笔记,并总结⾃⼰学到的知识是成长的不⼆法门。其实主要的困难是懒,但是坚持之后总能发现知识的共性,就能少记⼀些东西,掌握得更多。
笔记建议放到云端笔记⾥,印象笔记、为知笔记都还不错。这样在坐地铁、排队等零碎的时间都能看到笔记并继续思考。
3.6.3 提问与求助能⼒
机器学习的相关QQ、论坛、社区⼀⼤堆。总有⼈知道你问题的答案。
但是⼤多数同学都很忙,没法像家庭教师那样⼿把⼿告诉你怎么做。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。