机器学习算法——常规算法,在同的业务场景也需要使用不同的算法(二)

曼亿点 2024-08-17 12:31:01 阅读 93

在这里插入图片描述


👨‍💻个人主页:@开发者-曼亿点

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 曼亿点 原创

👨‍💻 收录于专栏:机器学习

⭐🅰⭐

请添加图片描述


文章目录

⭐🅰⭐⭐前言⭐🎶 算法分类(1)逻辑回归1.基本概要2.算法推导3.工程实现

(2)支持向量机1.基本概要2.算法推导3.工程实现结束语🥇


⭐前言⭐

机器学习可以处理的业务场景非常丰富,从基础的回归、聚类和分类等场景到图片识别、语音识别和文本分析等。不同的业务场景也需要使用不同的算法,所以如果想对机器学习在业务的解决方案上有一定认识,则需要掌握多种场景的不同种类的算法,了解不同算法的属性、优势和缺陷,对之后的算法应用会有很大的帮助。


🎶 算法分类


分类算法是用来解决分类问题的算法,关于场景的抽象方法在前面章节中已经介绍了,分类算法是场景最丰富的一类算法,广告的投放和疾病预测等都可以抽象成分类问题。分类算法一般都是监督学习算法,因为需要通过已有的打标数据来生成分类模型。在这一部分选取了几种比较典型的分类算法进行介绍,分别是K近邻(KNN)、朴素贝叶斯(NBM)、逻辑回归(LR)(注:这里LR作为二分类算法,LR也是回归算法的一种)、随机森林(RF)和线性支持向量机(SVM)。

(1)逻辑回归

逻辑回归(Logistic Regression,LR)是一种广义的线性回归分析模型,属于监督学习算法。逻辑回归可以用在回归、二分类和多分类等问题上,但是最常用的还是二分类。LR作为机器学习算法中的“明星算法”,无论对大数据量的问题或是小数据量的问题都有很好的性能和计算结果,而且在参数设计上也比较利于调参。同时,逻辑回归还具备特征评估的作用(在之前的特征重要性评估章节有详细介绍)。正是因为逻辑回归具备这样多的优势,所以目前不夸张地说,在机器学习领域,有不少于一半的场景是通过逻辑回归算法来解决的,所以学会逻辑回归等于学会了机器学习的“半壁江山”。

1.基本概要

我们先来看下逻辑回归是如何分类的,作为线性模型,顾名思义,线性回归就是通过一条曲线来区分不同的数据集。这里以最直观的二分类问题为例,假如我们的数据是二维的,可以通过一个平面坐标轴来表示(见图)。

在这里插入图片描述

图中的数据分为两种,一种通过方形表示,一种通过圆形表示,通过逻辑回归算法进行训练,最终生成的模型会是一条二元一次直线(因为本例只有两个特征),这条直线会用来对两种不同的数据集进行分类,即

y=aX+C

其中,y和x是变量,系数a和c就是我们训练得到的模型结果,二分类结果如图

所示。

在这里插入图片描述

理解完线性模型的含义后,接下来介绍逻辑回归对输入数据的要求。逻辑回归需要对数据进行一些矩阵运算,所以入参矩阵的每个数据都需要是数值型的。同时,逻辑回归是一种监督学习算法,需要数据是打标好的。如果是二分类问题,通常目标序列都是表示成0和1的形式。图是一份标准的逻辑回归算法输入,其中,age、sex、duration 和 place 是特征值(id是string 型的,表示数据的唯一标识,不参与矩阵计算),都是通过数值类型来表示的。c是目标队列,通过0和1表示,还要注意输入数据要尽可能避免空值或者乱码的出现。

在这里插入图片描述

2.算法推导

前一部分介绍了一些关于逻辑回归算法的基础概要,包括线性模型的意义和对输入参数的要求,这一部分将重点介绍一下关于逻辑回归算法的推导过程。首先来了解逻辑回归算法最终求得的模型是怎样的?逻辑回归的最终结果是一组特征的系数,每个特征有一个系数相乘,还以上面小节中的样例数据为例,因为输入数据的特征包括age、sex、duration和 place,生成的线性模型为

y=w, x age+ wz x sex+ w x duration+ w x place+C

其中,w,w,w,w,C是通过算法的模型训练得到的模型系数,C 是常数项。最终的训练结果是一个模型(见图)。

图表示的是每个特征对应的系数w,m,w,w,C。确定了模型系数后,我们就可以利用模型来进行预测了。

对于整个逻辑回归算法从训练到预测的过程有3个地方是要具体说明的,一个是如何把结果区间表示到[0,1],另一个是如何求解每个特征的系数,最后是如何利用模型进行预测。于是这里就引出了逻辑回归最关键的3个步骤,Sigmoid 函数、最优化算法以及预测。

(1)Sigmoid函数。Sigmoid 函数是一个成S型分布的函数,Sigmoid 函数的公式表示为

在这里插入图片描述

其中,t为变量,Sigmoid 函数如图下图所示。

在这里插入图片描述

通过图像可以更直观地了解到,Sigmoid 函数可以把结果区间均匀地表示在[0,1]的范围中。如果把上面的案例的模型带进去,就表示为

在这里插入图片描述

这样的话,结果就控制在[0,1了。

(2)最优化算法。最优化算法是统计学中研究各种系统最优化途径的方案。从数学意义上来讲,最优化方法是一种求极值的方法,即在一组约束为等式或不等式的条件下使系统目标函数达到极值,即最大值或最小值。我们可以举一个例子来说明最优化算法在逻辑回归中的作用,还是以逻辑回归章节开篇的那个二维数据分类的例子来讲。我们有圆形和方形两组数据,什么样的线性模型才能更好地对两组数据进行分类呢?需要分类直线尽可能地区分不同的数据集,直线上面是一种类别,下面是另一种类别。如图 5-12所示,中间那条直线显然是我们需要的效果,最优化算法在逻辑回归中的作用就是计算出这条直线。

在这里插入图片描述

有多种最优化算法都适用于逻辑回归,常见的如梯度下降法或者是 Newton 法。这里选用梯度下降方法进行介绍。

梯度下降法(Gradient Descent ),是利用一阶梯度信息找到函数局部最优解的一种方法,是机器学习算法中常用的一种最优化解法。梯度下降法的思路很简单,就是每一步都向最终的结果前进一点,通过迭代的方式计算直到收敛,得到最优解。梯度下降法有点像爬山的问题,一步一步逼近终点,在维基百科上有一张图可以清楚地表示这个方法的思想.

梯度下降的实现方式有很多,而且包含很多衍生方式,这里以最基础的版本来介绍。我们要求的最终模型实际上是二个向量,向最的长度跟数据的特征数是一致的,可以把这个向量用,来表示,是一个变量、表示的是梯度下降法迭代的次数。通常可以把原始的特征系数向量,也就是设置成初始值全是1、初始特征系数向量可以表示为W=(1.11….1)。

在这里插入图片描述

这里还要设置一个步长ō和收敛条件,步长是指梯度下降法每次学习的速率,就相当于爬山中每步的跨度、如果步长大长,在训练过程中可能一下子就迈过了最合适的点,失去了最优解;如果步长太短,则会发现达到终点的速率会非常慢,容易造成过拟合。收敛条件比较好理解,是设置二个条件来判断什么情况下达到了最优解,失去这个收敛条件后函数就会一直迭代没有终点。例如,设m 是判断收敛条件的阈值,m 一般是一个比较小的数值(根据实际求而定)通常的判定方法是通过 W…和 W,的向量距离来判断,如果|W…-W:|向量距离<m就判定迭代到第:次的时候已经是最优解,可以停止计算了,W,就是我们要的值。其实对算法终结点的限制还可以通过限制选代次数来做,具体选用何种方式就需要根据具体的需求来判断。梯度下降的公式为

W=W,-αxX’xerror

其中,α在计算中通常作为梯度的乘积系数,X"表示训练特征数据矩阵的转置,error 表示

的每一次迭代的梯度。下面通过一个例子介绍如何通过梯度下降的方法进行模型的计算。

首先看下训练数据。这是一个包含3组输入数据的矩阵,其中矩阵的前3个字段是特征列,第4个字段是目标列。

在这里插入图片描述

设置α的数值为 0.001,作为每次迭代的步长。X表示输入特征矩阵的转置,特征矩阵X可以表示为

在这里插入图片描述

转置之后,行和列位置对调,X为

在这里插入图片描述

下面计算 error。error 表示的是每一次迭代计算的梯度,计算公式为

error=Y-Sigmoid(XW;)

Y表示的是目标列,在本例中是指向量

在这里插入图片描述

Sigmoid(XW;)是把第t次的模型权重和特征矩阵的乘积带入 Sigmoid 函数计算,在本案例中设 W=(1,1,1),Sigmoid(XW;)的计算方式为

在这里插入图片描述

通过以上方式不断迭代 刚… =㎡,-αxX’xerror ,直到达到收敛条件即可。

通过 Sigmoid 函数以及最优化算法可以得到一个模型,下面通过举例说明如何通过这个模型进行预测。假设最终生成的模型㎡,=(0.1,0.2,0.3),常数项 C=0.18,当我们有一条预测集数据为 A=(5,6,7)时,该如何对A进行预测呢?

以上通过介绍 Sigmoid 函数、梯度下降以及模型预测介绍了整个逻辑回归算法的推导流程。这里还需要强调一个机器学习的线性算法中经常会发生的问题,就是过拟合问题,在线性回归算法中,往往可能会出现线性模型过拟合训练数据的情况。如果训练中出现过拟合问题,表现的特性是针对训练数据的预测结果会非常理想,但是针对其他的数据,果就会差很多。过拟合问题的出现通常是因为训练的特征量过多,可以通过适当减少特征来解决这样的问题,也可以通过L1范数正则化和L2范数正则化等方法来防止过拟合的题发生。在逻辑回归的模型训练过程中一定要注意避免过拟合现象的发生。

3.工程实现

通过 Python 的 numpy 库来实现逻辑回归算法,以下分别是 sigmoid 和梯度下降方法的实现。

Sigmoid 函数的实现如下。

def sigmoid(x):

return 1.0/(1+exp(-x))

梯度下降函数 gradAscent 的实现如下。

def gradAscent(dataMat,classLabel,alpha,maxCycles):

dataMatrix= mat(dataMat)

labelMat = mat(classlabel).transpose()

m,n = shape (dataMatrix)

weights =ones((n,1))

for i in range(maxCycles):

h= sigmoid(dataMatrix*weights)

error=(labelMat-h)

weights =weights + alpha *dataMatrix.transpose()* error

return weights

4个入参从左到右分别是特征矩阵列、目标列、步长和循环次数error 是代价函数。weights 是最终的生成模型。

以上介绍了逻辑回归的基本原理、算法推导以及工程上的实现,其实逻辑回归算法的运用是非常广泛的,特别是在天气预测和广告推荐等行业,而且逻辑回归的变种也非常多,最终的最优化算法也有很多选择。所以想真正地了解并且熟练使用逻辑回归算法需要阅访大量的文献,了解各种变型情况之间的差异。

(2)支持向量机

1.基本概要

支持向量机(Support Vector Machine,SVM)是一种有监督的分类算法,通过探求风险最小来提高学习机的泛化能力,实现经验风险和置信度范围的最小化。通俗来说就是找到能区分特征空间最大间隔的分类器,把问题转化成一个凸二次规划问题的求解。SVM 的原理听上去可能比较难以理解,首先通过对支持向量机的名字进行拆解,详细介绍一下它的具体算法概念。

在这里插入图片描述

以二维数据为例,我们看图 的这组数据中实心和空心的两组数据可以通过一条直线进行分类。这条用于分类的直线就叫作分类机。这个分类机就是支持向量机中这个“机”的含义。下面再来了解什么是支持向量,我们看到在二分类的这条线上下,都有每个类别跟分类器间隔最近的一些点,这些点被标记出来。如果这些点的位置发生了变化,那么分类机的位置也相应地会发生变化,也就是说这些间隔点支持了分类机,这些间隔点就是“支持向量”。到了这一步,我们通过名字已经知道了这个算法的组成和含义,就是支持向量和分类机。下面只要保证每一个类别的这些支持向量跟分类机的几何距离最大,就可以保证分类的准确度。

下面介绍支持向量机的分类,支持向量机可以分为两种:一种是线性支持向量机( Linear Support Vector Machine ),另外一种是非线性支持向量机( Non-linear Support Vecto,Machine)。线性支持向量机主要是解决的线性可分的场景,与之前介绍的逻辑回归的实现场景是一样的,线性可分表示的是通过一条线可以进行分类的场景,如图 所示。

在这里插入图片描述

线性可分又分为近似线性可分和绝对线性可分,绝对线性可分就是一条线可以完全把数据进行分类。近似可分需要借助软间隔最大化的方法,学习出一个线性的分类器。下面来看下非线性可分的场景,图 是典型的线性不可分场景。

在这里插入图片描述

在这个二维空间中有两种数据集,分别用圆圈和叉来表示,我们无法通过线来把这两组数据进行分类。这种场景要如何来解决呢?在非线性支持向量机算法中,可以利用移函数的方法先将数据映射到高维度空间中去,然后在更高的维度中把数据进行分类,这里借用下图来表示。

在这里插入图片描述

上图中左半边表示的是在低维度空间里很难进行分类的一组数据,当我们通过算法数据映射到高维度时(该图中是将二维空间数据映射到三维空间上),就可以通过一个超平面对数据进行分类。这里涉及空间维度转化的理论,以及平衡分类效果和置信度的软间隔最大化的方法。

以上介绍了支持向量机的基本概念和分类,下面谈一下这个算法的一些特性。

1)SVM 的理论比较新颖的地方在于它是一种基于小样本学习的算法,在 SVM 算法中,我们的核心点是通过找到支持向量来进行分类,跟传统的逻辑回归算法这种利用历史全样本经验来归纳演绎的思想有所不同。

2)SVM 在分类的时候引入了最大边界的思想,这个也比较好理解,当确定了支持向量后,只需要找到一个超平面使得正负两类的支持向量到这个平面的距离最大即可。

3)SVM 还提供了一种处理非线性可分场景的思路,就是将低维数据映射到高维空间去求解的方法,并且已经衍生出多种核函数算法来支撑这种思想。

4)SVM 的最终分类效果实际上是通过少数的支持向量来决定的,这就给模型本身带来了很大的鲁棒性,如果只是增删数据集中的数据而没有涉及支持向量,那么分类器对这种改变并不敏感。

5)SVM 的缺陷就是对多分类问题的处理上不如逻辑回归或者树状结构的算法那样灵活,SVM 主要还是处理有监督的二分类场景的问题。

2.算法推导

以上介绍了支持向量机的一些概念和特性,已经明确了SVM 的几个概念:支持向量分类超平面、支持向量要与分类超平面的距离最大。下面通过拆解上面的这几个概念来具体看一下 SVM 的公式推导过程(这里通过线性支持向量机在二维空间的分类来举例)。

(1)几何超平面概念。我们可以设超平面方程为

wX+b=0

其中,w和b并不是系数,w表示的是一组法向量(法向量是空间解析几何的概念,垂直于平面的直线所表示的向量为该平面的法向量,在空间中可以用来确定平面倾斜的角度),b表示的是截距,我们只要确定了w和b的值,就得到了对数据可以进行二分类的几何超平面。

(2)几何间隔。假设我们有一组数据集 T={(x1,y),(x,y),(x,y),(xy),…},在监督学习场景下,其中 x表示的是特征向量,为表示的是目标值,加的取值有两种{-1,+1}(这里为什么是+1和-1,而不用0和1来打标,下面通过推导可以看到这样的打标更容易通过求点到平面的距离来进行分类)。假设已经确定了分类超平面为(w,b)。那么数据点 T 到超平面(w,b)的距离为

D=y„(w x x„+b)

通过几何间隔 D(见下图)可以确定支持向量到超平面的距离,保证分隔距离最大,从而就确定了超平面的参数(w,b)。

在这里插入图片描述

上图 表示的是一个点到平面(w,b)的几何间隔 D。通过上图也可以看出,对于-组数据,它的最优分隔超平面有且只有一个。同时,因为数据的目标值,的值是通过+1和-1的正负号区分,为决定了几何间隔 D的系数符号,在计算结果的时候会方便对数据进行预测,因为可以把间隔距离是正数的归为一类,间隔距离为负数的是另外一类,而且间隔距离越大说明置信度越高。所以在实际的预测过程中,我们只需要计算每个点的特征向量与分隔几何超平面的距离就可以得到这个点的分类以及相关的程度。

(3)支持向量求解。了解了几何超平面以及几何间隔的求解方法之后,接下来就剩向量机的解法了,这一部分也是支持向量机最难理解的一部分。这里要引入拉格朗日函数和拉格朗日乘子的概念。拉格朗日乘子法是在约束条件下求极值的方法,在 SVM 的问题中可以理解成通过数据点找到支持向量和分隔超平面,而这两项都受一些条件约束,如要确定支持向量和分隔平面的距离最大。具体的拉格朗日函数式为

在这里插入图片描述

其中,a是拉格朗日乘子,ax≥0。(w,b)表示的是分类超平面,x表示的是训练集特征数据,是训练集的目标值。把数据带入后可以用求二次偏导的方法对最优化问题求极值。因为这是在 SVM 中,存在正负样本对偶性的问题,有两步优化解法:

在这里插入图片描述

其实通过拉格朗日乘子的算法,就可以通过求极值的方法直接求得支持向量是哪些点、分隔超平面的(w,b)参数的具体的值是什么。

3.工程实现

以上介绍的是支持向量机的基本概念和算法的公式推导,下面介绍SVM 在工程上的实现,因为 SVM 的代码实现起来比较复杂,这里介绍一下 SVM 最著名的开源库 LIBSVM以及其在 Python 环境下的使用方法。

LIBSVM 是台湾大学林智仁教授等人开发的一个简单、易于使用和快速有效的 SVM 模式识别与回归的软件包,提供了全套的源代码,而且可以在 Windows、Linux、Mac Os 这几种系统下运行,目前 LIBSVM 还拥有C、Java、Matlab、C#、Ruby、Python 等数十种语言的版本,LBSVM 是支持向量机在开源领域比较权威的一款工具包。官网地址http://www.csie.ntu.edu.tw/~ cjlin/libsvm/

(1)环境配置。本文以系统Mac Os10.11,Python2.7 作为实验环境。

首先下载并且解压 LIBSVM 的源码包,并且在包的根目录下编译。

$ tar xzfv libsvm-3.17.tar.gz

$ cd libsvm-3.17

$ make

如果想通过 Python 调用的话,用户还需要到目录下面的 Python 目录中,再次用 make编译一下。

(2)代码解析。进入 Python 目录后,用户可以看到 svm.py 和 svmutil.py 两个文件。这两个文件是支持向量机算法的 Python 实现,代码写的很简练而且性能非常高。以下是几个关键的函数。

svm_train():训练 SVM 模型。svm_predict():对数据做预测。svm_read_problem():读 LIBSVM 格式的数据,svm_load_model():读取模型。svm_save_model():存模型evaluations():结果评估。

(3)实验。调用 LIBSVM 库来实现一个案例,首先需要介绍的就是LIBSVM 的数据格式跟之前算法使用的数据格式不同,是通过 k:v这样的形式表示的。

第一列是目标列,通过+1和-1表示正反两种对象。除了第一列都是训练数据,数据之间用空格隔开,通过k:v来表示,k是索引(第几列),v表示具体数据值,如果v是0的话可以不连续,这是一种稀疏数据的表现方式。LBSVM 的数据格式可以通过脚本生成,也可以通过链接https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/直接下载一些样例教据。

下面介绍 LIBSVM 的调用。

from svmutil import *

y,x= svm_read problem('ala.txt')

yt,xt= svm read problem('ala.t.txt')

m=svm train(y,x)

svm predict(yt,xt,m)

通过对 ala.txt 数据进行训练,对 ala.t.txt 进行预测.

SVM 一直以良好的分类效果著称,通过向量机进行分类以及把低维数据映射到高维的思路体现了 SVM 的独特性,也让 SVM 成为每个算法研究者的必修课。本节只是对 SVM 的理论和推导进行了最基础的介绍,因为SVM 的算法是一个非常复杂的逻辑,所以如果想完全理解 SVM 需要花费非常多的时间。在工程实现部分使用的 LIBSVM 开源包是一款非常出色的开源项目,也是一个非常好的学习工具,如果有对 SVM 非常感兴趣的同学,建议从 LIBSVM 项目学起。


结束语🥇

以上就是机器学习

持续更新机器学习教程,欢迎大家订阅系列专栏🔥机器学习

你们的支持就是曼亿点创作的动力💖💖💖

请添加图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。