本文会随着笔者本身认知的变化而不断更新,有兴趣的话能够关注笔者的专栏或者Github。html
互联网的迅猛发展催生了数据的爆炸式增加。面对海量数据,如何挖掘数据的架子,成为一个愈来愈重要的问题。首先,对于数据挖掘的概念,目前比较普遍承认的一种解释以下:python
Data Mining is the use of efficient techniques for the analysis of very large collections of data and the extraction of useful and possibly unexpected patterns in data。git
数据挖掘是一种经过分析海量数据,从数据中提取潜在的可是很是有用的模式的技术。数据挖掘的任务能够分为预测性任务和描述性任务,预测性任务主要是预测可能出现的状况;描述性任务则是发现一些人类能够解释的模式或者规律。数据挖掘中比较常见的任务包括分类、聚类、关联规则挖掘、时间序列挖掘、回归等,其中分类、回归属于预测性任务,聚类、关联规则挖掘、时间序列分析等则都是解释性任务。而什么又是机器学习呢?笔者在这里引用有趣的机器学习概念纵览:从多元拟合,神经网络到深度学习,给每一个感兴趣的人中的定义:github
Machine learning is the idea that there are generic algorithms that can tell you something interesting about a set of data without you having to write any custom code specific to the problem. Instead of writing code, you feed data to the generic algorithm and it builds its own logic based on the data.web
Machine Learning便是指可以帮你从数据中寻找到感兴趣的部分而不须要编写特定的问题解决方案的通用算法的集合。通用的算法能够根据你不一样的输入数据来自动地构建面向数据集合最优的处理逻辑。举例而言,算法中一个大的分类即分类算法,它能够将数据分类到不一样的组合中。而能够用来识别手写数字的算法天然也能用来识别垃圾邮件,只不过对于数据特征的提取方法不一样。相同的算法输入不一样的数据就可以用来处理不一样的分类逻辑。换一个形象点的阐述方式,对于某给定的任务T,在合理的性能度量方案P的前提下,某计算机程序能够自主学习任务T的经验E;随着提供合适、优质、大量的经验E,该程序对于任务T的性能逐步提升。即随着任务的不断执行,经验的累积会带来计算机性能的提高。算法
在二十世纪九十年代中期以后,统计学习渐渐成为机器学习的主流方向,具体关于机器学习的发展历程能够参见下文的机器学习的前世此生章节。数据库
论及数据挖掘与机器学习的关系,笔者更倾向于使用数据科学这个概念来进行一个总括,在笔者的概括中,数据科学泛指一切能够从数据中获取信息的技术与研究,不过注意和Infrastructure部分进行区分,笔者的数据科学部分知识体系,会包含如下部分:编程
Methodology:方法论segmentfault
DataProcess:数据预处理
MachineLearning:机器学习
NLP:天然语言处理
Statistics:数理统计
DeepLearning:深度学习
Application:应用
Classification:分类
CommunityDetection:社团发现
IntelligentAssistant:智能辅助
Personas:用户画像
Recognition:模式识别
RecommendSystem:推荐系统
CrawlerSE:爬虫与搜索引擎
DataVisualization:数据可视化
Toolkits:工具集
综上所述,数据科学涵括数据挖掘,机器学习是数据挖掘的重要手段之一,而统计学习是目前机器学习的主流方向。
[DataScience/MachineLearning Toolkits Index:笔者总结的数据科学/机器学习中经常使用工具集合/示例索引]()
[2016-周志华-机器学习]()
2011-DataMining Practical Machine Learning Tools and Techniques
2010-Ethem Alpaydin-Introduction To Machine Learning Second Edition
2008-The Elements of Statistical Learning Data Mining Inference and Prediction
A Programmer's Guide to Data Mining:一本开源的介绍了数据挖掘方面的书,包括了推荐系统、协同过滤、分类、Native Bayes、基本的NLP以及聚类
Standford-The Elements of Statistical Learning Data Mining, Inference, and Prediction
DataScience是从数据中获取价值的最重要的流行方法之一。
这个环节最重要的是需求和数据的匹配。首先须要明确需求,好比分类问题中须要判断是否有带标注的训练数据集,不然,没法按照有监督的分类算法来解决。此外,数据的规模、重要Feature的覆盖率等等,也都是要考虑的问题。
数据挖掘中准备数据的时候,须要尽量的将相关数据集成在一块儿。若是集成的数据中,有两列或者多列值同样,则不可避免地会产生数值冲突或者数据冗余,可能须要根据数据的质量来决定保留冲突中的哪一列。
通常来讲,有效的采样方式以下:若是样本是有表明性的,则使用样本数据和使用整个数据集的效果几乎是同样的。抽样方法有不少,首先考虑的是有放回的采样,以及具体选择哪一种采样方式。
现实世界中的数据,是真实的数据,不可避免地会存在各类各样异常的状况。好比某一列的值缺失或者某列的值是异常的。因此,咱们须要在数据预处理阶段进行数据清洗,来减小噪音数据对于模型训练和预测结果的影响。
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。
feature engineering is another topic which doesn’t seem to merit any review papers or books, or even chapters in books, but it is absolutely vital to ML success. […] Much of the success of machine learning is actually success in engineering features that a learner can understand.
特征是对于所需解决问题有用的属性。好比在计算机视觉领域,图片做为研究对象,可能图片中的一个线条就是一个特征;在天然语言处理领域,研究对象是文档,文档中一个词语出现的次数就是一个特征;在语音识别领域,研究对象是一段话,那么一个音频位就是一个特征。
既然特征是对咱们所解决的问题最有用的属性,首先咱们须要处理的是根据原始数据抽取出所须要的特征。不过须要注意的是并非全部的特征对所解决的问题影响同样大,有些特征可能对问题产生特别大的影响,可是有些则影响甚微,和所解决的问题不相关的特征须要被剔除掉。所以,咱们须要针对所解决的问题选择最有用的特征集合,通常能够经过相关系数等方式来计算特征的重要性。
固然,有些模型自己会输出feature重要性,譬如Random Forest算法,而对于图片、音频等原始数据形态特别大的对象,则可能须要采用像PCA这样的自动降维技术。另外,还可能须要本人对数据和所需解决的问题有深刻的理解,可以经过特征组合等方式构造出新的特征,这也正是特征工程被称为一门艺术的缘由。
通常来讲,对于算法与模型选型的考虑,可能有:
训练集的大小
特征的维度大小
所解决问题是不是线性可分的
全部的特征是独立的吗
是否须要考虑过拟合
性能要求
在实际的工做中,咱们选择算法与模型时候会考虑到奥卡姆剃刀原理:
Occam's Razor principle:use the least complicated algorithm that can address your needs and only go for something more complicated if strictly necessary
业界比较通用的算法选择通常是这样的规律:若是LR能够,则用LR;若是LR不合适,则选择Ensemble方式;若是Ensemble方式不合适,则考虑是否尝试Deep Learning。
本部分参考了周志华教授的著做:《机器学习》
机器学习是人工智能研究发展到必定阶段的必然产物,本章仅从笔者的视角对机器学习这五十年来的发展进行一个略述,疏漏错误之处烦请指正。下面这幅漫画中就展现了一个无奈的问题,三岁幼童能够轻松解决的问题却须要最顶尖的科学家花费数十年的光阴,或许机器学习离咱们在电影里看到的那样还有很长一段路要走。
知识来源于哪里?知识来源于进化、经验、文化和计算机。对于知识和计算机的关系,能够引用Facebook人工智能实验室负责人Yann LeCun的一段话:未来,世界上的大部分知识将由机器提取出来,而且将长驻与机器中。而帮助计算机获取新知识,能够经过如下五种方法来实现:
填充现存知识的空白
对大脑进行仿真
对进化进行模拟
系统性的减小不肯定性
注意新旧知识之间的类似点
对应以上这几种知识获取的途径,咱们能够认为常见的人工智能的方向有:
| 派别 | 起源 | 擅长算法 |
| 符号主义(Symbolists) | 逻辑学、哲学 | 逆演绎算法(Inverse deduction) |
| 联结主义(Connectionists) | 神经科学 | 反向传播算法(Backpropagation) |
| 进化主义(Evolutionaries) | 进化生物学 | 基因编程(Genetic programming) |
| 贝叶斯派(Bayesians) | 统计学 | 几率推理(Probabilistic inference) |
| Analogizer | 心理学 | 核机器(Kernel machines) |
二十世纪五十年代到七十年代初,人工智能研究处于”推理期“,彼时人们觉得只要能赋予机器逻辑推理的能力,机器就能具备智能。这一阶段的表明性做品有A. Newell和H. Simon的“逻辑理论家”程序,该程序于1952年证实了罗素和怀特海的名著《数学原理》中的38条定理,在1963年证实了所有的52条定理。不过随着时间的发展,人们渐渐发现仅具备逻辑推理能力是远远实现不了人工智能的。
从二十世纪七十年代中期开始,人工智能研究进入了“知识期”,在这一时期,大量的专家系统问世,在不少应用领域取得了大量成果。在本阶段诞生的技术的一个鲜明的表明就是模式识别,它强调的是如何让一个计算机程序去作一些看起来很“智能”的事情,例如识别“3”这个数字。并且在融入了不少的智慧和直觉后,人们也的确构建了这样的一个程序。从这个时代诞生的模式识别领域最著名的书之一是由Duda & Hart执笔的“模式识别(Pattern Classification)”。 对基础的研究者来讲,仍然是一本不错的入门教材。不过对于里面的一些词汇就不要太纠结了,由于这本书已经有必定的年代了,词汇会有点过期。自定义规则、自定义决策,以及自定义“智能”程序在这个任务上,曾经都风靡一时。有趣的是笔者在下文中也会介绍如何用深度学习网络去识别手写的数字,有兴趣的朋友能够去探究下使用模式识别与深度学习相比,一样是识别手写数字上的差别。
不过,专家系统面临“知识工程瓶颈”,即由人来把知识总结出来再教给计算机是至关困难的,因而人们开始考虑若是机器可以本身学习知识,该是一件多么美妙的事。
R.S.Michalski等人将机器学习分为了“从样例中学习”、“在问题求解和规划中学习”、“经过观察和发现学习”、“从指令中学习”等类别;E.A.Feigenbaum等人在著做《人工智能手册》中,则把机器学习划分为了“机械学习”、“示教学习”、“类比学习”和“概括学习”。机械学习又被称为死记硬背式学习,即把外界输入的信息所有记录下来,在须要时原封不动地取出来使用,这实际上没有进行真正的学习,仅仅是在进行信息存储和检索;示教学习和类比学习相似于R.S.Michalski等人所说的从指令中学习和经过观察和发现学习。概括学习则至关于从样例中学习,即从训练样本中概括出学习结果。二十世纪八十年代以来,被研究最多、应用最广的是“从样例中学习”,也就是普遍的概括学习,它涵盖了监督学习、无监督学习等。
在二十世纪八十年代,从样例中学习的一大主流就是符号主义学习,其表明包括决策树和基于逻辑的学习。符号学习一个直观的流程能够参考下图:
典型的决策树学习以信息论为基础,以信息熵的最小化为目标,直接模拟了人类对概念进行断定的树形流程。基于逻辑的学习的著名表明是概括逻辑程序设计Inductive Logic Programming,简称ILP,能够看作机器学习与逻辑程序设计的交叉。它使用一阶逻辑,即谓词逻辑来进行知识表示,经过修改和扩充逻辑表达式来完成对于数据的概括。符号主义学习占据主流地位与前几十年人工智能经历的推理期和知识期密切相关,最后,能够来认识几位符号主义的表明人物:
二十世纪九十年代中期以前,从样例中学习的另外一主流技术是基于神经网络的链接主义学习。下图就是典型的神经元、神经网络与著名的BP算法的示例。
与符号主义学习能产生明确的概念表示不一样,链接主义学习产生的是黑箱模型,所以从知识获取的角度来看,链接主义学习技术有明显弱点。然而,BP一直是被应用的最普遍的机器学习算法之一,在不少现实问题上发挥做用。链接主义学习的最大局限是其试错性。简单来讲,其学习过程设计大量的参数,而参数的设置缺少理论指导,主要靠手工调参;夸张一点来讲,参数调节上失之毫厘,学习结果可能谬以千里。
二十世纪九十年代中期,统计学习闪亮登场而且迅速占据主流舞台,表明性技术是支持向量机(Support Vector Machine)以及更通常的核方法(Kernel Methods)。正是因为链接主义学习技术的局限性凸显,人们才把目光转向以统计学习理论为直接支撑的统计学习技术。
深度学习掀起的热潮也许大过它自己真正的贡献,在理论和技术上并无太多的创新,只不过是因为硬件技术的革命,计算机的速度大大提升了,使得人们有可能采用原来复杂度很高的算法,从而获得比过去更精细的结果。
二十一世纪初,链接主义学习又卷土重来,掀起了以深度学习为名的热潮。所谓深度学习,狭义的说就是“不少层”的神经网络。在若干测试和竞赛上,尤为是涉及语音、图像等复杂对象的应用中,深度学习技术取得了优越性能。以前的机器学习技术在应用中要取得好的性能,对于使用者的要求较高。而深度学习技术涉及的模型复杂度很是高,以致于只要下功夫“调参”,把参数调节好,性能每每就好。深度学习虽然缺少严格的理论基础,可是显著下降了机器学习应用者的门槛,为机器学习走向工程实践带来了便利。深度学习火热的缘由有:
数据大了,计算能力抢了,深度学习模型拥有大量参数,若数据样本少,则很容易过拟合。
因为人类进入了大数据时代,数据储量与计算设备都有了大发展,才使得链接主义学习技术焕发了又一春。
笔者做为比较纯粹的偏工程的研究汪,并无真正大规模使用过深度学习集群,可是,譬如Tensorflow,它的编程易用性和同等状况下的效果仍是会大于比对的算法。关于上面一段话,跪求大神打脸指正。( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)
本部分节选自笔者另外一篇文章:有趣的机器学习概念纵览:从多元拟合,神经网络到深度学习,给每一个感兴趣的人
首先咱们来看一个真实的例子,假设你是一位成功的房地产中介,你的事业正在蒸蒸日上,如今打算雇佣更多的中介来帮你一块儿工做。不过问题来了,你能够一眼看出某个房子到底估值集合,而你的实习生们可没你这个本事。为了帮你的实习生尽快适应这份工做,你打算写个小的APP来帮他们根据房子的尺寸、邻居以及以前卖的相似的屋子的价格来评估这个屋子值多少钱。所以你翻阅了以前的资料,总结成了下表:
利用这些数据,咱们但愿最后的程序可以帮咱们自动预测一个新的屋子大概能卖到多少钱:
从知识学习与人类思惟的角度来讲,咱们会根据房屋的几个特性来推导出最后的房屋价格,根据经验咱们可能获得以下等式:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): price = 0 # 俺们这嘎达,房子基本上每平方200 price_per_sqft = 200 if neighborhood == "hipsterton": # 市中心会贵一点 price_per_sqft = 400 elif neighborhood == "skid row": # 郊区便宜点 price_per_sqft = 100 # 能够根据单价*房子大小得出一个基本价格 price = price_per_sqft * sqft # 基于房间数作点调整 if num_of_bedrooms == 0: # 没房间的便宜点 price = price — 20000 else: # 房间越多通常越值钱 price = price + (num_of_bedrooms * 1000) return price
这就是典型的简答的基于经验的条件式判断,你也能经过这种方法得出一个较好地模型。不过若是数据多了或者价格发生较大波动的时候,你就有心无力了。而应用机器学习算法则是让计算机去帮你总结出这个规律,大概以下所示:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): price = <computer, plz do some math for me> return price
通俗的理解,价格比如一锅炖汤,而卧室的数量、客厅面积以及邻近的街区就是食材,计算机帮你自动地根据不一样的食材炖出不一样的汤来。若是你是喜欢数学的,那就比如有三个自变量的方程,代码表述的话大概是下面这个样子:
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood): price = 0 # a little pinch of this price += num_of_bedrooms * .841231951398213 # and a big pinch of that price += sqft * 1231.1231231 # maybe a handful of this price += neighborhood * 2.3242341421 # and finally, just a little extra salt for good measure price += 201.23432095 return price
这里不作深刻讲解,只是观察上述代码能够发现,在大量数据的状况下,最终能够造成一个带权重和的等式,而其中的参数,从直观意义上来说,可能毫无心义。
上述算法只能处理一些较为简单的问题,即结果与输入的变量之间存在着某些线性关系。Too young,Too Simple,真实的房价和这些可不只仅只有简单的线性关系,譬如邻近的街区这个因子可能对面积较大和面积特别小的房子有影响,可是对于那些中等大小的毫无关系,换言之,price与neighborhood之间并非线性关联,而是相似于二次函数或者抛物线函数图之间的非线性关联。这种状况下,咱们可能获得不一样的权重值(形象来理解,可能部分权重值是收敛到某个局部最优):
如今等于每次预测咱们有了四个独立的预测值,下一步就是须要将四个值合并为一个最终的输出值:
咱们将上文提到的两个步骤合并起来,大概以下图所示:
咳咳,没错,这就是一个典型的神经网络,每一个节点接收一系列的输入,为每一个输入分配权重,而后计算输出值。经过链接这一系列的节点,咱们就可以为复杂的函数建模。
咱们在文首就强调过,机器学习是通用算法加上特定的数据最终造成一套特定的模型,那么咱们将上面房产的数据修正为手写数字,大概就像以下这样:
在这里咱们但愿用神经网络来处理图片,第二步就是须要将一张图片转化为数字的组合,便是计算机能够处理的样子。表担忧,这一步仍是很简单的。对于电脑而言,一张图片就是一个多维的整型数组,每一个元素表明了每一个像素的模糊度,大概是这样子:
为了可以将图片应用到咱们的神经网络模型中,咱们须要将1818像素的图片转化为324个数字:
此次的共有324个输入,咱们须要将神经网络扩大化转化为324个输入的模型:
用这种方法,咱们能够方便地建立无限的训练数据。数据有了,咱们也须要来扩展下咱们的神经网络,从而使它可以学习些更复杂的模式。具体而言,咱们须要添加更多的中间层:
这个呢,就是咱们所谓的深度神经网络,由于它比传统的神经网络有更多的中间层。
算法基本上从功能或者形式上来分类。好比,基于树的算法,神经网络算法。这是一个颇有用的分类方式,但并不完美。由于有许多算法能够轻易地被分到两类中去,好比说Learning Vector Quantization就同时是神经网络类的算法和基于实例的方法。正如机器学习算法自己没有完美的模型同样,算法的分类方法也没有完美的。
输入数据被称为训练数据,而且有已知的结果或被标记。好比说一封邮件是不是垃圾邮件,或者说一段时间内的股价。模型作出预测,若是错了就会被修正,这个过程一直持续到对于训练数据它可以达到必定的正确标准。问题例子包括分类和回归问题,算法例子包括逻辑回归和反向神经网络。
有监督学习的通俗例子能够以人类认知月亮的过程为例,小时候会认为黑夜里天空中明亮的圆盘状物体为月亮,后来随着时间的推移,发现圆盘状这个特色并不是一个决定性因素。
输入数据是被标记的和不被标记的数据的混合,有一些预测问题可是模型也必须学习数据的结构和组成。问题例子包括分类和回归问题,算法例子基本上是无监督学习算法的延伸。
输入数据没有被标记,也没有肯定的结果。模型对数据的结构和数值进行概括。问题例子包括Association rule learning和聚类问题,算法例子包括 Apriori 算法和K-均值算法。
回归主要用于对变量之间的关系进行建模,而且使用某个损失函数或者代价函数做为某个变量组合的评估标准。回归方法是统计的一个重要组成部分,目前主要用于统计机器学习中。有时候这个概念会混乱,由于有时候会用回归去描述一类问题,有时候也会用回归去描述一类算法,而实际上回归更多的指的是一个处理过程。常见的回归算法有:
Ordinary Least Squares Regression (OLSR)
Linear Regression
Logistic Regression
Stepwise Regression
Multivariate Adaptive Regression Splines (MARS)
Locally Estimated Scatterplot Smoothing (LOESS)
基于实例的学习模型主要是根据训练实例或者样本的特性进行模型构建,所以对于此类算法训练数据相当重要。此类型算法一般会对测试数据创建一个统一的数据库,而后经过比较新老数据之间的类似度来进行匹配预测。鉴于这个特性,基于实例的算法又被成为“赢者通吃”或者“基于记忆”的学习。此类算法的核心在于存储实例的表示方法与实例间类似度的度量方法,最多见的基于实例的学习算法有:
k-Nearest Neighbour (kNN)
Learning Vector Quantization (LVQ)
Self-Organizing Map (SOM)
Locally Weighted Learning (LWL)
决策树即利用数据中属性的真实值来构建一个决策模型,决策树算法也主要用于分类与回归问题。决策树算法通常速度和准确度都不错,所以在机器学习中很受欢迎。常见的机器学习算法有:
Classification and Regression Tree (CART)
Iterative Dichotomiser 3 (ID3)
C4.5 and C5.0 (different versions of a powerful approach)
Chi-squared Automatic Interaction Detection (CHAID)
Decision Stump
M5
Conditional Decision Trees
贝叶斯算法便是基于贝叶斯公式及其变种而用于常见的分类与聚类问题的算法。常见的贝叶斯算法有:
Naive Bayes
Gaussian Naive Bayes
Multinomial Naive Bayes
Averaged One-Dependence Estimators (AODE)
Bayesian Belief Network (BBN)
Bayesian Network (BN)
聚类,与回归同样同时描述了一系列问题与一系列算法的集合。聚类算法一般地基于中心与层次化进行建模,基本上全部的方法都使用数据的内部结构来将数据组合进入不一样的社群中,常见的聚类算法有:
k-Means
k-Medians
Expectation Maximisation (EM)
Hierarchical Clustering
人工神经网络算法主要受生物学中的人工神经网络的启发,须要注意,本文将深度学习剥离为一个单独的部分进行描述。常见的人工神经网络算法有:
Perceptron
Back-Propagation
Hopfield Network
Radial Basis Function Network (RBFN)
深度学习算法是对于人工神经网络算法的一个扩展,基于现代大量廉价的计算能力的组合从而实现对于复杂模型的求解。深度学习算法主要是基于构建大型、复杂的神经网络,不少方法都是为了处理只含有少许标签数据的海量数据集的半监督学习方法。常见的深度学习算法有:
Deep Boltzmann Machine (DBM)
Deep Belief Networks (DBN)
Convolutional Neural Network (CNN)
Stacked Auto-Encoders
组合方式主要分为Bagging和Boosting。Bagging是Bootstrapped Aggregation的缩写,其基本原理是让学习算法训练多轮,每轮的训练集由从初始的训练集中随机取出的N个训练样本组成(有放回的随机抽样),训练以后可获得一个预测函数集合,经过投票的方式决定预测结果。而Boosting中主要的是AdaBoost(Adaptive Boosting)。基本原理是初始化时对每个训练样本赋相等的权重$1/n$,而后用学习算法训练多轮,每轮结束后,对训练失败的训练样本赋以较大的权重,也就是让学习算法在后续的学习中集中对比较难的训练样本进行学习,从而获得一个预测函数的集合。每一个预测函数都有必定的权重,预测效果好的函数权重较大,反之较小,最终经过有权重的投票方式来决定预测结果。而Bagging与Boosting的主要区别在于:
取样方式不一样。Bagging采用均匀取样,而Boosting根据错误率来取样,所以理论上来讲Boosting的分类精度要优于Bagging。
训练集的选择方式不一样。Bagging的训练集的选择是随机的,各轮训练集之间相互独立,而Boosting的各轮训练集的选择与前面的学习结果有关。
预测函数不一样。Bagging的各个预测函数没有权重,而Boosting是有权重的。Bagging的各个预测函数能够并行生成,而Boosting的各个预测函数只能顺序生成。
总结而言,对于像神级网络这样及其耗时的学习方法,Bagging能够经过并行训练节省大量时间的开销。Bagging和Boosting均可以有效地提升分类的准确性。在大多数数据集合中,Boosting的准确性比Bagging要高。
Boosting
Bootstrapped Aggregation (Bagging)
AdaBoost
Stacked Generalization (blending)
Gradient Boosting Machines (GBM)
Gradient Boosted Regression Trees (GBRT)
Random Forest