1.分类(classification)
有监督学习的两大应用之一,产生离散的结果。
例如向模型输入人的各种数据的训练样本,产生“输入一个人的数据,判断是否患有癌症”的结果,结果必定是离散的,只有“是”或“否”。
分类方法是一种对离散型随机变量建模或预测的监督学习算法。使用案例包括邮件过滤、金融欺诈和预测雇员异动等输出为类别的任务。
许多回归算法都有与其相对应的分类算法,分类算法通常适用于预测一个类别(或类别的概率)而不是连续的数值。
分类是数据挖掘中的一项非常重要的任务,利用分类技术可以从数据集中提取描述数据类的一个函数或模型(也常称为分类器),并把数据集中的每个对象归结到某个已知的对象类中。从机器学习的观点,分类技术是一种有指导的学习,即每个训练样本的数据对象已经有类标识,通过学习可以形成表达数据对象与类标识间对应的知识。从这个意义上说,数据挖掘的目标就是根据样本数据形成的类知识并对源数据进行分类,进而也可以预测未来数据的归类。分类具有广泛的应用,例如医疗诊断、信用卡的信用分级、图像模式识别。
分类挖掘所获的分类模型可以采用多种形式加以描述输出。其中主要的表示方法有:分类规则、决策树、数学公式和神经网络。另外,最近又兴起了一种新的方法—粗糙集,其知识表示采用产生式规则。
分类(classification )是这样的过程:它找出描述并区分数据类或概念的模型(或函数),以便能够使用模型预测类标记未知的对象类。分类分析在数据挖掘中是一项比较重要的任务, 目前在商业上应用最多。分类的目的是学会一个分类函数或分类模型(也常常称作分类器),该模型能把数据库中的数据项映射到给定类别中的某一个类中。
分类和回归都可用于预测,两者的目的都是从历史数据纪录中自动推导出对给定数据的推广描述,从而能对未来数据进行预测。与回归不同的是,分类的输出是离散的类别值,而回归的输出是连续数值。二者常表现为决策树的形式,根据数据值从树根开始搜索,沿着数据满足的分支往上走,走到树叶就能确定类别。
要构造分类器,需要有一个训练样本数据集作为输入。训练集由一组数据库记录或元组构成,每个元组是一个由有关字段(又称属性或特征)值组成的特征向量,此 外,训练样本还有一个类别标记。一个具体样本的形式可表示为:(v1,v2,...,vn; c);其中vi表示字段值,c表示类别。分类器的构造方法有统计方法、机器学习方法、神经网络方法等等。
不同的分类器有不同的特点。有三种分类器评价或比较尺度:1)预测准确度;2)计算复杂度;3)模型描述的简洁度。预测准确度是用得最多的一种比较尺度, 特别是对于预测型分类任务。计算复杂度依赖于具体的实现细节和硬件环境,在数据挖掘中,由于操作对象是巨量的数据,因此空间和时间的复杂度问题将是非常重 要的一个环节。对于描述型的分类任务,模型描述越简洁越受欢迎。
另外要注意的是,分类的效果一般和数据的特点有关,有的数据噪声大,有的有空缺值,有的分布稀疏,有的字段或属性间相关性强,有的属性是离散的而有的是连续值或混合式的。目前普遍认为不存在某种方法能适合于各种特点的数据
1.1 Logistic 回归(正则化)
Logistic 回归是与线性回归相对应的一种分类方法,且该算法的基本概念由线性回归推导而出。Logistic 回归通过 Logistic 函数(即 Sigmoid 函数)将预测映射到 0 到 1 中间,因此预测值就可以看成某个类别的概率。
该模型仍然还是「线性」的,所以只有在数据是线性可分(即数据可被一个超平面完全分离)时,算法才能有优秀的表现。同样 Logistic 模型能惩罚模型系数而进行正则化。
-
优点:输出有很好的概率解释,并且算法也能正则化而避免过拟合。Logistic 模型很容易使用随机梯度下降和新数据更新模型权重。
-
缺点:Logistic 回归在多条或非线性决策边界时性能比较差。
-
Python 实现:http://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
-
R 实现:https://cran.r-project.org/web/packages/glmnet/index.html
1.2 分类树(集成方法)
与回归树相对应的分类算法是分类树。它们通常都是指决策树,或更严谨一点地称之为「分类回归树(CART)」,这也就是非常著名的 CART 的算法。
简单的随机森林
-
优点:同回归方法一样,分类树的集成方法在实践中同样表现十分优良。它们通常对异常数据具有相当的鲁棒性和可扩展性。因为它的层级结构,分类树的集成方法能很自然地对非线性决策边界建模。
-
缺点:不可约束,单棵树趋向于过拟合,使用集成方法可以削弱这一方面的影响。
-
随机森林 Python 实现:http://scikit-learn.org/stable/modules/ensemble.html#regression
-
随机森林 R 实现:https://cran.r-project.org/web/packages/randomForest/index.html
-
梯度提升树 Python 实现:http://scikit-learn.org/stable/modules/ensemble.html#classification
-
梯度提升树 R 实现:https://cran.r-project.org/web/packages/gbm/index.html
1.3 深度学习
深度学习同样很容易适应于分类问题。实际上,深度学习应用地更多的是分类任务,如图像分类等。
-
优点:深度学习非常适用于分类音频、文本和图像数据。
-
缺点:和回归问题一样,深度神经网络需要大量的数据进行训练,所以其也不是一个通用目的的算法。
-
Python 资源:https://keras.io/
-
R 资源:http://mxnet.io/
1.4 支持向量机
支持向量机(SVM)可以使用一个称之为核函数的技巧扩展到非线性分类问题,而该算法本质上就是计算两个称之为支持向量的观测数据之间的距离。SVM 算法寻找的决策边界即最大化其与样本间隔的边界,因此支持向量机又称为大间距分类器。
支持向量机中的核函数采用非线性变换,将非线性问题变换为线性问题
例如,SVM 使用线性核函数就能得到类似于 logistic 回归的结果,只不过支持向量机因为最大化了间隔而更具鲁棒性。因此,在实践中,SVM 最大的优点就是可以使用非线性核函数对非线性决策边界建模。
-
优点:SVM 能对非线性决策边界建模,并且有许多可选的核函数形式。SVM 同样面对过拟合有相当大的鲁棒性,这一点在高维空间中尤其突出。
-
缺点:然而,SVM 是内存密集型算法,由于选择正确的核函数是很重要的,所以其很难调参,也不能扩展到较大的数据集中。目前在工业界中,随机森林通常优于支持向量机算法。
-
Python 实现:http://scikit-learn.org/stable/modules/svm.html#classification
-
R 实现:https://cran.r-project.org/web/packages/kernlab/index.html
1.5 朴素贝叶斯
朴素贝叶斯(NB)是一种基于贝叶斯定理和特征条件独立假设的分类方法。本质上朴素贝叶斯模型就是一个概率表,其通过训练数据更新这张表中的概率。为了预测一个新的观察值,朴素贝叶斯算法就是根据样本的特征值在概率表中寻找最大概率的那个类别。
之所以称之为「朴素」,是因为该算法的核心就是特征条件独立性假设(每一个特征之间相互独立),而这一假设在现实世界中基本是不现实的。
-
优点:即使条件独立性假设很难成立,但朴素贝叶斯算法在实践中表现出乎意料地好。该算法很容易实现并能随数据集的更新而扩展。
-
缺点:因为朴素贝叶斯算法太简单了,所以其也经常被以上列出的分类算法所替代。
-
Python 实现:http://scikit-learn.org/stable/modules/naive_bayes.html
-
R 实现:https://cran.r-project.org/web/packages/naivebayes/index.html
2.聚类(clustering)
无监督学习的结果。聚类的结果将产生一组集合,集合中的对象与同集合中的对象彼此相似,与其他集合中的对象相异。
没有标准参考的学生给书本分的类别,表示自己认为这些书可能是同一类别的(具体什么类别不知道)。
聚类是一种无监督学习任务,该算法基于数据的内部结构寻找观察样本的自然族群(即集群)。使用案例包括细分客户、新闻聚类、文章推荐等。
因为聚类是一种无监督学习(即数据没有标注),并且通常使用数据可视化评价结果。如果存在「正确的回答」(即在训练集中存在预标注的集群),那么分类算法可能更加合适。
与分类技术不同,在机器学习中,聚类是一种无指导学习。也就是说,聚类是在预先不知道欲划分类的情况下,根据信息相似度原则进行信息聚类的一种方法。聚 类的目的是使得属于同类别的对象之间的差别尽可能的小,而不同类别上的对象的差别尽可能的大。因此,聚类的意义就在于将观察到的内容组织成类分层结构,把 类似的事物组织在一起。通过聚类,人们能够识别密集的和稀疏的区域,因而发现全局的分布模式,以及数据属性之间的有趣的关系。
数据聚类分析是一个正在蓬勃发展的领域。聚类技术主要是以统计方法、机器学习、神经网络等方法为基础。比较有代表性的聚类技术是基于几何距离的聚类方法,如欧氏距离、曼哈坦距离、明考斯基距离等。聚类分析广泛应用于商业、生物、地理、网络服务等多种领域。
聚类(clustering)是指根 据“物以类聚”的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程。它的目的是使得属于 同一个簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似。与分类规则不同,进行聚类前并不知道将要划分成几个组和什么样的组,也不知道根据哪些空 间区分规则来定义组。其目的旨在发现空间实体的属性间的函数关系,挖掘的知识用以属性名为变量的数学方程来表示。
当前,聚类技术正在蓬勃发展,涉及范围包括数据挖掘、统计学、机器学习、空间数据库技术、生物学以及市场营销等领域,聚类分析已经成为数据挖掘研究领域中 一个非常活跃的研究课题。
常见的聚类算法包括:
K-均值聚类算法(K-mensclustering)则是最典型的聚类算法
属于划分法K中心点(K-MEDOIDS)算法、CLARANS算法;
属于层次法的BIRCH算法、CURE算法、CHAMELEON算法等;
基于密度的方法:DBSCAN算法、OPTICS算法、DENCLUE算法等;
基于网格的方法:STING算法、CLIQUE算法、WAVE-CLUSTER算法;基于模型的方法。
2.1 K 均值聚类
K 均值聚类是一种通用目的的算法,聚类的度量基于样本点之间的几何距离(即在坐标平面中的距离)。集群是围绕在聚类中心的族群,而集群呈现出类球状并具有相似的大小。聚类算法是我们推荐给初学者的算法,因为该算法不仅十分简单,而且还足够灵活以面对大多数问题都能给出合理的结果。
-
优点:K 均值聚类是最流行的聚类算法,因为该算法足够快速、简单,并且如果你的预处理数据和特征工程十分有效,那么该聚类算法将拥有令人惊叹的灵活性。
-
缺点:该算法需要指定集群的数量,而 K 值的选择通常都不是那么容易确定的。另外,如果训练数据中的真实集群并不是类球状的,那么 K 均值聚类会得出一些比较差的集群。
-
Python 实现:http://scikit-learn.org/stable/modules/clustering.html#k-means
-
R 实现:https://stat.ethz.ch/R-manual/R-devel/library/stats/html/kmeans.html
2.2 Affinity Propagation 聚类
AP 聚类算法是一种相对较新的聚类算法,该聚类算法基于两个样本点之间的图形距离(graph distances)确定集群。采用该聚类方法的集群拥有更小和不相等的大小。
-
优点:该算法不需要指出明确的集群数量(但是需要指定「sample preference」和「damping」等超参数)。
-
缺点:AP 聚类算法主要的缺点就是训练速度比较慢,并需要大量内存,因此也就很难扩展到大数据集中。另外,该算法同样假定潜在的集群是类球状的。
-
Python 实现:http://scikit-learn.org/stable/modules/clustering.html#affinity-propagation
-
R 实现:https://cran.r-project.org/web/packages/apcluster/index.html
2.3 层次聚类(Hierarchical / Agglomerative)
层次聚类是一系列基于以下概念的聚类算法:
-
最开始由一个数据点作为一个集群
-
对于每个集群,基于相同的标准合并集群
-
重复这一过程直到只留下一个集群,因此就得到了集群的层次结构。
-
优点:层次聚类最主要的优点是集群不再需要假设为类球形。另外其也可以扩展到大数据集。
-
缺点:有点像 K 均值聚类,该算法需要设定集群的数量(即在算法完成后需要保留的层次)。
-
Python 实现:http://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering
-
R 实现:https://stat.ethz.ch/R-manual/R-devel/library/stats/html/hclust.html
2.4 DBSCAN
DBSCAN 是一个基于密度的算法,它将样本点的密集区域组成一个集群。最近还有一项被称为 HDBSCAN 的新进展,它允许改变密度集群。
-
优点:DBSCAN 不需要假设集群为球状,并且它的性能是可扩展的。此外,它不需要每个点都被分配到一个集群中,这降低了集群的异常数据。
-
缺点:用户必须要调整「epsilon」和「min_sample」这两个定义了集群密度的超参数。DBSCAN 对这些超参数非常敏感。
-
Python 实现:http://scikit-learn.org/stable/modules/clustering.html#dbscan
-
R 实现:https://cran.r-project.org/web/packages/dbscan/index.html
结语
本文从回归问题、分类问题和聚类问题三个角度下初步了解了各个算法的优缺点,也基本了解了那些算法到底是什么。但以上每一个算法都有更多的概念和细节没有展现出来,我们不能知道它们的损失函数是什么、训练目标是什么、权重更新策略是什么等等一些列问题。因此我们希望能从机器之心历来文章中搜寻一些,为有兴趣的读者提供这些算法的具体细节。
线性回归:
决策树(集成方法):
支持向量机:
深度学习:
聚类算法:
3.回归(regression)
有监督学习的两大应用之一,产生连续的结果。
例如向模型输入人的各种数据的训练样本,产生“输入一个人的数据,判断此人20年后今后的经济能力”的结果,结果是连续的,往往得到一条回归曲线。当输入自变量不同时,输出的因变量非离散分布。
回归方法是一种对数值型连续随机变量进行预测和建模的监督学习算法。使用案例一般包括房价预测、股票走势或测试成绩等连续变化的案例。
回归任务的特点是标注的数据集具有数值型的目标变量。也就是说,每一个观察样本都有一个数值型的标注真值以监督算法。
3.1 线性回归(正则化)
线性回归是处理回归任务最常用的算法之一。该算法的形式十分简单,它期望使用一个超平面拟合数据集(只有两个变量的时候就是一条直线)。如果数据集中的变量存在线性关系,那么其就能拟合地非常好。
在实践中,简单的线性回归通常被使用正则化的回归方法(LASSO、Ridge 和 Elastic-Net)所代替。正则化其实就是一种对过多回归系数采取惩罚以减少过拟合风险的技术。当然,我们还得确定惩罚强度以让模型在欠拟合和过拟合之间达到平衡。
-
优点:线性回归的理解与解释都十分直观,并且还能通过正则化来降低过拟合的风险。另外,线性模型很容易使用随机梯度下降和新数据更新模型权重。
-
缺点:线性回归在变量是非线性关系的时候表现很差。并且其也不够灵活以捕捉更复杂的模式,添加正确的交互项或使用多项式很困难并需要大量时间。
-
Python 实现:http://scikit-learn.org/stable/modules/linear_model.html
-
R 实现:https://cran.r-project.org/web/packages/glmnet/index.html
3.2 回归树(集成方法)
回归树(决策树的一种)通过将数据集重复分割为不同的分支而实现分层学习,分割的标准是最大化每一次分离的信息增益。这种分支结构让回归树很自然地学习到非线性关系。
集成方法,如随机森林(RF)或梯度提升树(GBM)则组合了许多独立训练的树。这种算法的主要思想就是组合多个弱学习算法而成为一种强学习算法,不过这里并不会具体地展开。在实践中 RF 通常很容易有出色的表现,而 GBM 则更难调参,不过通常梯度提升树具有更高的性能上限。
-
优点:决策树能学习非线性关系,对异常值也具有很强的鲁棒性。集成学习在实践中表现非常好,其经常赢得许多经典的(非深度学习)机器学习竞赛。
-
缺点:无约束的,单棵树很容易过拟合,因为单棵树可以保留分支(不剪枝),并直到其记住了训练数据。集成方法可以削弱这一缺点的影响。
-
随机森林 python 实现:http://scikit-learn.org/stable/modules/ensemble.html#random-forests
-
随机森林 R 实现:https://cran.r-project.org/web/packages/randomForest/index.html
-
梯度提升树 Python 实现:http://scikit-learn.org/stable/modules/ensemble.html#classification
-
梯度提升树 R 实现:https://cran.r-project.org/web/packages/gbm/index.html
3.3 深度学习
深度学习是指能学习极其复杂模式的多层神经网络。该算法使用在输入层和输出层之间的隐藏层对数据的中间表征建模,这也是其他算法很难学到的部分。
深度学习还有其他几个重要的机制,如卷积和 drop-out 等,这些机制令该算法能有效地学习到高维数据。然而深度学习相对于其他算法需要更多的数据,因为其有更大数量级的参数需要估计。
-
优点:深度学习是目前某些领域最先进的技术,如计算机视觉和语音识别等。深度神经网络在图像、音频和文本等数据上表现优异,并且该算法也很容易对新数据使用反向传播算法更新模型参数。它们的架构(即层级的数量和结构)能够适应于多种问题,并且隐藏层也减少了算法对特征工程的依赖。
-
缺点:深度学习算法通常不适合作为通用目的的算法,因为其需要大量的数据。实际上,深度学习通常在经典机器学习问题上并没有集成方法表现得好。另外,其在训练上是计算密集型的,所以这就需要更富经验的人进行调参(即设置架构和超参数)以减少训练时间。
-
Python 资源:https://keras.io/
-
R 资源:http://mxnet.io/
3.4 最近邻算法
最近邻算法是「基于实例的」,这就意味着其需要保留每一个训练样本观察值。最近邻算法通过搜寻最相似的训练样本来预测新观察样本的值。
而这种算法是内存密集型,对高维数据的处理效果并不是很好,并且还需要高效的距离函数来度量和计算相似度。在实践中,基本上使用正则化的回归或树型集成方法是最好的选择。