区块链技术博客
www.b2bchain.cn

入门篇——解析Python机器学习中有监督学习的六种经典算法求职学习资料

本文介绍了入门篇——解析Python机器学习中有监督学习的六种经典算法求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

一、基本概念

机器学习指的是在让计算机不经过传统的明显编程的情况下,对数据进行自我学习并正确做出预测或分类的一种方法,属于计算机科学领域中的一部分。机器学习的应用场景在当今社会中有很多,比如:电子商务中的智能推荐、互联网金融中的风控系统、新闻资讯中的内容审查以及2016年Google旗下首次战胜人类围棋世界冠军的大名鼎鼎的AlphaGo等等。

在机器学习领域,有两类常用的方法就是有监督学习和无监督学习。其中,有监督学习是通过包含了样本特征变量及分类标签的现有训练数据集进行建模,再用该模型对新的数据样本进行分类或回归分析的机器学习方法;无监督学习是在没有训练数据集的情况下,对没有标签的数据进行分析并建立合适的模型以给出问题解决方案的机器学习方法,常见的无监督学习方法包括将样本特征变量降维的数据转换和把样本划归到不同分组的聚类分析。

本次入门篇重点介绍有监督学习中应用于分类和回归任务中的K最近邻算法线性模型朴素贝叶斯算法决策树算法支持向量机神经网络这六种经典机器学习算法的原理、功能和优缺点以及用法。所谓分类,指的是对样本的类标签进行预测,判断样本属于哪一个分类,其结果是离散的数值。而对于回归分析来说,其目标是要预测一个连续的数值或范围。

在正式介绍经典机器学习算法之前,再掌握三个专用术语:模型的泛化(generalization)是指在有监督学习中,将在训练数据集上建立的模型用于新的、之前从未见过的数据中,这个过程称之为模型的泛化,那么我们希望模型对于新数据的预测也尽可能准确,才能说模型泛化的准确度比较高,这时我们就可以用测试数据集对模型的实际表现进行评估;如果训练出来的模型在拟合训练数据集时表现非常好,而在测试数据集上表现的非常差,这时我们称之为模型过拟合(overfitting);相反地,如果模型相对较为简单,在训练数据集和测试数据集上的表现都比较差的话,我们称之为模型欠拟合(underfitting)。

二、有监督学习中的六种经典机器学习方法

1. K最近邻算法(K-Nearest Neighbors,KNN)

1.1 基本原理

K最近邻算法用于分类时,其分类原理为:设定最近邻个数K的值后,在与新数据点距离最近的K个训练数据点中,属于哪一类的训练数据点的个数在K个中占大多数,新数据点就属于这一类。如图1所示,设定新数据点的最近邻个数K等于3时,找出距离新数据点最近的3个训练数据点,发现与新数据点距离最近的3个训练数据点中,有2个是属于深色分类,只有1个属于浅色分类,根据上述K最近邻算法的原理,新数据点应该属于深色分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图1 K最近邻算法用于分类任务的示意图

同理,K最近邻算法用于回归时,其回归原理为:设定最近邻个数K的值后,在与新数据点距离最近的K个训练数据点中,将这些训练数据点的y值取平均值,并把该平均值作为新数据点的预测值。

1.2 功能以及优缺点

K最近邻算法既可用于分类任务,又可用于回归分析。在实际使用中,为了使训练出的模型的泛化效果更好,需要尝试调节的参数只有最近邻个数K的值。其优点是原理简单,十分容易理解;缺点是对数据集的预处理要求较高、对规模较大的数据集训练时间较长、对特征变量数目较多的高维数据集拟合欠佳以及对稀疏数据集无法拟合等。所以,工程实际中,K最近邻算法的应用并不多见,但作为机器学习的入门算法,该算法十分容易上手。

1.3 用法

本文代码运行所用到的环境配置、机器学习库以及编码工具为:Python 3.7,Numpy基础科学计算库,Scipy科学计算工具库,matplotlib画图工具库,scikit-learn机器学习库,Jupyter Notebook 1.0。另外,除Python 3.7以外,这些机器学习库和Jupyter Notebook均使用pip命令以管理员身份在cmd中进行联网下载,下载完毕后可断网编码和运行。

(1)K最近邻分类

scikit-learn库中内置了若干个数据集,还设置了一些API供学者自己动手生成一些自己想要的数据集。在Jupyter notebook中输入以下代码便可手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并赋值给X和y。其中,X为二维向量,存储以上生成的有2个特征变量的训练数据,y为一维向量,存储以上每个训练数据所属的分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图2 生成样本数量为500,分类数量为5,特征变量数为2的数据集的代码

K最近邻算法用于分类任务时,需要先从scikit-learn库中导入K最近邻分类器KNeighborsClassifier,再通过训练数据X,y利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图3 K最近邻算法用于分类任务进行模型训练的核心代码

使用K最近邻算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图4所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图4 K最近邻算法对5类数据进行分类的结果图

图4中红色五角星就是位于(6.75,4.82)的待分类的新数据点,从图4中看出,KNN算法训练出的分类模型将其划分到了编号为[1]的深蓝色的一类中。此外,为方便起见,此处就将训练数据集当做测试数据集,运行图3的代码,对新训练出的分类模型的评分为0.96,这意味着该模型能对96%的数据点进行正确分类,说明该模型的效果还是不错的。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图5 K最近邻算法对新训练出的分类模型的评分图

(2)K最近邻回归

在Jupyter notebook中输入以下代码便可手动生成一个噪声为50,特征变量数为1的数据集,并赋值给X和y。其中,X为一维向量,存储以上生成的有1个特征变量的训练数据,y为一维向量,存储以上每个训练数据的测定值。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图6 生成噪声为50,特征变量数为1的数据集的代码

K最近邻算法用于回归分析时,需要先从scikit-learn库中导入K最近邻回归器KNeighborsRegressor,再通过训练数据X,y利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过函数predict( )对一个新数据进行预测其回归值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图7 K最近邻算法用于回归分析进行模型训练的核心代码

使用K最近邻算法对以上噪声为50,特征变量数为1的数据集进行回归分析,将其回归结果可视化后,如图8所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图8 K=2时K最近邻算法对噪声为50,特征变量数为1的数据进行回归的结果图

图8中红色五角星就是特征值为2.75的待回归的新数据点,从图8中看出,KNN算法训练出的回归模型给出其回归值为175.31136969。此外,此处同样将训练数据集当做测试数据集,运行图7的代码,对新训练出的回归模型的评分为0.86,这意味着该模型能对86%的数据点进行正确回归(或称为预测)其测定值,说明该模型的效果还可以。

补充:上述回归模型是K最近邻回归器KNeighborsRegressor在最近邻个数K的值取为2的情况下训练得到的。我们知道,影响K最近邻算法在分类或回归模型中的训练效果的参数只有最近邻个数K。下面尝试将该参数值调节为5时,观察下对训练出的回归模型的影响如何。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图9 K=5时K最近邻算法对噪声为50,特征变量数为1的数据进行回归的结果图

从图9可以看出,相比于最近邻个数K=2,K=5时训练出的回归模型的正确率由86%下降到了77%,说明在使用K最近邻算法时,对最近邻个数K的值进行调节以使训练出的模型的拟合效果更好是很有必要的。

2. 线性模型(Linear Model,LM)

2.1 基本原理

线性模型是一类模型,而非一个模型,在机器学习领域,常用的线性模型包括线性回归、岭回归和套索回归等。线性模型主要用于回归分析,其一般性公式为:

$$hat{y}=w[0]times x[0]+w[1]times x[1]+…+w[n]times x[n]+b$$

式中,$x[n]$为数据集中第$n$个特征变量,$x[0],x[1],…,x[n]$为数据集中一个数据的全部特征变量,$w[n]$为线性模型中第$n$个特征变量的系数,$w$和$b$均为线性模型的参数,$hat{y}$为线性模型对于新数据点的预测值。

因此,基于上述公式,线性回归模型的基本原理是,在训练数据集的所有数据中寻找$y$的预测值与每个数据的真实值的平方差最小时所对应的$n$个参数$w$值和一个参数$b$值。

岭回归模型的基本原理是,岭回归模型实际上是一种改良的线性回归模型(也称为最小二乘法),训练得到的模型中会保留所有的特征变量,但会减小特征变量前面的系数值,让特征变量对回归结果的影响变小。这种通过保留全部特征变量,而只减小特征变量前面的系数值来避免过拟合的方法,在机器学习领域称为L2正则化,在岭回归中通过改变alpha参数来控制减小特征变量前面系数的程度。

套索回归模型的基本原理是,套索回归模型本质上也是一种改良的线性回归模型,也会通过减小特征变量前面的系数值让特征变量对回归结果的影响变小,但与岭回归模型不同的是,套索回归训练得到的模型中不一定会保留所有的特征变量,有一些特征变量会被模型彻底忽略掉,这样其实可以突出体现模型中最重要的那些特征。这种通过减小特征变量前面的系数值,使一部分特征前面的系数正好等于0的方法,在机器学习领域称为L1正则化,在套索回归中同样通过改变alpha参数来控制减小特征变量前面系数的程度。

2.2 功能以及优缺点

线性回归模型主要用于回归分析,其优点是没有需要用户进行调节的参数,而模型中的参数$w$和$b$是由训练数据自身训练出来的,不是用来调节模型复杂度的参数;当然,其优点也会成为缺点,那就是用户无法控制模型的复杂程度。

岭回归模型同样主要用于回归分析,其优点是通过调节alpha参数值来控制模型的复杂程度,进而能避免出现过拟合现象的发生,使训练出的模型的泛化能力更好。其中,L2正则项参数alpha的调节规律为:alpha值越大,特征变量前的系数越小,降低模型在训练集上的性能,训练出的模型的复杂度越低,越不容易出现过拟合;相反地,alpha值越小甚至趋于0,那么特征变量前的系数越不受限制,训练得到的回归模型也会非常接近线性回归所得到的模型。

套索回归模型同样用于回归分析,其优点也是通过调节alpha参数值来控制模型的复杂程度,但与岭回归模型不同的是,其优势主要体现在当训练数据的特征过多,而只有一小部分才是真正重要的特征时,套索回归能够记住这些重要的特征而忽略那些不重要的特征。其中,L1正则项参数alpha的调节规律与上述岭回归模型中的L2正则项参数alpha的调节规律完全一致。

虽然线性模型是一类历史相当悠久的回归模型,但目前的应用仍然非常普遍,原因就在于线性模型相对于超大型数据集来说,其训练速度非常之快。在实际应用中,常常需要决定是使用L2正则化的岭回归模型还是L1正则化的套索回归模型,大体遵循的原则是,如果数据集中的数据有很多特征,而这些特征并不是每一个都很重要,那么就使用L1正则化的套索回归模型;但如果数据的特征并不多,而且每一个都很重要的话,就应该使用L2正则化的岭回归模型。

2.3 用法

(1)线性回归模型

scikit-learn库中内置了若干个收集于真实世界的数据集,真实数据集中数据的特征变量的数目往往会比较多,且噪声也不小。在Jupyter notebook中输入以下代码便可生成一个特征变量数为10的糖尿病情数据集,并赋值给X和y。之后使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合,其中,默认情况下是将75%的数据及所对应的标签随机划归到训练数据集,其余25%的数据和其标签划归到测试数据集。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图10 生成特征变量数为10的糖尿病情训练数据集和测试数据集的代码

线性回归用于回归分析时,需要先从scikit-learn库中导入线性回归器LinearRegression,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图11 线性回归模型用于回归分析进行模型训练的核心代码

使用线性回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图12所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图12 线性回归模型对特征变量数为10的糖尿病情数据进行回归的结果图

补充:从图12的评分结果看出,线性回归模型在对特征变量数为10的糖尿病情数据进行训练的过程中出现了过拟合的问题,而且拟合(或称为回归)效果并不理想。此时,我们就需要对线性回归模型稍作改进,使之能够克服线性回归模型中不能控制模型复杂度的缺点。

(2)岭回归模型——L2正则化的线性模型

同样使用上述生成的糖尿病情数据集来测试岭回归模型,岭回归用于回归分析时,需要先从scikit-learn库中导入岭回归器Ridge,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图13 岭回归模型用于回归分析进行模型训练的核心代码

使用岭回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图14所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图14 alpha = 0.8时,岭回归模型对特征变量数为10的糖尿病情数据进行回归的结果图

补充:对比图14和图12的评分结果,可以看出岭回归模型在对上述的糖尿病情数据进行训练的过程中,虽然在训练集上的评分不如线回归模型,但在测试集上的评分与之几乎无差,而且还避免了线性回归模型容易出现的过拟合问题,更有助于新训练出的模型进行泛化,而这完全是因为alpha参数能够控制模型的复杂度。

(3)套索回归模型——L1正则化的线性模型

同样使用上述生成的糖尿病情数据集来测试套索回归模型,套索回归用于回归分析时,需要先从scikit-learn库中导入套索回归器Ridge,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图15 套索回归模型用于回归分析进行模型训练的核心代码

使用套索回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图16所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图16 alpha = 0.45时,套索回归模型对特征变量数为10的糖尿病情数据回归的结果图

补充:对比图16和图14的评分结果,可以看出套索回归模型在对上述的糖尿病情数据进行训练的过程中,在原本10个特征变量中只保留了4个重要的特征,其余6个特征前的系数被赋为0,也就意味着这6个特征被套索回归训练出的模型忽略掉了,而且还避免出现过拟合问题。

3. 朴素贝叶斯算法(Naive Bayes,NB)

3.1 基本原理

朴素贝叶斯算法是基于贝叶斯定理的一类分类算法,在机器学习领域,常用的朴素贝叶斯算法包括伯努利朴素贝叶斯、高斯朴素贝叶斯和多项式朴素贝叶斯等。之所以称之为“朴素”,是因为该算法是基于样本特征之间相互独立的“朴素”假设,正是因为该假设,朴素贝叶斯分类器的效率非常之高。其中,贝叶斯定理是基于概率论中的条件概率所提出的,其一般性公式为:

$$P(A|B)=frac{P(B|A)times P(A)}{P(B)}=frac{P(AB)}{P(B)}$$

式中,$P(A)$为事件$A$发生的概率,$P(B)$为事件$B$发生的概率,$P(AB)$为事件$A$和事件$B$同时发生的概率,$P(A|B)$为在事件$B$发生的情况下,事件$A$发生的概率,$P(B|A)$为在事件$A$发生的情况下,事件$B$发生的概率。

3.2 功能以及优缺点

伯努利朴素贝叶斯主要用于分类任务,其优点是把数据集中的各个特征看做完全独立,而不考虑特征之间的关联关系,这样就会使得算法的效率很高;但是伯努利朴素贝叶斯算法仅适用于服从二项式分布的数据集(也就是数据集中的每个特征都只有0和1两个取值)。

高斯朴素贝叶斯同样用于分类任务,其优点也是效率很高,该算法适用但不仅限于服从高斯分布的数据集(也就是数据集中的数据服从正态分布)。

多项式朴素贝叶斯同样也是用于分类任务,其优点也是效率很高,缺点是对训练数据的预处理要求较高,因为该算法要求输入的数据必须非负,同时该算法只适用于多项式分布的数据集(也就是数据集中数据的特征为非负离散型)。所谓多项式分布可以用掷骰子来理解,我们知道骰子有6个面,每掷一次骰子结果都有可能1~6这6个数字中任意一个面朝上,如果掷$n$次骰子,每个面朝上的次数的分布情况,就是一个多项式分布。

3.3 用法

(1)伯努利朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为2,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。伯努利朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入伯努利朴素贝叶斯分类器BernoulliNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图17 伯努利朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用伯努利朴素贝叶斯算法对以上2类、共500个数据进行分类,将其分类结果可视化后,如图18所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图18 伯努利朴素贝叶斯算法对2类数据进行分类的结果图

图18中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图18中看出,伯努利朴素贝叶斯算法训练出的分类模型将其划分到了编号为[1]的黄色的一类中。此外,运行图17的代码,利用测试数据集对新训练出的分类模型的评分为0.91,这意味着该模型能对91%的数据点进行正确分类,说明该模型的效果还是不错的。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图19 伯努利朴素贝叶斯算法对新训练出的分类模型的评分图

当数据集中的特征数量大于2类,也就是数据集不符合二项式分布时,我们观察一下使用伯努利朴素贝叶斯算法的分类效果如何。因此,尝试使用伯努利朴素贝叶斯算法对手动生成的5类、共500个数据进行分类,将其分类结果可视化后,如图20所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图20 伯努利朴素贝叶斯算法对5类数据进行分类的结果图

从图20可以看出,利用测试数据集对新训练出的分类模型的评分为0.52,意味着该模型只能对一半左右的数据点进行正确分类。这说明当数据集中的数据不服从二项式分布时,伯努利朴素贝叶斯算法训练出的分类模型的效果比较糟糕。

(2)高斯朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。高斯朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入高斯朴素贝叶斯分类器GaussianNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图21 高斯朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用高斯朴素贝叶斯算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图22所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图22 高斯朴素贝叶斯算法对5类数据进行分类的结果图

图22中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图22中看出,高斯朴素贝叶斯算法训练出的分类模型将其划分到了编号为[3]的浅绿色的一类中。此外,运行图21的代码,利用测试数据集对新训练出的分类模型的评分为0.85,意味着该模型能对85%的数据点进行正确分类,这说明当数据集中的数据不服从二项分布时,相比于伯努利朴素贝叶斯算法训练出的分类模型,高斯朴素贝叶斯算法训练出的分类模型的效果更好。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图23 高斯朴素贝叶斯算法对新训练出的分类模型的评分图

(3)多项式朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。在正式使用多项式朴素贝叶斯算法之前,需要使用数据预处理工具MinMaxScaler对输入数据进行预处理,使输入数据全部为非负值。多项式朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入多项式朴素贝叶斯分类器MultinomialNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图24 多项式朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用多项式朴素贝叶斯算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图25所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图25 多项式朴素贝叶斯算法对5类数据进行分类的结果图

图25中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图25中看出,多项式朴素贝叶斯算法训练出的分类模型将其划分到了编号为[4]的黄色的一类中。此外,运行图24的代码,利用测试数据集对新训练出的分类模型的评分为0.50,意味着该模型只能对一半的数据点进行正确分类,比伯努利朴素贝叶斯算法对这5类数据进行分类的结果还差一些,这是因为这个数据集中的数据不服从多项式分布,多项式朴素贝叶斯算法只适用于对非负离散数值特征的数据集进行分类,比如对转化为向量后的文本数据进行分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图26 多项式朴素贝叶斯算法对新训练出的分类模型的评分图

4. 决策树算法(Decision Tree,DT)

4.1 基本原理

决策树算法的基本原理是通过对一系列问题进行if/else的分支推导,最终实现分类或决策。如图27所示,设定一个决策深度为2层的简单的提问决策树有4片决策树树叶,分别是狮子、小鸡、苹果和花生。通过构建如图27所示的几个简单的问题进行if/else的分支推导便可到达最顶层(最下面为最顶层)的树叶处,这便实现了分类、预测或决策的功能。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图27 决策树算法用于分类任务的示意图

随机决策森林算法是一种集合学习方法,也就是将多个机器学习算法综合在一起来对模型进行训练的方法。其基本原理是把不同的几颗决策树打包到一起,每颗决策树的参数都不相同,最后把每颗决策树预测的结果取平均值,这样既可以保留每颗决策树的贡献,又可降低训练出的模型出现过拟合的风险。

4.2 功能以及优缺点

决策树算法主要用于分类任务,在实际应用中,需要调节的参数只有决策树的深度max_depth的值。其优点是很容易将模型可视化,十分容易理解,并且几乎不需要对输入数据进行预处理;缺点是不可避免会出现过拟合的问题,让训练出的模型的泛化性能有所下降。

随机决策森林算法既可用于分类任务,也可用于回归分析。在实际应用中,需要调节的参数有多个:一是bootstrap参数,用来控制从样本空间进行抽样的方式,其有“放回抽样”的功能,也就是每次可从数据集中重复抽取同一个样本,这样做的目的是通过这种方式可以每次重新生成数据集,让随机森林中的每一颗决策树在构建时彼此之间有差异;二是max_features参数,用来控制每颗决策树所选择的特征数量的最大值,其功能是max_features参数取值越高,随机森林中的每一颗决策树之间的差异越小,因为它们有更多不同的特征可以选择,更容易拟合数据,反之max_features参数取值越低,随机森林中的每一颗决策树之间的差异越大,因为它们没有不同的特征可以选择,这就迫使每颗决策树的样子更加不同;三是n_estimators参数,用来控制随机森林中决策树的数量,如果用来回归分析时,随机森林会把所有决策树预测的值取平均值,如果用来分类的话,随机森林会把所有决策树对每一分类进行预测的概率值取平均值,然后会把样本放入概率最高的分类当中;四是n_jobs参数,用来控制并行处理的CPU内核数,当n_jobs=-1时,随机森林会使用CPU的全部内核,处理速度极大提升;五是random_state参数,用来控制随机森林生成每颗决策树的方法的随机程度,如果不希望训练出的模型的结果太过于不稳定,一定要固化random_state参数的数值。随机决策森林算法的优点集成了决策树的所有优点,而且还能弥补决策树的不足,此外,随机决策森林算法还支持并行处理,对于超大规模的数据集可多进程并行处理来节省时间;其缺点是对于超高维数据集和稀疏数据集,随机决策森林算法的表现有些差强人意,这种情况下线性模型的效果会更好一些,此外,随机决策森林算法更消耗内存,速度也比线性模型要慢。

4.3 用法

(1)决策树算法

一、基本概念

机器学习指的是在让计算机不经过传统的明显编程的情况下,对数据进行自我学习并正确做出预测或分类的一种方法,属于计算机科学领域中的一部分。机器学习的应用场景在当今社会中有很多,比如:电子商务中的智能推荐、互联网金融中的风控系统、新闻资讯中的内容审查以及2016年Google旗下首次战胜人类围棋世界冠军的大名鼎鼎的AlphaGo等等。

在机器学习领域,有两类常用的方法就是有监督学习和无监督学习。其中,有监督学习是通过包含了样本特征变量及分类标签的现有训练数据集进行建模,再用该模型对新的数据样本进行分类或回归分析的机器学习方法;无监督学习是在没有训练数据集的情况下,对没有标签的数据进行分析并建立合适的模型以给出问题解决方案的机器学习方法,常见的无监督学习方法包括将样本特征变量降维的数据转换和把样本划归到不同分组的聚类分析。

本次入门篇重点介绍有监督学习中应用于分类和回归任务中的K最近邻算法线性模型朴素贝叶斯算法决策树算法支持向量机神经网络这六种经典机器学习算法的原理、功能和优缺点以及用法。所谓分类,指的是对样本的类标签进行预测,判断样本属于哪一个分类,其结果是离散的数值。而对于回归分析来说,其目标是要预测一个连续的数值或范围。

在正式介绍经典机器学习算法之前,再掌握三个专用术语:模型的泛化(generalization)是指在有监督学习中,将在训练数据集上建立的模型用于新的、之前从未见过的数据中,这个过程称之为模型的泛化,那么我们希望模型对于新数据的预测也尽可能准确,才能说模型泛化的准确度比较高,这时我们就可以用测试数据集对模型的实际表现进行评估;如果训练出来的模型在拟合训练数据集时表现非常好,而在测试数据集上表现的非常差,这时我们称之为模型过拟合(overfitting);相反地,如果模型相对较为简单,在训练数据集和测试数据集上的表现都比较差的话,我们称之为模型欠拟合(underfitting)。

二、有监督学习中的六种经典机器学习方法

1. K最近邻算法(K-Nearest Neighbors,KNN)

1.1 基本原理

K最近邻算法用于分类时,其分类原理为:设定最近邻个数K的值后,在与新数据点距离最近的K个训练数据点中,属于哪一类的训练数据点的个数在K个中占大多数,新数据点就属于这一类。如图1所示,设定新数据点的最近邻个数K等于3时,找出距离新数据点最近的3个训练数据点,发现与新数据点距离最近的3个训练数据点中,有2个是属于深色分类,只有1个属于浅色分类,根据上述K最近邻算法的原理,新数据点应该属于深色分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图1 K最近邻算法用于分类任务的示意图

同理,K最近邻算法用于回归时,其回归原理为:设定最近邻个数K的值后,在与新数据点距离最近的K个训练数据点中,将这些训练数据点的y值取平均值,并把该平均值作为新数据点的预测值。

1.2 功能以及优缺点

K最近邻算法既可用于分类任务,又可用于回归分析。在实际使用中,为了使训练出的模型的泛化效果更好,需要尝试调节的参数只有最近邻个数K的值。其优点是原理简单,十分容易理解;缺点是对数据集的预处理要求较高、对规模较大的数据集训练时间较长、对特征变量数目较多的高维数据集拟合欠佳以及对稀疏数据集无法拟合等。所以,工程实际中,K最近邻算法的应用并不多见,但作为机器学习的入门算法,该算法十分容易上手。

1.3 用法

本文代码运行所用到的环境配置、机器学习库以及编码工具为:Python 3.7,Numpy基础科学计算库,Scipy科学计算工具库,matplotlib画图工具库,scikit-learn机器学习库,Jupyter Notebook 1.0。另外,除Python 3.7以外,这些机器学习库和Jupyter Notebook均使用pip命令以管理员身份在cmd中进行联网下载,下载完毕后可断网编码和运行。

(1)K最近邻分类

scikit-learn库中内置了若干个数据集,还设置了一些API供学者自己动手生成一些自己想要的数据集。在Jupyter notebook中输入以下代码便可手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并赋值给X和y。其中,X为二维向量,存储以上生成的有2个特征变量的训练数据,y为一维向量,存储以上每个训练数据所属的分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图2 生成样本数量为500,分类数量为5,特征变量数为2的数据集的代码

K最近邻算法用于分类任务时,需要先从scikit-learn库中导入K最近邻分类器KNeighborsClassifier,再通过训练数据X,y利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图3 K最近邻算法用于分类任务进行模型训练的核心代码

使用K最近邻算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图4所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图4 K最近邻算法对5类数据进行分类的结果图

图4中红色五角星就是位于(6.75,4.82)的待分类的新数据点,从图4中看出,KNN算法训练出的分类模型将其划分到了编号为[1]的深蓝色的一类中。此外,为方便起见,此处就将训练数据集当做测试数据集,运行图3的代码,对新训练出的分类模型的评分为0.96,这意味着该模型能对96%的数据点进行正确分类,说明该模型的效果还是不错的。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图5 K最近邻算法对新训练出的分类模型的评分图

(2)K最近邻回归

在Jupyter notebook中输入以下代码便可手动生成一个噪声为50,特征变量数为1的数据集,并赋值给X和y。其中,X为一维向量,存储以上生成的有1个特征变量的训练数据,y为一维向量,存储以上每个训练数据的测定值。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图6 生成噪声为50,特征变量数为1的数据集的代码

K最近邻算法用于回归分析时,需要先从scikit-learn库中导入K最近邻回归器KNeighborsRegressor,再通过训练数据X,y利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过函数predict( )对一个新数据进行预测其回归值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图7 K最近邻算法用于回归分析进行模型训练的核心代码

使用K最近邻算法对以上噪声为50,特征变量数为1的数据集进行回归分析,将其回归结果可视化后,如图8所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图8 K=2时K最近邻算法对噪声为50,特征变量数为1的数据进行回归的结果图

图8中红色五角星就是特征值为2.75的待回归的新数据点,从图8中看出,KNN算法训练出的回归模型给出其回归值为175.31136969。此外,此处同样将训练数据集当做测试数据集,运行图7的代码,对新训练出的回归模型的评分为0.86,这意味着该模型能对86%的数据点进行正确回归(或称为预测)其测定值,说明该模型的效果还可以。

补充:上述回归模型是K最近邻回归器KNeighborsRegressor在最近邻个数K的值取为2的情况下训练得到的。我们知道,影响K最近邻算法在分类或回归模型中的训练效果的参数只有最近邻个数K。下面尝试将该参数值调节为5时,观察下对训练出的回归模型的影响如何。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图9 K=5时K最近邻算法对噪声为50,特征变量数为1的数据进行回归的结果图

从图9可以看出,相比于最近邻个数K=2,K=5时训练出的回归模型的正确率由86%下降到了77%,说明在使用K最近邻算法时,对最近邻个数K的值进行调节以使训练出的模型的拟合效果更好是很有必要的。

2. 线性模型(Linear Model,LM)

2.1 基本原理

线性模型是一类模型,而非一个模型,在机器学习领域,常用的线性模型包括线性回归、岭回归和套索回归等。线性模型主要用于回归分析,其一般性公式为:

$$hat{y}=w[0]times x[0]+w[1]times x[1]+…+w[n]times x[n]+b$$

式中,$x[n]$为数据集中第$n$个特征变量,$x[0],x[1],…,x[n]$为数据集中一个数据的全部特征变量,$w[n]$为线性模型中第$n$个特征变量的系数,$w$和$b$均为线性模型的参数,$hat{y}$为线性模型对于新数据点的预测值。

因此,基于上述公式,线性回归模型的基本原理是,在训练数据集的所有数据中寻找$y$的预测值与每个数据的真实值的平方差最小时所对应的$n$个参数$w$值和一个参数$b$值。

岭回归模型的基本原理是,岭回归模型实际上是一种改良的线性回归模型(也称为最小二乘法),训练得到的模型中会保留所有的特征变量,但会减小特征变量前面的系数值,让特征变量对回归结果的影响变小。这种通过保留全部特征变量,而只减小特征变量前面的系数值来避免过拟合的方法,在机器学习领域称为L2正则化,在岭回归中通过改变alpha参数来控制减小特征变量前面系数的程度。

套索回归模型的基本原理是,套索回归模型本质上也是一种改良的线性回归模型,也会通过减小特征变量前面的系数值让特征变量对回归结果的影响变小,但与岭回归模型不同的是,套索回归训练得到的模型中不一定会保留所有的特征变量,有一些特征变量会被模型彻底忽略掉,这样其实可以突出体现模型中最重要的那些特征。这种通过减小特征变量前面的系数值,使一部分特征前面的系数正好等于0的方法,在机器学习领域称为L1正则化,在套索回归中同样通过改变alpha参数来控制减小特征变量前面系数的程度。

2.2 功能以及优缺点

线性回归模型主要用于回归分析,其优点是没有需要用户进行调节的参数,而模型中的参数$w$和$b$是由训练数据自身训练出来的,不是用来调节模型复杂度的参数;当然,其优点也会成为缺点,那就是用户无法控制模型的复杂程度。

岭回归模型同样主要用于回归分析,其优点是通过调节alpha参数值来控制模型的复杂程度,进而能避免出现过拟合现象的发生,使训练出的模型的泛化能力更好。其中,L2正则项参数alpha的调节规律为:alpha值越大,特征变量前的系数越小,降低模型在训练集上的性能,训练出的模型的复杂度越低,越不容易出现过拟合;相反地,alpha值越小甚至趋于0,那么特征变量前的系数越不受限制,训练得到的回归模型也会非常接近线性回归所得到的模型。

套索回归模型同样用于回归分析,其优点也是通过调节alpha参数值来控制模型的复杂程度,但与岭回归模型不同的是,其优势主要体现在当训练数据的特征过多,而只有一小部分才是真正重要的特征时,套索回归能够记住这些重要的特征而忽略那些不重要的特征。其中,L1正则项参数alpha的调节规律与上述岭回归模型中的L2正则项参数alpha的调节规律完全一致。

虽然线性模型是一类历史相当悠久的回归模型,但目前的应用仍然非常普遍,原因就在于线性模型相对于超大型数据集来说,其训练速度非常之快。在实际应用中,常常需要决定是使用L2正则化的岭回归模型还是L1正则化的套索回归模型,大体遵循的原则是,如果数据集中的数据有很多特征,而这些特征并不是每一个都很重要,那么就使用L1正则化的套索回归模型;但如果数据的特征并不多,而且每一个都很重要的话,就应该使用L2正则化的岭回归模型。

2.3 用法

(1)线性回归模型

scikit-learn库中内置了若干个收集于真实世界的数据集,真实数据集中数据的特征变量的数目往往会比较多,且噪声也不小。在Jupyter notebook中输入以下代码便可生成一个特征变量数为10的糖尿病情数据集,并赋值给X和y。之后使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合,其中,默认情况下是将75%的数据及所对应的标签随机划归到训练数据集,其余25%的数据和其标签划归到测试数据集。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图10 生成特征变量数为10的糖尿病情训练数据集和测试数据集的代码

线性回归用于回归分析时,需要先从scikit-learn库中导入线性回归器LinearRegression,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图11 线性回归模型用于回归分析进行模型训练的核心代码

使用线性回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图12所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图12 线性回归模型对特征变量数为10的糖尿病情数据进行回归的结果图

补充:从图12的评分结果看出,线性回归模型在对特征变量数为10的糖尿病情数据进行训练的过程中出现了过拟合的问题,而且拟合(或称为回归)效果并不理想。此时,我们就需要对线性回归模型稍作改进,使之能够克服线性回归模型中不能控制模型复杂度的缺点。

(2)岭回归模型——L2正则化的线性模型

同样使用上述生成的糖尿病情数据集来测试岭回归模型,岭回归用于回归分析时,需要先从scikit-learn库中导入岭回归器Ridge,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图13 岭回归模型用于回归分析进行模型训练的核心代码

使用岭回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图14所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图14 alpha = 0.8时,岭回归模型对特征变量数为10的糖尿病情数据进行回归的结果图

补充:对比图14和图12的评分结果,可以看出岭回归模型在对上述的糖尿病情数据进行训练的过程中,虽然在训练集上的评分不如线回归模型,但在测试集上的评分与之几乎无差,而且还避免了线性回归模型容易出现的过拟合问题,更有助于新训练出的模型进行泛化,而这完全是因为alpha参数能够控制模型的复杂度。

(3)套索回归模型——L1正则化的线性模型

同样使用上述生成的糖尿病情数据集来测试套索回归模型,套索回归用于回归分析时,需要先从scikit-learn库中导入套索回归器Ridge,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图15 套索回归模型用于回归分析进行模型训练的核心代码

使用套索回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图16所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图16 alpha = 0.45时,套索回归模型对特征变量数为10的糖尿病情数据回归的结果图

补充:对比图16和图14的评分结果,可以看出套索回归模型在对上述的糖尿病情数据进行训练的过程中,在原本10个特征变量中只保留了4个重要的特征,其余6个特征前的系数被赋为0,也就意味着这6个特征被套索回归训练出的模型忽略掉了,而且还避免出现过拟合问题。

3. 朴素贝叶斯算法(Naive Bayes,NB)

3.1 基本原理

朴素贝叶斯算法是基于贝叶斯定理的一类分类算法,在机器学习领域,常用的朴素贝叶斯算法包括伯努利朴素贝叶斯、高斯朴素贝叶斯和多项式朴素贝叶斯等。之所以称之为“朴素”,是因为该算法是基于样本特征之间相互独立的“朴素”假设,正是因为该假设,朴素贝叶斯分类器的效率非常之高。其中,贝叶斯定理是基于概率论中的条件概率所提出的,其一般性公式为:

$$P(A|B)=frac{P(B|A)times P(A)}{P(B)}=frac{P(AB)}{P(B)}$$

式中,$P(A)$为事件$A$发生的概率,$P(B)$为事件$B$发生的概率,$P(AB)$为事件$A$和事件$B$同时发生的概率,$P(A|B)$为在事件$B$发生的情况下,事件$A$发生的概率,$P(B|A)$为在事件$A$发生的情况下,事件$B$发生的概率。

3.2 功能以及优缺点

伯努利朴素贝叶斯主要用于分类任务,其优点是把数据集中的各个特征看做完全独立,而不考虑特征之间的关联关系,这样就会使得算法的效率很高;但是伯努利朴素贝叶斯算法仅适用于服从二项式分布的数据集(也就是数据集中的每个特征都只有0和1两个取值)。

高斯朴素贝叶斯同样用于分类任务,其优点也是效率很高,该算法适用但不仅限于服从高斯分布的数据集(也就是数据集中的数据服从正态分布)。

多项式朴素贝叶斯同样也是用于分类任务,其优点也是效率很高,缺点是对训练数据的预处理要求较高,因为该算法要求输入的数据必须非负,同时该算法只适用于多项式分布的数据集(也就是数据集中数据的特征为非负离散型)。所谓多项式分布可以用掷骰子来理解,我们知道骰子有6个面,每掷一次骰子结果都有可能1~6这6个数字中任意一个面朝上,如果掷$n$次骰子,每个面朝上的次数的分布情况,就是一个多项式分布。

3.3 用法

(1)伯努利朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为2,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。伯努利朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入伯努利朴素贝叶斯分类器BernoulliNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图17 伯努利朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用伯努利朴素贝叶斯算法对以上2类、共500个数据进行分类,将其分类结果可视化后,如图18所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图18 伯努利朴素贝叶斯算法对2类数据进行分类的结果图

图18中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图18中看出,伯努利朴素贝叶斯算法训练出的分类模型将其划分到了编号为[1]的黄色的一类中。此外,运行图17的代码,利用测试数据集对新训练出的分类模型的评分为0.91,这意味着该模型能对91%的数据点进行正确分类,说明该模型的效果还是不错的。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图19 伯努利朴素贝叶斯算法对新训练出的分类模型的评分图

当数据集中的特征数量大于2类,也就是数据集不符合二项式分布时,我们观察一下使用伯努利朴素贝叶斯算法的分类效果如何。因此,尝试使用伯努利朴素贝叶斯算法对手动生成的5类、共500个数据进行分类,将其分类结果可视化后,如图20所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图20 伯努利朴素贝叶斯算法对5类数据进行分类的结果图

从图20可以看出,利用测试数据集对新训练出的分类模型的评分为0.52,意味着该模型只能对一半左右的数据点进行正确分类。这说明当数据集中的数据不服从二项式分布时,伯努利朴素贝叶斯算法训练出的分类模型的效果比较糟糕。

(2)高斯朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。高斯朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入高斯朴素贝叶斯分类器GaussianNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图21 高斯朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用高斯朴素贝叶斯算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图22所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图22 高斯朴素贝叶斯算法对5类数据进行分类的结果图

图22中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图22中看出,高斯朴素贝叶斯算法训练出的分类模型将其划分到了编号为[3]的浅绿色的一类中。此外,运行图21的代码,利用测试数据集对新训练出的分类模型的评分为0.85,意味着该模型能对85%的数据点进行正确分类,这说明当数据集中的数据不服从二项分布时,相比于伯努利朴素贝叶斯算法训练出的分类模型,高斯朴素贝叶斯算法训练出的分类模型的效果更好。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图23 高斯朴素贝叶斯算法对新训练出的分类模型的评分图

(3)多项式朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。在正式使用多项式朴素贝叶斯算法之前,需要使用数据预处理工具MinMaxScaler对输入数据进行预处理,使输入数据全部为非负值。多项式朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入多项式朴素贝叶斯分类器MultinomialNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图24 多项式朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用多项式朴素贝叶斯算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图25所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图25 多项式朴素贝叶斯算法对5类数据进行分类的结果图

图25中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图25中看出,多项式朴素贝叶斯算法训练出的分类模型将其划分到了编号为[4]的黄色的一类中。此外,运行图24的代码,利用测试数据集对新训练出的分类模型的评分为0.50,意味着该模型只能对一半的数据点进行正确分类,比伯努利朴素贝叶斯算法对这5类数据进行分类的结果还差一些,这是因为这个数据集中的数据不服从多项式分布,多项式朴素贝叶斯算法只适用于对非负离散数值特征的数据集进行分类,比如对转化为向量后的文本数据进行分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图26 多项式朴素贝叶斯算法对新训练出的分类模型的评分图

4. 决策树算法(Decision Tree,DT)

4.1 基本原理

决策树算法的基本原理是通过对一系列问题进行if/else的分支推导,最终实现分类或决策。如图27所示,设定一个决策深度为2层的简单的提问决策树有4片决策树树叶,分别是狮子、小鸡、苹果和花生。通过构建如图27所示的几个简单的问题进行if/else的分支推导便可到达最顶层(最下面为最顶层)的树叶处,这便实现了分类、预测或决策的功能。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图27 决策树算法用于分类任务的示意图

随机决策森林算法是一种集合学习方法,也就是将多个机器学习算法综合在一起来对模型进行训练的方法。其基本原理是把不同的几颗决策树打包到一起,每颗决策树的参数都不相同,最后把每颗决策树预测的结果取平均值,这样既可以保留每颗决策树的贡献,又可降低训练出的模型出现过拟合的风险。

4.2 功能以及优缺点

决策树算法主要用于分类任务,在实际应用中,需要调节的参数只有决策树的深度max_depth的值。其优点是很容易将模型可视化,十分容易理解,并且几乎不需要对输入数据进行预处理;缺点是不可避免会出现过拟合的问题,让训练出的模型的泛化性能有所下降。

随机决策森林算法既可用于分类任务,也可用于回归分析。在实际应用中,需要调节的参数有多个:一是bootstrap参数,用来控制从样本空间进行抽样的方式,其有“放回抽样”的功能,也就是每次可从数据集中重复抽取同一个样本,这样做的目的是通过这种方式可以每次重新生成数据集,让随机森林中的每一颗决策树在构建时彼此之间有差异;二是max_features参数,用来控制每颗决策树所选择的特征数量的最大值,其功能是max_features参数取值越高,随机森林中的每一颗决策树之间的差异越小,因为它们有更多不同的特征可以选择,更容易拟合数据,反之max_features参数取值越低,随机森林中的每一颗决策树之间的差异越大,因为它们没有不同的特征可以选择,这就迫使每颗决策树的样子更加不同;三是n_estimators参数,用来控制随机森林中决策树的数量,如果用来回归分析时,随机森林会把所有决策树预测的值取平均值,如果用来分类的话,随机森林会把所有决策树对每一分类进行预测的概率值取平均值,然后会把样本放入概率最高的分类当中;四是n_jobs参数,用来控制并行处理的CPU内核数,当n_jobs=-1时,随机森林会使用CPU的全部内核,处理速度极大提升;五是random_state参数,用来控制随机森林生成每颗决策树的方法的随机程度,如果不希望训练出的模型的结果太过于不稳定,一定要固化random_state参数的数值。随机决策森林算法的优点集成了决策树的所有优点,而且还能弥补决策树的不足,此外,随机决策森林算法还支持并行处理,对于超大规模的数据集可多进程并行处理来节省时间;其缺点是对于超高维数据集和稀疏数据集,随机决策森林算法的表现有些差强人意,这种情况下线性模型的效果会更好一些,此外,随机决策森林算法更消耗内存,速度也比线性模型要慢。

4.3 用法

(1)决策树算法

一、基本概念

机器学习指的是在让计算机不经过传统的明显编程的情况下,对数据进行自我学习并正确做出预测或分类的一种方法,属于计算机科学领域中的一部分。机器学习的应用场景在当今社会中有很多,比如:电子商务中的智能推荐、互联网金融中的风控系统、新闻资讯中的内容审查以及2016年Google旗下首次战胜人类围棋世界冠军的大名鼎鼎的AlphaGo等等。

在机器学习领域,有两类常用的方法就是有监督学习和无监督学习。其中,有监督学习是通过包含了样本特征变量及分类标签的现有训练数据集进行建模,再用该模型对新的数据样本进行分类或回归分析的机器学习方法;无监督学习是在没有训练数据集的情况下,对没有标签的数据进行分析并建立合适的模型以给出问题解决方案的机器学习方法,常见的无监督学习方法包括将样本特征变量降维的数据转换和把样本划归到不同分组的聚类分析。

本次入门篇重点介绍有监督学习中应用于分类和回归任务中的K最近邻算法线性模型朴素贝叶斯算法决策树算法支持向量机神经网络这六种经典机器学习算法的原理、功能和优缺点以及用法。所谓分类,指的是对样本的类标签进行预测,判断样本属于哪一个分类,其结果是离散的数值。而对于回归分析来说,其目标是要预测一个连续的数值或范围。

在正式介绍经典机器学习算法之前,再掌握三个专用术语:模型的泛化(generalization)是指在有监督学习中,将在训练数据集上建立的模型用于新的、之前从未见过的数据中,这个过程称之为模型的泛化,那么我们希望模型对于新数据的预测也尽可能准确,才能说模型泛化的准确度比较高,这时我们就可以用测试数据集对模型的实际表现进行评估;如果训练出来的模型在拟合训练数据集时表现非常好,而在测试数据集上表现的非常差,这时我们称之为模型过拟合(overfitting);相反地,如果模型相对较为简单,在训练数据集和测试数据集上的表现都比较差的话,我们称之为模型欠拟合(underfitting)。

二、有监督学习中的六种经典机器学习方法

1. K最近邻算法(K-Nearest Neighbors,KNN)

1.1 基本原理

K最近邻算法用于分类时,其分类原理为:设定最近邻个数K的值后,在与新数据点距离最近的K个训练数据点中,属于哪一类的训练数据点的个数在K个中占大多数,新数据点就属于这一类。如图1所示,设定新数据点的最近邻个数K等于3时,找出距离新数据点最近的3个训练数据点,发现与新数据点距离最近的3个训练数据点中,有2个是属于深色分类,只有1个属于浅色分类,根据上述K最近邻算法的原理,新数据点应该属于深色分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图1 K最近邻算法用于分类任务的示意图

同理,K最近邻算法用于回归时,其回归原理为:设定最近邻个数K的值后,在与新数据点距离最近的K个训练数据点中,将这些训练数据点的y值取平均值,并把该平均值作为新数据点的预测值。

1.2 功能以及优缺点

K最近邻算法既可用于分类任务,又可用于回归分析。在实际使用中,为了使训练出的模型的泛化效果更好,需要尝试调节的参数只有最近邻个数K的值。其优点是原理简单,十分容易理解;缺点是对数据集的预处理要求较高、对规模较大的数据集训练时间较长、对特征变量数目较多的高维数据集拟合欠佳以及对稀疏数据集无法拟合等。所以,工程实际中,K最近邻算法的应用并不多见,但作为机器学习的入门算法,该算法十分容易上手。

1.3 用法

本文代码运行所用到的环境配置、机器学习库以及编码工具为:Python 3.7,Numpy基础科学计算库,Scipy科学计算工具库,matplotlib画图工具库,scikit-learn机器学习库,Jupyter Notebook 1.0。另外,除Python 3.7以外,这些机器学习库和Jupyter Notebook均使用pip命令以管理员身份在cmd中进行联网下载,下载完毕后可断网编码和运行。

(1)K最近邻分类

scikit-learn库中内置了若干个数据集,还设置了一些API供学者自己动手生成一些自己想要的数据集。在Jupyter notebook中输入以下代码便可手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并赋值给X和y。其中,X为二维向量,存储以上生成的有2个特征变量的训练数据,y为一维向量,存储以上每个训练数据所属的分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图2 生成样本数量为500,分类数量为5,特征变量数为2的数据集的代码

K最近邻算法用于分类任务时,需要先从scikit-learn库中导入K最近邻分类器KNeighborsClassifier,再通过训练数据X,y利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图3 K最近邻算法用于分类任务进行模型训练的核心代码

使用K最近邻算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图4所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图4 K最近邻算法对5类数据进行分类的结果图

图4中红色五角星就是位于(6.75,4.82)的待分类的新数据点,从图4中看出,KNN算法训练出的分类模型将其划分到了编号为[1]的深蓝色的一类中。此外,为方便起见,此处就将训练数据集当做测试数据集,运行图3的代码,对新训练出的分类模型的评分为0.96,这意味着该模型能对96%的数据点进行正确分类,说明该模型的效果还是不错的。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图5 K最近邻算法对新训练出的分类模型的评分图

(2)K最近邻回归

在Jupyter notebook中输入以下代码便可手动生成一个噪声为50,特征变量数为1的数据集,并赋值给X和y。其中,X为一维向量,存储以上生成的有1个特征变量的训练数据,y为一维向量,存储以上每个训练数据的测定值。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图6 生成噪声为50,特征变量数为1的数据集的代码

K最近邻算法用于回归分析时,需要先从scikit-learn库中导入K最近邻回归器KNeighborsRegressor,再通过训练数据X,y利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过函数predict( )对一个新数据进行预测其回归值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图7 K最近邻算法用于回归分析进行模型训练的核心代码

使用K最近邻算法对以上噪声为50,特征变量数为1的数据集进行回归分析,将其回归结果可视化后,如图8所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图8 K=2时K最近邻算法对噪声为50,特征变量数为1的数据进行回归的结果图

图8中红色五角星就是特征值为2.75的待回归的新数据点,从图8中看出,KNN算法训练出的回归模型给出其回归值为175.31136969。此外,此处同样将训练数据集当做测试数据集,运行图7的代码,对新训练出的回归模型的评分为0.86,这意味着该模型能对86%的数据点进行正确回归(或称为预测)其测定值,说明该模型的效果还可以。

补充:上述回归模型是K最近邻回归器KNeighborsRegressor在最近邻个数K的值取为2的情况下训练得到的。我们知道,影响K最近邻算法在分类或回归模型中的训练效果的参数只有最近邻个数K。下面尝试将该参数值调节为5时,观察下对训练出的回归模型的影响如何。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图9 K=5时K最近邻算法对噪声为50,特征变量数为1的数据进行回归的结果图

从图9可以看出,相比于最近邻个数K=2,K=5时训练出的回归模型的正确率由86%下降到了77%,说明在使用K最近邻算法时,对最近邻个数K的值进行调节以使训练出的模型的拟合效果更好是很有必要的。

2. 线性模型(Linear Model,LM)

2.1 基本原理

线性模型是一类模型,而非一个模型,在机器学习领域,常用的线性模型包括线性回归、岭回归和套索回归等。线性模型主要用于回归分析,其一般性公式为:

$$hat{y}=w[0]times x[0]+w[1]times x[1]+…+w[n]times x[n]+b$$

式中,$x[n]$为数据集中第$n$个特征变量,$x[0],x[1],…,x[n]$为数据集中一个数据的全部特征变量,$w[n]$为线性模型中第$n$个特征变量的系数,$w$和$b$均为线性模型的参数,$hat{y}$为线性模型对于新数据点的预测值。

因此,基于上述公式,线性回归模型的基本原理是,在训练数据集的所有数据中寻找$y$的预测值与每个数据的真实值的平方差最小时所对应的$n$个参数$w$值和一个参数$b$值。

岭回归模型的基本原理是,岭回归模型实际上是一种改良的线性回归模型(也称为最小二乘法),训练得到的模型中会保留所有的特征变量,但会减小特征变量前面的系数值,让特征变量对回归结果的影响变小。这种通过保留全部特征变量,而只减小特征变量前面的系数值来避免过拟合的方法,在机器学习领域称为L2正则化,在岭回归中通过改变alpha参数来控制减小特征变量前面系数的程度。

套索回归模型的基本原理是,套索回归模型本质上也是一种改良的线性回归模型,也会通过减小特征变量前面的系数值让特征变量对回归结果的影响变小,但与岭回归模型不同的是,套索回归训练得到的模型中不一定会保留所有的特征变量,有一些特征变量会被模型彻底忽略掉,这样其实可以突出体现模型中最重要的那些特征。这种通过减小特征变量前面的系数值,使一部分特征前面的系数正好等于0的方法,在机器学习领域称为L1正则化,在套索回归中同样通过改变alpha参数来控制减小特征变量前面系数的程度。

2.2 功能以及优缺点

线性回归模型主要用于回归分析,其优点是没有需要用户进行调节的参数,而模型中的参数$w$和$b$是由训练数据自身训练出来的,不是用来调节模型复杂度的参数;当然,其优点也会成为缺点,那就是用户无法控制模型的复杂程度。

岭回归模型同样主要用于回归分析,其优点是通过调节alpha参数值来控制模型的复杂程度,进而能避免出现过拟合现象的发生,使训练出的模型的泛化能力更好。其中,L2正则项参数alpha的调节规律为:alpha值越大,特征变量前的系数越小,降低模型在训练集上的性能,训练出的模型的复杂度越低,越不容易出现过拟合;相反地,alpha值越小甚至趋于0,那么特征变量前的系数越不受限制,训练得到的回归模型也会非常接近线性回归所得到的模型。

套索回归模型同样用于回归分析,其优点也是通过调节alpha参数值来控制模型的复杂程度,但与岭回归模型不同的是,其优势主要体现在当训练数据的特征过多,而只有一小部分才是真正重要的特征时,套索回归能够记住这些重要的特征而忽略那些不重要的特征。其中,L1正则项参数alpha的调节规律与上述岭回归模型中的L2正则项参数alpha的调节规律完全一致。

虽然线性模型是一类历史相当悠久的回归模型,但目前的应用仍然非常普遍,原因就在于线性模型相对于超大型数据集来说,其训练速度非常之快。在实际应用中,常常需要决定是使用L2正则化的岭回归模型还是L1正则化的套索回归模型,大体遵循的原则是,如果数据集中的数据有很多特征,而这些特征并不是每一个都很重要,那么就使用L1正则化的套索回归模型;但如果数据的特征并不多,而且每一个都很重要的话,就应该使用L2正则化的岭回归模型。

2.3 用法

(1)线性回归模型

scikit-learn库中内置了若干个收集于真实世界的数据集,真实数据集中数据的特征变量的数目往往会比较多,且噪声也不小。在Jupyter notebook中输入以下代码便可生成一个特征变量数为10的糖尿病情数据集,并赋值给X和y。之后使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合,其中,默认情况下是将75%的数据及所对应的标签随机划归到训练数据集,其余25%的数据和其标签划归到测试数据集。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图10 生成特征变量数为10的糖尿病情训练数据集和测试数据集的代码

线性回归用于回归分析时,需要先从scikit-learn库中导入线性回归器LinearRegression,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图11 线性回归模型用于回归分析进行模型训练的核心代码

使用线性回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图12所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图12 线性回归模型对特征变量数为10的糖尿病情数据进行回归的结果图

补充:从图12的评分结果看出,线性回归模型在对特征变量数为10的糖尿病情数据进行训练的过程中出现了过拟合的问题,而且拟合(或称为回归)效果并不理想。此时,我们就需要对线性回归模型稍作改进,使之能够克服线性回归模型中不能控制模型复杂度的缺点。

(2)岭回归模型——L2正则化的线性模型

同样使用上述生成的糖尿病情数据集来测试岭回归模型,岭回归用于回归分析时,需要先从scikit-learn库中导入岭回归器Ridge,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图13 岭回归模型用于回归分析进行模型训练的核心代码

使用岭回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图14所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图14 alpha = 0.8时,岭回归模型对特征变量数为10的糖尿病情数据进行回归的结果图

补充:对比图14和图12的评分结果,可以看出岭回归模型在对上述的糖尿病情数据进行训练的过程中,虽然在训练集上的评分不如线回归模型,但在测试集上的评分与之几乎无差,而且还避免了线性回归模型容易出现的过拟合问题,更有助于新训练出的模型进行泛化,而这完全是因为alpha参数能够控制模型的复杂度。

(3)套索回归模型——L1正则化的线性模型

同样使用上述生成的糖尿病情数据集来测试套索回归模型,套索回归用于回归分析时,需要先从scikit-learn库中导入套索回归器Ridge,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个回归模型,最后可通过属性coef_和intercept_输出新训练出的回归模型中的$w$和$b$值,亦可通过测试数据集利用函数score( )对新训练出的回归模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图15 套索回归模型用于回归分析进行模型训练的核心代码

使用套索回归模型对以上特征变量数为10的糖尿病情数据集进行回归分析,其回归结果和评分结果,如图16所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图16 alpha = 0.45时,套索回归模型对特征变量数为10的糖尿病情数据回归的结果图

补充:对比图16和图14的评分结果,可以看出套索回归模型在对上述的糖尿病情数据进行训练的过程中,在原本10个特征变量中只保留了4个重要的特征,其余6个特征前的系数被赋为0,也就意味着这6个特征被套索回归训练出的模型忽略掉了,而且还避免出现过拟合问题。

3. 朴素贝叶斯算法(Naive Bayes,NB)

3.1 基本原理

朴素贝叶斯算法是基于贝叶斯定理的一类分类算法,在机器学习领域,常用的朴素贝叶斯算法包括伯努利朴素贝叶斯、高斯朴素贝叶斯和多项式朴素贝叶斯等。之所以称之为“朴素”,是因为该算法是基于样本特征之间相互独立的“朴素”假设,正是因为该假设,朴素贝叶斯分类器的效率非常之高。其中,贝叶斯定理是基于概率论中的条件概率所提出的,其一般性公式为:

$$P(A|B)=frac{P(B|A)times P(A)}{P(B)}=frac{P(AB)}{P(B)}$$

式中,$P(A)$为事件$A$发生的概率,$P(B)$为事件$B$发生的概率,$P(AB)$为事件$A$和事件$B$同时发生的概率,$P(A|B)$为在事件$B$发生的情况下,事件$A$发生的概率,$P(B|A)$为在事件$A$发生的情况下,事件$B$发生的概率。

3.2 功能以及优缺点

伯努利朴素贝叶斯主要用于分类任务,其优点是把数据集中的各个特征看做完全独立,而不考虑特征之间的关联关系,这样就会使得算法的效率很高;但是伯努利朴素贝叶斯算法仅适用于服从二项式分布的数据集(也就是数据集中的每个特征都只有0和1两个取值)。

高斯朴素贝叶斯同样用于分类任务,其优点也是效率很高,该算法适用但不仅限于服从高斯分布的数据集(也就是数据集中的数据服从正态分布)。

多项式朴素贝叶斯同样也是用于分类任务,其优点也是效率很高,缺点是对训练数据的预处理要求较高,因为该算法要求输入的数据必须非负,同时该算法只适用于多项式分布的数据集(也就是数据集中数据的特征为非负离散型)。所谓多项式分布可以用掷骰子来理解,我们知道骰子有6个面,每掷一次骰子结果都有可能1~6这6个数字中任意一个面朝上,如果掷$n$次骰子,每个面朝上的次数的分布情况,就是一个多项式分布。

3.3 用法

(1)伯努利朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为2,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。伯努利朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入伯努利朴素贝叶斯分类器BernoulliNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图17 伯努利朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用伯努利朴素贝叶斯算法对以上2类、共500个数据进行分类,将其分类结果可视化后,如图18所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图18 伯努利朴素贝叶斯算法对2类数据进行分类的结果图

图18中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图18中看出,伯努利朴素贝叶斯算法训练出的分类模型将其划分到了编号为[1]的黄色的一类中。此外,运行图17的代码,利用测试数据集对新训练出的分类模型的评分为0.91,这意味着该模型能对91%的数据点进行正确分类,说明该模型的效果还是不错的。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图19 伯努利朴素贝叶斯算法对新训练出的分类模型的评分图

当数据集中的特征数量大于2类,也就是数据集不符合二项式分布时,我们观察一下使用伯努利朴素贝叶斯算法的分类效果如何。因此,尝试使用伯努利朴素贝叶斯算法对手动生成的5类、共500个数据进行分类,将其分类结果可视化后,如图20所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图20 伯努利朴素贝叶斯算法对5类数据进行分类的结果图

从图20可以看出,利用测试数据集对新训练出的分类模型的评分为0.52,意味着该模型只能对一半左右的数据点进行正确分类。这说明当数据集中的数据不服从二项式分布时,伯努利朴素贝叶斯算法训练出的分类模型的效果比较糟糕。

(2)高斯朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。高斯朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入高斯朴素贝叶斯分类器GaussianNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图21 高斯朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用高斯朴素贝叶斯算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图22所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图22 高斯朴素贝叶斯算法对5类数据进行分类的结果图

图22中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图22中看出,高斯朴素贝叶斯算法训练出的分类模型将其划分到了编号为[3]的浅绿色的一类中。此外,运行图21的代码,利用测试数据集对新训练出的分类模型的评分为0.85,意味着该模型能对85%的数据点进行正确分类,这说明当数据集中的数据不服从二项分布时,相比于伯努利朴素贝叶斯算法训练出的分类模型,高斯朴素贝叶斯算法训练出的分类模型的效果更好。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图23 高斯朴素贝叶斯算法对新训练出的分类模型的评分图

(3)多项式朴素贝叶斯算法

手动生成一个样本数量为500,分类数量为5,特征变量数为2的数据集,并使用数据集拆分工具将该数据集拆分成训练集和测试集两个集合。在正式使用多项式朴素贝叶斯算法之前,需要使用数据预处理工具MinMaxScaler对输入数据进行预处理,使输入数据全部为非负值。多项式朴素贝叶斯算法用于分类任务时,需要先从scikit-learn库中导入多项式朴素贝叶斯分类器MultinomialNB,再通过训练数据X_train,y_train利用函数fit( )拟合(或称为训练)出一个分类模型,最后可通过函数predict( )对一个新数据进行预测分类,亦可通过测试数据集利用函数score( )对新训练出的分类模型进行评分。整个过程的核心代码如下:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图24 多项式朴素贝叶斯算法用于分类任务进行模型训练的核心代码

使用多项式朴素贝叶斯算法对以上5类、共500个数据进行分类,将其分类结果可视化后,如图25所示:

入门篇——解析Python机器学习中有监督学习的六种经典算法

图25 多项式朴素贝叶斯算法对5类数据进行分类的结果图

图25中红色五角星就是位于(2.75,0.82)的待分类的新数据点,从图25中看出,多项式朴素贝叶斯算法训练出的分类模型将其划分到了编号为[4]的黄色的一类中。此外,运行图24的代码,利用测试数据集对新训练出的分类模型的评分为0.50,意味着该模型只能对一半的数据点进行正确分类,比伯努利朴素贝叶斯算法对这5类数据进行分类的结果还差一些,这是因为这个数据集中的数据不服从多项式分布,多项式朴素贝叶斯算法只适用于对非负离散数值特征的数据集进行分类,比如对转化为向量后的文本数据进行分类。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图26 多项式朴素贝叶斯算法对新训练出的分类模型的评分图

4. 决策树算法(Decision Tree,DT)

4.1 基本原理

决策树算法的基本原理是通过对一系列问题进行if/else的分支推导,最终实现分类或决策。如图27所示,设定一个决策深度为2层的简单的提问决策树有4片决策树树叶,分别是狮子、小鸡、苹果和花生。通过构建如图27所示的几个简单的问题进行if/else的分支推导便可到达最顶层(最下面为最顶层)的树叶处,这便实现了分类、预测或决策的功能。

入门篇——解析Python机器学习中有监督学习的六种经典算法

图27 决策树算法用于分类任务的示意图

随机决策森林算法是一种集合学习方法,也就是将多个机器学习算法综合在一起来对模型进行训练的方法。其基本原理是把不同的几颗决策树打包到一起,每颗决策树的参数都不相同,最后把每颗决策树预测的结果取平均值,这样既可以保留每颗决策树的贡献,又可降低训练出的模型出现过拟合的风险。

4.2 功能以及优缺点

决策树算法主要用于分类任务,在实际应用中,需要调节的参数只有决策树的深度max_depth的值。其优点是很容易将模型可视化,十分容易理解,并且几乎不需要对输入数据进行预处理;缺点是不可避免会出现过拟合的问题,让训练出的模型的泛化性能有所下降。

随机决策森林算法既可用于分类任务,也可用于回归分析。在实际应用中,需要调节的参数有多个:一是bootstrap参数,用来控制从样本空间进行抽样的方式,其有“放回抽样”的功能,也就是每次可从数据集中重复抽取同一个样本,这样做的目的是通过这种方式可以每次重新生成数据集,让随机森林中的每一颗决策树在构建时彼此之间有差异;二是max_features参数,用来控制每颗决策树所选择的特征数量的最大值,其功能是max_features参数取值越高,随机森林中的每一颗决策树之间的差异越小,因为它们有更多不同的特征可以选择,更容易拟合数据,反之max_features参数取值越低,随机森林中的每一颗决策树之间的差异越大,因为它们没有不同的特征可以选择,这就迫使每颗决策树的样子更加不同;三是n_estimators参数,用来控制随机森林中决策树的数量,如果用来回归分析时,随机森林会把所有决策树预测的值取平均值,如果用来分类的话,随机森林会把所有决策树对每一分类进行预测的概率值取平均值,然后会把样本放入概率最高的分类当中;四是n_jobs参数,用来控制并行处理的CPU内核数,当n_jobs=-1时,随机森林会使用CPU的全部内核,处理速度极大提升;五是random_state参数,用来控制随机森林生成每颗决策树的方法的随机程度,如果不希望训练出的模型的结果太过于不稳定,一定要固化random_state参数的数值。随机决策森林算法的优点集成了决策树的所有优点,而且还能弥补决策树的不足,此外,随机决策森林算法还支持并行处理,对于超大规模的数据集可多进程并行处理来节省时间;其缺点是对于超高维数据集和稀疏数据集,随机决策森林算法的表现有些差强人意,这种情况下线性模型的效果会更好一些,此外,随机决策森林算法更消耗内存,速度也比线性模型要慢。

4.3 用法

(1)决策树算法

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 入门篇——解析Python机器学习中有监督学习的六种经典算法求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们