【算法】机器学习算法(上)——算法概述及

【算法】机器学习算法(上)——算法概述

按照不同的分类标准,可以把机器学习的算法做不同的分类。

◆◆◆

从机器学习问题角度分类

我们先从机器学习问题本身分类的角度来看,我们可以分成下列类型的算法:

监督学习算法

机器学习中有一大部分的问题属于『监督学习』的范畴,简单口语化地说明,这类问题中,给定的训练样本中,每个样本的输入x都对应一个确定的结果y,我们需要训练出一个模型(数学上看是一个x→y的映射关系f),在未知的样本x′给定后,我们能对结果y′做出预测。

这里的预测结果如果是离散值(很多时候是类别类型,比如邮件分类问题中的垃圾邮件/普通邮件,比如用户会/不会购买某商品),那么我们把它叫做分类问题(classificationproblem);如果预测结果是连续值(比如房价,股票价格等等),那么我们把它叫做回归问题(regressionproblem)。

有一系列的机器学习算法是用以解决监督学习问题的,比如最经典的用于分类问题的朴素贝叶斯、逻辑回归、支持向量机等等;比如说用于回归问题的线性回归等等。

无监督学习

有另外一类问题,给我们的样本并没有给出『标签/标准答案』,就是一系列的样本。而我们需要做的事情是,在一些样本中抽取出通用的规则。这叫做『无监督学习』。包括关联规则和聚类算法在内的一系列机器学习算法都属于这个范畴。

半监督学习

这类问题给出的训练数据,有一部分有标签,有一部分没有标签。我们想学习出数据组织结构的同时,也能做相应的预测。此类问题相对应的机器学习算法有自训练(Self-Training)、直推学习(TransductiveLearning)、生成式模型(GenerativeModel)等。

总体说来,最常见是前两类问题,而对应前两类问题的一些机器学习算法如下:

◆◆◆

从算法的功能角度分类

我们也可以从算法的共性(比如功能,运作方式)角度对机器学习算法分类。下面我们根据算法的共性去对它们归个类。不过需要注意的是,我们下面的归类方法可能对分类和回归有比较强的倾向性,而这两类问题也是最常遇到的。

回归算法(RegressionAlgorithms)

回归算法是一种通过最小化预测值与实际结果值之间的差距,而得到输入特征之间的最佳组合方式的一类算法。对于连续值预测有线性回归等,而对于离散值/类别预测,我们也可以把逻辑回归等也视作回归算法的一种,常见的回归算法如下:

OrdinaryLeastSquaresRegression(OLSR)

LinearRegression

LogisticRegression

StepwiseRegression

LocallyEstimatedScatterplotSmoothing(LOESS)

MultivariateAdaptiveRegressionSplines(MARS)

基于实例的算法(Instance-basedAlgorithms)

这里所谓的基于实例的算法,我指的是我们最后建成的模型,对原始数据样本实例依旧有很强的依赖性。这类算法在做预测决策时,一般都是使用某类相似度准则,去比对待预测的样本和原始样本的相近度,再给出相应的预测结果。常见的基于实例的算法有:

k-NearestNeighbour(kNN)

LearningVectorQuantization(LVQ)

Self-OrganizingMap(SOM)

LocallyWeightedLearning(LWL)

决策树类算法(DecisionTreeAlgorithms)

决策树类算法,会基于原始数据特征,构建一颗包含很多决策路径的树。预测阶段选择路径进行决策。常见的决策树算法包括:

ClassificationandRegressionTree(CART)

IterativeDichotomiser3(ID3)

C4.5andC5.0(differentversionsofapowerfulapproach)

Chi-squaredAutomaticInteractionDetection(CHAID)

M5

ConditionalDecisionTrees

贝叶斯类算法(BayesianAlgorithms)

这里说的贝叶斯类算法,指的是在分类和回归问题中,隐含使用了贝叶斯原理的算法。包括:

NaiveBayes

GaussianNaiveBayes

MultinomialNaiveBayes

AveragedOne-DependenceEstimators(AODE)

BayesianBeliefNetwork(BBN)

BayesianNetwork(BN)

聚类算法(ClusteringAlgorithms)

聚类算法做的事情是,把输入样本聚成围绕一些中心的『数据团』,以发现数据分布结构的一些规律。常用的聚类算法包括:

k-Means

HierarchicalClustering

ExpectationMaximisation(EM)

关联规则算法(AssociationRuleLearningAlgorithms)

关联规则算法是这样一类算法:它试图抽取出,最能解释观察到的训练样本之间关联关系的规则,也就是获取一个事件和其他事件之间依赖或关联的知识,常见的关联规则算法有:

Apriorialgorithm

Eclatalgorithm

人工神经网络类算法(ArtificialNeuralNetworkAlgorithms)

这是受人脑神经元工作方式启发而构造的一类算法。需要提到的一点是,我把『深度学习』单拎出来了,这里说的人工神经网络偏向于更传统的感知算法,主要包括:

Perceptron

Back-Propagation

RadialBasisFunctionNetwork(RBFN)

深度学习(DeepLearningAlgorithms)

深度学习是近年来非常火的机器学习领域,相对于上面列的人工神经网络算法,它通常情况下,有着更深的层次和更复杂的结构。最常见的深度学习算法包括:

DeepBoltzmannMachine(DBM)

DeepBeliefNetworks(DBN)

ConvolutionalNeuralNetwork(CNN)

StackedAuto-Encoders

降维算法(DimensionalityReductionAlgorithms)

从某种程度上说,降维算法和聚类其实有点类似,因为它也在试图发现原始训练数据的固有结构,但是降维算法在试图,用更少的信息(更低维的信息)总结和描述出原始信息的大部分内容。有意思的是,降维算法一般在数据的可视化,或者是降低数据计算空间有很大的作用。它作为一种机器学习的算法,很多时候用它先处理数据,再灌入别的机器学习算法学习。主要的降维算法包括:

PrincipalComponentAnalysis(PCA)

PrincipalComponentRegression(PCR)

PartialLeastSquaresRegression(PLSR)

SammonMapping

MultidimensionalScaling(MDS)

LinearDiscriminantAnalysis(LDA)

MixtureDiscriminantAnalysis(MDA)

QuadraticDiscriminantAnalysis(QDA)

FlexibleDiscriminantAnalysis(FDA)

模型融合算法(EnsembleAlgorithms)

严格意义上来说,这不算是一种机器学习算法,而更像是一种优化手段/策略,它通常是结合多个简单的弱机器学习算法,去做更可靠的决策。拿分类问题举个例,直观的理解,就是单个分类器的分类是可能出错,不可靠的,但是如果多个分类器投票,那可靠度就会高很多。常用的模型融合增强方法包括:

RandomForest

Boosting

BootstrappedAggregation(Bagging)

AdaBoost

StackedGeneralization(blending)

GradientBoostingMachines(GBM)

GradientBoostedRegressionTrees(GBRT)

◆◆◆

机器学习算法使用图谱

scikit-learn作为一个丰富的python机器学习库,实现了绝大多数机器学习的算法,有相当多的人在使用。既然讲机器学习,我们就用机器学习的语言来解释一下,这是针对实际应用场景的各种条件限制,对scikit-learn里完成的算法构建的一颗决策树,每一组条件都是对应一条路径,能找到相对较为合适的一些解决方法,具体如下:

首先样本量如果非常少的话,其实所有的机器学习算法都没有办法从里面『学到』通用的规则和模式,so多弄点数据是王道。然后根据问题是有/无监督学习和连续值/离散值预测,分成了分类、聚类、回归和维度约减四个方法类,每个类里根据具体情况的不同,又有不同的处理方法。

◆◆◆

数据与可视化

我们先使用scikit-learn的make_classification函数来生产一份分类数据,然后模拟一下拿到实际数据后我们需要做的事情。

#numpy科学计算工具箱

importnumpyasnp

#使用make_classification构造个样本,每个样本有20个feature

fromsklearn.datasetsimportmake_classification

X,y=make_classification(,n_features=20,n_informative=2,n_redundant=2,n_classes=2,random_state=0)

#存为dataframe格式

frompandasimportDataFrame

df=DataFrame(np.hstack((X,y[:,None])),columns=range(20)+["class"])

我们生成了一份包含个分类数据样本的数据集,每个样本有20个数值特征。同时我们把数据存储至pandas中的DataFrame数据结构中。我们取前几行的数据看一眼:

df[:6]

不幸的是,肉眼看数据,尤其是维度稍微高点的时候,很有可能看花了也看不出看不出任何线索。幸运的是,我们对于图像的理解力,比数字好太多,而又有相当多的工具可以帮助我们『可视化』数据分布。

我们在处理任何数据相关的问题时,了解数据都是很有必要的,而可视化可以帮助我们更好地直观理解数据的分布和特性

数据的可视化有很多工具包可以用,比如下面我们用来做数据可视化的工具包Seaborn。最简单的可视化就是数据散列分布图和柱状图,这个可以用Seanborn的pairplot来完成。以下图中2种颜色表示2种不同的类,因为20维的可视化没有办法在平面表示,我们取出了一部分维度,两两组成pair看数据在这2个维度平面上的分布状况,代码和结果如下:

importmatplotlib.pyplotasplt

importseabornassns

#使用pairplot去看不同特征维度pair下数据的空间分布状况

_=sns.pairplot(df[:50],vars=[8,11,12,14,19],hue="class",size=1.5)

plt.show()

我们从散列图和柱状图上可以看出,确实有些维度的特征相对其他维度,有更好的区分度,比如第11维和14维看起来很有区分度。这两个维度上看,数据点是近似线性可分的。而12维和19维似乎呈现出了很高的负相关性。接下来我们用Seanborn中的corrplot来计算计算各维度特征之间(以及最后的类别)的相关性。代码和结果图如下:

importmatplotlib.pyplotasplt

plt.figure(figsize=(12,10))

_=sns.corrplot(df,annot=False)

plt.show()

相关性图很好地印证了我们之前的想法,可以看到第11维特征和第14维特征和类别有极强的相关性,同时它们俩之间也有极高的相关性。而第12维特征和第19维特征却呈现出极强的负相关性。强相关的特征其实包含了一些冗余的特征,而除掉上图中颜色较深的特征,其余特征包含的信息量就没有这么大了,它们和最后的类别相关度不高,甚至各自之间也没什么先惯性。

插一句,这里的维度只有20,所以这个相关度计算并不费太大力气,然而实际情形中,你完全有可能有远高于这个数字的特征维度,同时样本量也可能多很多,那种情形下我们可能要先做一些处理,再来实现可视化了。

本文主要从不同类别划分来介绍目前机器学习的算法,以及每类算法的主要应用场景,在下篇中,我们将主要介绍机器学习解决问题的思路。









































北京哪家医院看白癜风最好
哪个医院白癜风好治



转载请注明:http://www.92nongye.com/txjg/204612342.html