Task5的学习内容是“掌握基本的分类模型

Task5的学习内容是“掌握基本的分类模型
2.2 使用sklearn构建完整的分类项目
(1) 收集数据集并选择合适的特征:在数据集上我们使用我们比较熟悉的IRIS鸢尾花数据集。

from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
feature = iris.feature_names
data = pd.DataFrame(X,columns=feature)
data[‘target’] = y
data.head()
各个特征的相关解释:

sepal length (cm):花萼长度(厘米)
sepal width (cm):花萼宽度(厘米)
petal length (cm):花瓣长度(厘米)
petal width (cm):花瓣宽度(厘米)
(2) 选择度量模型性能的指标:
度量分类模型的指标和回归的指标有很大的差异,首先是因为分类问题本身的因变量是离散变量,因此像定义回归的指标那样,单单衡量预测值和因变量的相似度可能行不通。其次,在分类任务中,我们对于每个类别犯错的代价不尽相同,例如:我们将癌症患者错误预测为无癌症和无癌症患者错误预测为癌症患者,在医院和个人的代价都是不同的,前者会使得患者无法得到及时的救治而耽搁了最佳治疗时间甚至付出生命的代价,而后者只需要在后续的治疗过程中继续取证就好了,因此我们很不希望出现前者,当我们发生了前者这样的错误的时候会认为建立的模型是很差的。为了解决这些问题,我们必须将各种情况分开讨论,然后给出评价指标。

真阳性TP:预测值和真实值都为正例;
真阴性TN:预测值与真实值都为正例;
假阳性FP:预测值为正,实际值为负;
假阴性FN:预测值为负,实际值为正;
在这里插入图片描述
(3) 选择具体的模型并进行训练
逻辑回归logistic regression:
说到分类问题与回归问题的区别,在于回归问题与分类问题需要预测的因变量不一样。在回归问题中,因变量是连续性变量,我们需要预测𝐸(𝑌 |𝑋)是一个连续的实数,但是在分类问题中,我们往往是通过已知X的信息预测Y的类别,往往是一个离散集合中的某个元素。如:是否患癌症,图片是猫还是狗等。一个很自然的想法是能否用线性回归去处理分类问题,答案是可以但不好!
先来看看线性回归处理分类问题会出现什么弊端,我们仔细来看这个线性回归的例子,
𝑑𝑒𝑓𝑎𝑢𝑙𝑡 = 𝛽0 + 𝛽1𝐵𝑎𝑙𝑎𝑛𝑐𝑒 + 𝛽2𝐼𝑛𝑐𝑜𝑚𝑒,只要输入Balance 和 Income 以及default的数据就能用 小二乘法估计出𝛽0, 𝛽1,设定预测的default>0.5就是违约反之不违约,感觉很完美的样子,但事实真的是这样吗?假设我们需要用某个人的债务(Balance)和收入(Income)去预测是否会信用卡违约(default):
我们假设有一个穷人Lisa,他的Balance和Income都很小,那么有可能会导致default的值为负数,那么这个负数代表什么意义呢?显然是没有任何意义的。
基于概率的分类模型:
(1) 线性判别分析:
线性判别分析是一个比较久远的算法,我将会从两个方向去描述这个算法,因为我觉得每位读者都有自己喜欢的那个理解的方向,分别是基于贝叶斯公式和降维分类的思想。

基于贝叶斯公式对线性判别分析的理解:
在讨论如何解决多分类问题之前,我们先来说说贝叶斯的那些事吧。在概率统计的领域里有一条神奇的公式叫贝叶斯定理,具体的形式是: 𝑃(𝑌=𝑘|𝑋=𝑥)=𝜋𝑘𝑓𝑘(𝑥)∑𝑙=1𝐾𝜋𝑙𝑓𝑙(𝑥) ,我们 先不要被公式的符号吓到,我们先来看看符号具体代表什么意思。我们假设观测有 𝐾 类, 𝜋𝑘 为随机选择的观测来自第 𝑘 类的 先验概率,也就是样本里面第 𝑘 类的样本个数除以总样本的个数: 𝜋𝑘=𝑛𝑘𝑛 。再来 𝑓𝑘(𝑥)=𝑃(𝑋=𝑥|𝑌=𝑘) ,表示第 𝑘 类观测的X的密度函数,说的直白一点就是在 𝑌=𝑘 的样本里 𝑋=𝑥 的样本个数,即 𝑓𝑘(𝑥)=𝑃(𝑋=𝑥|𝑌=𝑘)=𝑛(𝑋=𝑥,𝑌=𝑘)𝑛(𝑌=𝑘) ,最后, ∑𝑙=1𝐾𝜋𝑙𝑓𝑙(𝑥)=𝑃(𝑋=𝑥)=𝑛(𝑋=𝑥)𝑛 ,也就是样本中 𝑋=𝑥 的概率。 在讨论贝叶斯定理后,我们回到分类问题,这个定理跟我们的分类问题有什么关联呢?没错,这个公式 𝑃(𝑌=𝑘|𝑋=𝑥)=𝜋𝑘𝑓𝑘(𝑥)∑𝑙=1𝐾𝜋𝑙𝑓𝑙(𝑥) 给出了给定样本条件下, 𝑌=𝑘 这个类别下的概率,这给分类问题提供了一条思路,那就是计算这个 𝑃(𝑌=𝑘|𝑋=𝑥) ,而且我们的逻辑回归就是这么干的,但是在 𝑃(𝑌=𝑘|𝑋=𝑥)=𝜋𝑘𝑓𝑘(𝑥)∑𝑙=1𝐾𝜋𝑙𝑓𝑙(𝑥) 这个公式中,分母 ∑𝑙=1𝐾𝜋𝑙𝑓𝑙(𝑥)=𝑃(𝑋=𝑥) 当样本给定的时候是一个与分类 𝑘 无关的常数,所以我们的问题可以简化为只需要计算分子 𝜋𝑘𝑓𝑘(𝑥) ,进而比较哪个类别的概率最大就知道属于哪个类别了,因此我们的分类思路就出来啦,这个思路不同于逻辑回归,逻辑回归需要计算具体的 𝑃(𝑌=𝑘|𝑋=𝑥) 概率值,而我们现在的思路是通过贝叶斯定理计算贝叶斯定理的分子,比较分子最大的那个类别为最终类别。
在我们推导复杂算法之前,我们先推导下简单的当自变量个数只有一个的模型,即 𝑝=1 的简单模型。我们记 𝑃(𝑌=𝑘|𝑋=𝑥)=𝜋𝑘𝑓𝑘(𝑥)∑𝑙=1𝐾𝜋𝑙𝑓𝑙(𝑥) 的分子为 𝑔𝑘(𝑥)=𝜋𝑘𝑓𝑘(𝑥) 。在这里,我们做个模型假设:假设 𝑓𝑘(𝑥) 服从正态分布,即 𝑓𝑘(𝑥)∼𝑁(𝜇,𝜎2𝑘) ,而且每个 𝜎2𝑘=𝜎2 ,同方差假设。因此 𝑓𝑘(𝑥)=12𝜋⎯⎯⎯⎯√𝜎𝑘𝑒−12𝜎2(𝑥−𝜇𝑘)2 ,最终我们的 𝑔𝑘(𝑥)=𝜋𝑘12𝜋⎯⎯⎯⎯√𝜎𝑘𝑒−12𝜎2(𝑥−𝜇𝑘)2 ,终于算出来啦。这个式子不是很好计算,我们对 𝑔𝑘(𝑥) 取个对数,令 𝛿𝑘(𝑥)=𝑙𝑛(𝑔𝑘(𝑥))=𝑙𝑛𝜋𝑘+𝜇𝜎2𝑥−𝜇22𝜎2 ,到这里我们的模型建立模型,我们只需要把位置的 𝜇𝑘 与 𝜎2 估计出来就好了。 𝜇̂ 𝑘=1𝑛𝑘∑𝑖:𝑦𝑖=𝑘𝑥𝑖 ,也就是当 𝑦=𝑘 这一类中 𝑥 的平均值; 𝜎̂ 2=1𝑛−𝐾∑𝑘=1𝐾∑𝑖:𝑦𝑖=𝑘(𝑥𝑖−𝜇̂ 𝑘)2 ,说白了就是计算每一类的方差,再求平均值。
至此,我们的模型就建立完成了,我们只需要代入数据求出 𝛿𝑘(𝑥) ,哪个 𝑘 对应的 𝛿𝑘(𝑥) 大,就是哪一类。
(下图虚线是线性判别分析的决策边界,正态曲线哪边高样本就是哪一类)
(2) 朴素贝叶斯:
在线性判别分析中,我们假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是
存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判
别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各
自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。在之前所看到的偏差-方差理论
中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线
性判别分析模型的方差小,偏差大。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚
至多于线性判别分析,例如鼎鼎大名的新闻分类,垃圾邮件分类等。
我们推到出了一个自变量的简单模型,就要泛化为多个自变量的线性判别分析了,即 𝑝>1 。其实原理一样的,只是将一元正态分布扩展为多元正态分布: 𝑓𝑘(𝑥)=1(2𝜋)𝑝2|Σ|12𝑒[−12(𝑥−𝜇𝑘)𝑇Σ−1(𝑥−𝜇𝑘)]
𝜇𝑘^=(𝜇𝑘1,𝜇𝑘2,…,𝜇𝑘𝑝),Σ̂ =1𝑝−1∑𝑗=1𝑝(𝑥𝑗−𝑥⎯⎯⎯)(𝑥𝑗−𝑥⎯⎯⎯)𝑇
𝛿𝑘(𝑥)=𝑙𝑛(𝜋𝑘𝑓𝑘(𝑥))=𝑙𝑛(𝜋𝑘)−(𝑝2𝑙𝑛(2𝜋)+12𝑙𝑛(|Σ|))−12(𝑥−𝜇𝑘)𝑇Σ−1(𝑥−𝜇𝑘)=𝑥𝑇Σ̂ 𝜇̂ 𝑘−12𝜇̂ 𝑇𝑘Σ̂ −1𝜇̂ 𝑘+𝑙𝑛𝜋̂ 𝑘
降维分类的思想理解线性判别分析:
基于数据进行分类时,一个很自然的想法是:将高维的数据降维至一维,然后使用某个阈值将各个类别分开。下面用图的形式展示:
数据的维度是二维的,我们的想法是把数据降维至一维,然后用阈值就能分类。这个似乎是一个很好的想法,我们总是希望降维后的数据同一个类别自身内部方差小,不同类别之间的方差要尽可能大。这也是合理的,因为同一个类别的数据应该更加相似,因此方差小;不同类别的数据之间应该很不相似,这样才能更容易对数据进行分类,我们简称为:类内方差小,类间方差大,在计算机语言叫“松耦合,高内聚”。在做具体的推导之前,我们对数据的形式和一些基本统计量做一些描述:
特征 𝑋=(𝑥1,𝑥2,…,𝑥𝑁)𝑇 ,因变量 𝑌=(𝑦1,𝑦2,…,𝑦𝑁)𝑇,其中,𝑦𝑖∈{+1,−1} ,类别c1的特征 𝑋𝑐1={𝑥𝑖|𝑦𝑖=+1} ,同理,类别c2的特征 𝑋𝑐2={𝑥𝑖|𝑦𝑖=−1} ,属于c1类别的数据个数为 𝑁1 ,属于类别c2的数据个数为 𝑁2 ,其中, 𝑁1+𝑁2=𝑁 。
特征X投影在w方向至一维: 𝑧𝑖=𝑤𝑇𝑥𝑖,||𝑤||=1
全样本投影的均值 𝑧¯=1𝑁∑𝑖=1𝑁𝑧𝑖=1𝑁∑𝑖=1𝑁𝑤𝑇𝑥𝑖
全样本投影的协方差 𝑆𝑧=1𝑁∑𝑖=1𝑁(𝑧𝑖−𝑧¯)(𝑧𝑖−𝑧¯)𝑇=1𝑁∑𝑖=1𝑁(𝑤𝑇𝑥𝑖−𝑧¯)(𝑤𝑇𝑥𝑖−𝑧¯)𝑇
c1样本投影的均值 𝑧1¯=1𝑁1∑𝑖=1𝑁1𝑧𝑖=1𝑁1∑𝑖=1𝑁1𝑤𝑇𝑥𝑖
c1样本投影的协方差 𝑆𝑧1=1𝑁1∑𝑖=1𝑁1(𝑧𝑖−𝑧1¯)(𝑧𝑖−𝑧1¯)𝑇=1𝑁1∑𝑖=1𝑁1(𝑤𝑇𝑥𝑖−𝑧1¯)(𝑤𝑇𝑥𝑖−𝑧1¯)𝑇
c2样本投影的均值 𝑧2¯=1𝑁2∑𝑖=1𝑁2𝑧𝑖=1𝑁2∑𝑖=1𝑁2𝑤𝑇𝑥𝑖
c2样本投影的协方差 𝑆𝑧2=1𝑁2∑𝑖=1𝑁2(𝑧𝑖−𝑧2¯)(𝑧𝑖−𝑧2¯)𝑇=1𝑁2∑𝑖=1𝑁2(𝑤𝑇𝑥𝑖−𝑧2¯)(𝑤𝑇𝑥𝑖−𝑧2¯)𝑇
类间差距: (𝑧¯1−𝑧¯2)2
类内方差: 𝑆1+𝑆2
由于线性判别分析的目标是同一类别内方差小,不同类别之间距离大,因此损失函数定义为:
𝐽(𝑤)=(𝑧¯1−𝑧¯2)2𝑠1+𝑠2=𝑤𝑇(𝑥¯𝑐1−𝑥¯𝑐2)(𝑥¯𝑐1−𝑥¯𝑐2)𝑇𝑤𝑤𝑇(𝑠𝑐1+𝑠𝑐2)𝑤𝑤̂ =𝑎𝑟𝑔𝑚𝑎𝑥𝑤𝐽(𝑤)

记: 𝑆𝑏=(𝑥¯𝑐1−𝑥¯𝑐2)(𝑥¯𝑐1−𝑥¯𝑐2)𝑇,𝑆𝑤=(𝑠𝑐1+𝑠𝑐2) ,因此 𝐽(𝑤)=𝑤𝑇𝑆𝑏𝑤𝑤𝑇𝑆𝑤𝑤
让J(w)对w求导等于0,求出: 𝑤=𝑆−1𝑤(𝑥¯𝑐1−𝑥¯𝑐2)
(2) 朴素贝叶斯:
在线性判别分析中,我们假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。但是,朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。在之前所看到的偏差-方差理论中,我们知道模型的简化可以带来方差的减少但是增加偏差,因此朴素贝叶斯也不例外,它比线性判别分析模型的方差小,偏差大。虽然简化了模型,实际中使用朴素贝叶斯的案例非常多,甚至多于线性判别分析,例如鼎鼎大名的新闻分类,垃圾邮件分类等。
决策树 :
与前面内容所讲的决策树回归大致是一样的,只是在回归问题中,选择分割点的标准是均方误差,但是在分类问题中,由于因变量是类别变量而不是连续变量,因此用均方误差显然不合适。那问题是用什么作为选择分割点的标准呢?我们先来分析具体的问题:
在回归树中,对一个给定的观测值,因变量的预测值取它所属的终端结点内训练集的平均因变量。与之相对应,对于分类树来说,给定一个观测值,因变量的预测值为它所属的终端结点内训练集的最常出现的类。分类树的构造过程与回归树也很类似,与回归树一样,分类树也是采用递归二叉分裂。但是在分类树中,均方误差无法作为确定分裂节点的准则,一个很自然的替代指标是分类错误率。分类错误率就是:此区域内的训练集中非常见类所占的类别,即:
𝐸=1−𝑚𝑎𝑥𝑘(𝑝̂ 𝑚𝑘)

上式中的 𝑝̂ 𝑚𝑘 代表第m个区域的训练集中第k类所占的比例。但是在大量的事实证明:分类错误率在构建决策树时不够敏感,一般在实际中用如下两个指标代替:
(1) 基尼系数:
𝐺=∑𝑘=1𝐾𝑝̂ 𝑚𝑘(1−𝑝̂ 𝑚𝑘)

在基尼系数的定义中,我们发现这个指标衡量的是K个类别的总方差。不难发现,如果所有的 𝑝̂ 𝑚𝑘 的取值都接近0或者1,基尼系数会很小。因此基尼系数被视为衡量结点纯度的指标----如果他的取值小,那就意味着某个节点包含的观测值几乎来自同一个类别。
由基尼系数作为指标得到的分类树叫做:CART。
(2) 交叉熵:
可以替代基尼系数的指标是交叉熵,定义如下:
𝐷=−∑𝑘=1𝐾𝑝̂ 𝑚𝑘𝑙𝑜𝑔𝑝̂ 𝑚𝑘

显然,如果所有的 𝑝̂ 𝑚𝑘 都接近于0或者1,那么交叉熵就会接近0。因此,和基尼系数一样,如果第m个结点的纯度越高,则交叉熵越小。事实证明,基尼系数和交叉熵在数值上时很接近的。

jupyter
决策树分类算法的完整步骤:
a. 选择最优切分特征j以及该特征上的最优点s:
遍历特征j以及固定j后遍历切分点s,选择使得基尼系数或者交叉熵最小的(j,s)
b. 按照(j,s)分裂特征空间,每个区域内的类别为该区域内样本比例最多的类别。
c. 继续调用步骤1,2直到满足停止条件,就是每个区域的样本数小于等于5。
d. 将特征空间划分为J个不同的区域,生成分类树。
支持向量机SVM:
支持向量机SVM是20世纪90年代在计算机界发展起来的一种分类算法,在许多问题中都被证明有较好的效果,被认为是适应性最广的算法之一。
jupyter
支持向量机的基本原理非常简单,如图所视,白色和蓝色的点各为一类,我们的目标是找到一个分割平面将两个类别分开。通常来说,如果数据本身是线性可分的,那么事实上存在无数个这样的超平面。这是因为给定一个分割平面稍微上移下移或旋转这个超平面,只要不接触这些观测点,仍然可以将数据分开。一个很自然的想法就是找到最大间隔超平面,即找到一个分割平面距离最近的观测点最远。下面我们来严格推导:
我们根据距离超平米那最近的点,只要同时缩放w和b可以得到: 𝑤𝑇𝑥1+𝑏=1 与 𝑤𝑇𝑥2+𝑏=−1 ,因此:
𝑤𝑇𝑥1+𝑏=1𝑤𝑇𝑥2+𝑏=−1(𝑤𝑇𝑥1+𝑏)−(𝑤𝑇𝑥2+𝑏)=2𝑤𝑇(𝑥1−𝑥2)=2𝑤𝑇(𝑥1−𝑥2)=‖𝑤‖2‖𝑥1−𝑥2‖2cos𝜃=2‖𝑥1−𝑥2‖2cos𝜃=2‖𝑤‖2𝑑1=𝑑2=‖𝑥1−𝑥2‖2cos𝜃2=2‖𝑤‖22=1‖𝑤‖2𝑑1+𝑑2=2‖𝑤‖2

由此可知道SVM模型的具体形式:
min𝑤,𝑏 s.t. 12‖𝑤‖2𝑦(𝑖)(𝑤𝑇𝑥(𝑖)+𝑏)≥1,𝑖=1,…,𝑛

可以将约束条件写为: 𝑔𝑖(𝑤)=−𝑦(𝑖)(𝑤𝑇𝑥(𝑖)+𝑏)+1≤0
可以将优化问题拉格朗日化
(𝑤,𝑏,𝛼)=12‖𝑤‖2−∑𝑖=1𝑛𝛼𝑖[𝑦(𝑖)(𝑤𝑇𝑥(𝑖)+𝑏)−1]

因此:
(𝑤,𝑏,𝛼)=12‖𝑤‖2−∑𝑖=1𝑛𝛼𝑖[𝑦(𝑖)(𝑤𝑇𝑥(𝑖)+𝑏)−1]

欲构造 dual 问题, 首先求拉格朗日化的问题中 w 和 b 的值, 对 w 求梯度, 令梯度为 0, 可求得 w:
对 b 求梯度, 令梯度为 0, 可得:
∂∂𝑏(𝑤,𝑏,𝛼)=∑𝑖=1𝑛𝛼𝑖𝑦(𝑖)=0

将 w 带入拉格朗日化的原问题可得
(𝑤,𝑏,𝛼)=∑𝑛𝑖=1𝛼𝑖−12∑𝑛𝑖,𝑗=1𝑦(𝑖)𝑦(𝑗)𝛼𝑖𝛼𝑗(𝑥(𝑖))𝑇𝑥(𝑗)−𝑏∑𝑛𝑖=1𝛼𝑖𝑦(𝑖)(𝑤,𝑏,𝛼)=∑𝑛𝑖=1𝛼𝑖−12∑𝑛𝑖,𝑗=1𝑦(𝑖)𝑦(𝑗)𝛼𝑖𝛼𝑗(𝑥(𝑖))𝑇𝑥(𝑗)

因此:
对拉格朗日化的原问题求最小值, 得到了 w , 现在可以构造 dual 问題 max𝛼 s.t. 𝑊(𝛼)=∑𝑖=1𝑛𝛼𝑖−12∑𝑖,𝑗=1𝑛𝑦(𝑖)𝑦(𝑗)𝛼𝑖𝛼𝑗⟨𝑥(𝑖),𝑥(𝑗)⟩𝛼𝑖≥0,𝑖=1,…,𝑛∑𝑖=1𝑛𝛼𝑖𝑦(𝑖)=0 可以推导出 b的值为: 𝑏∗=−max𝑖:𝑦(𝑖)=−1𝑤∗𝑇𝑥(𝑖)+min𝑖:𝑦(𝑖)=1𝑤∗𝑇𝑥(𝑖)2 SVM的决策子如下,值的符号为类别. 𝑤𝑇𝑥+𝑏=(∑𝑛𝑖=1𝛼𝑖𝑦(𝑖)𝑥(𝑖))𝑇𝑥+𝑏=∑𝑛𝑖=1𝛼𝑖𝑦(𝑖)⟨𝑥(𝑖),𝑥⟩+𝑏

非线性支持向量机:
在刚刚的讨论中,我们都是着重讨论了线性支持向量机是如何工作的,但是在现实生活中,我们很难碰到线性可分的数据集,如:
jupyter
那我们应该如何处理非线性问题呢?答案就是将数据投影至更加高的维度!
jupyter
上图中,在一维数据做不到线性可分,我们将数据投影至二维平面就可以成功线性可分。那么,我们来详细探讨下这其中的奥妙:

Φ:↦̂ =Φ(𝐱)Φ([𝑥𝑖1,𝑥𝑖2])=[𝑥𝑖1,𝑥𝑖2,𝑥𝑖1𝑥𝑖2,𝑥2𝑖1,𝑥2𝑖2]

如果我们使用上面公式的形式将低维数据拓展至高维数据,则必须面临一个很大的问题,那就是:维度爆炸导致的计算量太大的问题。假如是一个2维特征的数据,我们可以将其映射到5维来做特征的内积,如果原始空间是三维,可以映射到到19维空间,似乎还可以处理。但是如果我们的低维特征是100个维度,1000个维度呢?那么我们要将其映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。能不能呢个避免这个问题呢?核函数隆重登场:
回顾线性可分SVM的优化目标函数:
𝑚𝑖𝑛⏟𝛼12∑𝑖=1,𝑗=1𝑚𝛼𝑖𝛼𝑗𝑦𝑖𝑦𝑗𝑥𝑖∙𝑥𝑗−∑𝑖=1𝑚𝛼𝑖𝑠.𝑡.∑𝑖=1𝑚𝛼𝑖𝑦𝑖=00≤𝛼𝑖≤𝐶

注意到上式低维特征仅仅以内积𝑥𝑖∙𝑥𝑗 的形式出现,如果我们定义一个低维特征空间到高维特征空间的映射𝜙,将所有特征映射到一个更高的维度,让数据线性可分,我们就可以继续按前两篇的方法来优化目标函数,求出分离超平面和分类决策函数了。也就是说现在的SVM的优化目标函数变成:
min⏟𝛼12∑𝑚𝑖=1,𝑗=1𝛼𝑖𝛼𝑗𝑦𝑖𝑦𝑗𝜙(𝑥𝑖)∙𝜙(𝑥𝑗)−∑𝑚𝑖=1𝛼𝑖 s. 𝑡.∑𝑚𝑖=1𝛼𝑖𝑦𝑖=00≤𝛼𝑖≤𝐶

可以看到,和线性可分SVM的优化目标函数的区别仅仅是将内积𝑥𝑖∙𝑥𝑗替换为𝜙(𝑥𝑖)∙𝜙(𝑥𝑗)。我们要将其映射到超级高的维度来计算特征的内积。这时候映射成的高维维度是爆炸性增长的,这个计算量实在是太大了,而且如果遇到无穷维的情况,就根本无从计算了。下面引入核函数:
假设𝜙是一个从低维的输入空间𝜒(欧式空间的子集或者离散集合)到高维的希尔伯特空间的映射。那么如果存在函数𝐾(𝑥,𝑧),对于任意𝑥,𝑧∈𝜒,都有:
𝐾(𝑥,𝑧)=𝜙(𝑥)∙𝜙(𝑧)

那么我们就称𝐾(𝑥,𝑧)为核函数。
仔细发现,𝐾(𝑥,𝑧)的计算是在低维特征空间来计算的,它避免了在刚才我们提到了在高维维度空间计算内积的恐怖计算量。也就是说,我们可以好好享受在高维特征空间线性可分的利益,却避免了高维特征空间恐怖的内积计算量。下面介绍几种常用的核函数:
(1) 多项式核函数:
多项式核函数(Polynomial Kernel)是线性不可分SVM常用的核函数之一,表达式为:
𝐾(𝐱𝑖,𝐱𝑗)=(⟨𝐱𝑖,𝐱𝑗⟩+𝑐)𝑑

C用来控制低阶项的强度,C=0,d=1代表无核函数。
(2) 高斯核函数:
高斯核函数(Gaussian Kernel),在SVM中也称为径向基核函数(Radial Basis Function,RBF),它是非线性分类SVM最主流的核函数。libsvm默认的核函数就是它。表达式为:
𝐾(𝐱𝑖,𝐱𝑗)=exp(−‖‖𝐱𝑖−𝐱𝑗‖‖222𝜎2)

使用高斯核函数之前需要将特征标准化,因此这里衡量的是样本之间的相似度。
(3) Sigmoid核函数:
Sigmoid核函数(Sigmoid Kernel)也是线性不可分SVM常用的核函数之一,表达式为:
𝐾(𝐱𝑖,𝐱𝑗)=tanh(𝛼𝐱⊤𝑖𝐱𝑗+𝑐)

此时的SVM相当于没有隐藏层的简单神经网络。
(4) 余弦相似度核:
常用于衡量两段文字的余弦相似度,表达式为:
𝐾(𝐱𝑖,𝐱𝑗)=𝐱⊤𝑖𝐱𝑗‖𝐱𝑖‖‖‖𝐱𝑗‖‖
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
‘’’
C:正则化参数。正则化的强度与C成反比。必须严格为正。惩罚是平方的l2惩罚。
kernel:{‘linear’,‘poly’,‘rbf’,‘sigmoid’,‘precomputed’},默认=‘rbf’
degree:多项式和的阶数
gamma:“ rbf”,“ poly”和“ Sigmoid”的内核系数。
shrinking:是否软间隔分类,默认true

‘’’
svc_iris = make_pipeline(StandardScaler(), SVC(gamma=‘auto’))
svc_iris.fit(X, y)
svc_iris.score(X,y)
0.9733333333333334

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值