基于AdaBoostSVM的不平衡数据训练(原理+代码,超详细)
文章目录
- Boosting思想
- AdaBoost
- SVM
- 最大间隔
- 支持向量 & 支持向量平面
- 寻找最大间隔
- AdaBoostSVM代码实现
Boosting思想
Boosting一族是可将弱学习器提升为强学习器的算法,它的思想就是每一个基分类器纠正前一个基分类器的错误,至于纠正的方式不同所以有不同的boosting算法。算法思想如下:
- 1.先从训练集训练出一个基学习器。
- 2.再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续得到较大的关注。
- 3.然后基于调整后的样本分布来训练下一个基学习器。
- 4.如此重复进行,直到基学习器数目达到指定的阈值T位置。
- 5.再将这T个基学习器进行加权结合得到强集成学习器。
AdaBoost
在boosting思想的基础上,adaboost思想如下:
- 1.初始化训练集权重,从初始训练集里训练得到一个基学习器
- 2.增加错分样本的权重,减少分对样本的权重
- 3.增加错误率小的基学习器的权重,减少错误率大的基学习器的权重
- 4.用调整后的(样本权重归一化)样本训练下一个基学习器
- 5.直到基学习器的数目达到实现指定的值
- 6.然后将这几个基学习器加权进行投票
数学定义如下:
经典adaboost只能解决二分类问题, y i ∈ { − 1 , 1 } y_i ∈ \{-1, 1\} yi∈{−1,1},数据定义如下:
T = ( x 1 , y 1 ) , ( x 2 , y 2 ) … ( x n , y n ) , y i ∈ ( − 1 , 1 ) T = {(x_1, y_1),(x_2, y_2) \ldots (x_n, y_n),y_i∈(-1, 1)} T=(x1,y1),(x2,y2)…(xn,yn),yi∈(−1,1)初始化训练样本权重分布
w 1 = ( w 11 , w 12 , w 13 … w 1 N ) , w 1 i = 1 N , i = 1 , 2 , … , N 权 重 初 始 化 为 1 N [ 1 N , 1 N , 1 N , … , 1 N ] w_1 = (w_{11}, w_{12}, w_{13} \ldots w_{1N}),w_{1i} = \frac{1}{N},i=1,2, \dots ,N \\ 权重初始化为 \frac{1}{N} \\ [\frac{1}{N}, \frac{1}{N}, \frac{1}{N}, \ldots, \frac{1}{N}] w1=(w11,w12,w13…w1N),w1i=N1,i=1,2,…,N权重初始化为N1[N1,N1,N1,…,N1]使用有权值分布 w m i w_{mi} wmi 的训练集学习得到基分类器 h m ( x ) h_m(x) hm(x)
计算 h m ( x ) h_m(x) hm(x) 在训练集上的错误率
e m = P ( h m ( x ) ≠ y i ) = ∑ i = 1 N w m i I ( h m ( x i ) ≠ y i ) ∑ i = 1 N w m i 因 为 权 重 会 归 一 化 , 所 以 分 母 为 一 e m = ∑ i = 1 N w m i I ( h m ( x i ) ≠ y i ) e_m = P(h_m(x) ≠ y_i) = \frac{\sum_{i=1}^{N} w_{mi} I(h_m(x_i) ≠ y_i)}{\sum_{i=1}^{N} w_{mi}} \\ 因为权重会归一化,所以分母为一 \\ e_m = \sum_{i=1}^{N} w_{mi} I(h_m(x_i) ≠ y_i) em=P(hm(x)=yi)=∑i=1Nwmi∑i=1NwmiI(hm(xi)=yi)因为权重会归一化,所以分母为一em=i=1∑NwmiI(hm(xi)=yi)- h m ( x i ) ≠ y i h_m(x_i) ≠ y_i hm(xi)=yi:相等是0,不相等是1
- e m e_m em:所有错分样本的加总
- 如果错误率大于0.5,算法终止
- 正确率小于0.5,算法也终止
计算 h m ( x ) h_m(x) hm(x)的相关系数 α α α,即基分类器的重要性,错误率越小,基分类器越重要
α m = 1 2 l n 1 − e m e m α_m = \frac{1}{2} ln \frac{1 - e_m}{e_m} αm=21lnem1−em更新训练数据的权重分布
w m + 1 = ( w m + 1 , 1 , w m + 1 , 2 , … w m + 1 , N ) w m + 1 , i = w m i Z m e x p ( − α m i h m ( x i ) ) = { w m i Z m e − α m i , h m ( x ) = y i 减 小 分 对 样 本 的 权 重 w m i Z m e α m i , h m ( x ) ≠ y i 增 加 错 分 样 本 的 权 重 这 里 Z m 是 规 范 化 因 子 , 它 使 w ( m + 1 ) 成 为 一 个 概 率 分 布 Z m = ∑ i = 1 N w m i e x p ( − α m y i h m ( x i ) ) , 其 实 作 为 分 母 来 讲 它 归 一 化 后 加 总 等 于 1 也 可 以 这 样 看 : 原 来 权 重 : [ 1 N , 1 N , … 1 N ] 现 在 权 重 : [ 1 N e − α , 1 N e α , … ] w_{m+1} = (w_{m+1}, 1, w_{m+1}, 2, \ldots w_{m+1}, N) \\ w_{m+1, i} = \frac{w_{mi}}{Z_m} exp(-α_{mi} \ h_m(x_i)) = \begin{cases} \frac{w_{mi}}{Z_m} e^{-α_{mi}},h_m(x) = y_i \ \ 减小分对样本的权重 \\ \frac{w_{mi}}{Z_m} e^{α_{mi}},h_m(x) ≠ y_i \ \ 增加错分样本的权重 \end{cases} \\ \\ 这里Z_m是规范化因子,它使w_{(m+1)}成为一个概率分布 \\ Z_m = \sum_{i=1}{N} w_{mi} exp(-α_m \ y_i \ h_m(x_i)),其实作为分母来讲它归一化后加总等于1 \\ 也可以这样看: \\ 原来权重:[\frac{1}{N}, \frac{1}{N}, \ldots \frac{1}{N}] \\ 现在权重:[\frac{1}{N} e^{-α},\frac{1}{N} e^{α},\dots] wm+1=(wm+1,1,wm+1,2,…wm+1,N)wm+1,i=Zmwmiexp(−αmi hm(xi))={Zmwmie−αmi,hm(x)=yi 减小分对样本的权重Zmwmieαmi,hm(x)=yi 增加错分样本的权重这里Zm是规范化因子,它使w(m+1)成为一个概率分布Zm=i=1∑Nwmiexp(−αm yi hm(xi)),其实作为分母来讲它归一化后加总等于1也可以这样看:原来权重:[N1,N1,…N1]现在权重:[N1e−α,N1eα,…]构建基分类器的线性组合
- M M M个基分类器的加权表决, α α α越大,基分类器越重要
f ( x ) = ∑ m = 1 M α m h m ( x ) f(x) = \sum_{m=1}^{M} α_mh_m(x) f(x)=m=1∑Mαmhm(x)
得到最终分类器
H ( x ) = s i g n ( f ( x ) ) s i g n : 符 号 函 数 = { s i g n ( x ) = 1 , x > 0 s i g n ( x ) = 0 , x = 0 s i g n ( x ) = − 1 , x < 0 H(x) = sign(f(x)) \\ sign: 符号函数 = \begin{cases} sign(x) = 1,x>0 \\ sign(x) = 0,x=0 \\ sign(x) = -1,x<0 \end{cases} H(x)=sign(f(x))sign:符号函数=⎩⎪⎨⎪⎧sign(x)=1,x>0sign(x)=0,x=0sign(x)=−1,x<0最小化指数损失
L ( f ( x ) , H ( x ) ) = e x p ( − f ( x ) H ( x ) ) L(f(x), H(x)) = exp(-f(x)H(x)) L(f(x),H(x))=exp(−f(x)H(x))其中 f ( x ) f(x) f(x)是真实的分类,等于-1或者1。 H ( x ) H(x) H(x)是分类器的分类结果,等于-1或者1
优化损失函数求偏导, α α α就出来了
SVM
最大间隔
SVM是在特征空间中找间隔最大的超平面,以此来进行分类的。对于线性可分问题,我们需要求硬间隔最大即可。对于非线性可分问题,我们需要通过核函数映射到高维空间,计算软间隔最大即可。下面以线性可分为例,我们来看一下SVM的形式化表示。
如上图所示,线性可分的时候,我们有很多条线(超平面)
可以把这两类区分开。我们需要找到最优的超平面,即以这个超平面划分能让我们的数据尽可能的分开。所以支持向量机就是来求这个超平面的。
尽可能分开的意思是:这两组数据离这个超平面最近的距离最大。如下图所示:
假设红线即为超平面,上方为一类、下方为一类。 d 1 d_1 d1、 d 2 d_2 d2 分别为上下两个类别到这个超平面最短的距离,我们要让这个超平面尽可能的分开两组数据,就要让这两个最小的距离加起来最大,这就是最大间隔。
支持向量 & 支持向量平面
支持向量定义为:距超平面距离最近的那些点。如上图所示到超平面距离为 d 1 d_1 d1、 d 2 d_2 d2的点。支持向量平面就是恰好过这些点的平面。二分类有两个支持向量平面,这两个平面是平行的。超平面是位于这两个平面中间的。如下图所示, a a a、 b b b 即为支持向量平面, c c c 为超平面。我们只需要使 a a a、 b b b 的间隔最大,那么超平面的分隔效果就越好。
所以我们的问题就是寻找最大的距离间隔。
寻找最大间隔
- 首先我们定义我们要求解的超平面,其实就是我们的线性方程:
c = w T x + b 设 : w T x + b = 0 c = w^Tx + b \\ 设:\ w^Tx + b = 0 c=wTx+b设: wTx+b=0
w w w 为超平面 c c c 的法向量,即垂直于超平面的向量,它能决定超平面的方向。b就是截距,能确定超平面的位置。
- 为方便运算我们设支持向量平面为:
a : w T x + b = 1 b : w T x + b = − 1 a: \ w^Tx + b = 1 \\ b: \ w^Tx + b = -1 a: wTx+b=1b: wTx+b=−1
- 算最大间隔
假设 a a a上有一点 x 1 x_1 x1, b b b上有一点 x 2 x_2 x2,如下图所示分别做原点到 x 1 x_1 x1、 x 2 x_2 x2的向量。那么我们可以求得两向量的差: x 1 ⃗ − x 2 ⃗ \vec{x_1} - \vec{x_2} x1 −x2 。所以我们的间隔就可以表示成: ∣ ∣ x 1 ⃗ − x 2 ⃗ ∣ ∣ c o s θ ||\vec{x_1} - \vec{x_2}|| \ cosθ ∣∣x1 −x2 ∣∣ cosθ
我们需要求得距离 d d d 最大。
将 x 1 带 入 a : w T x 1 + b = 1 ( 1 ) 将 x 2 带 入 b : w T x 2 + b = − 1 ( 2 ) ( 1 ) − ( 2 ) : w T ⋅ ( x 1 ⃗ − x 2 ⃗ ) = 2 即 : ∣ ∣ w ∣ ∣ ⋅ ∣ ∣ ( x 1 ⃗ − x 2 ⃗ ) ∣ ∣ ⋅ c o s θ = 2 ∣ ∣ w ∣ ∣ ⋅ d = 2 d = 2 ∣ ∣ w ∣ ∣ 将x_1带入a:\ \ w^Tx_1 + b = 1 \ \ \ (1) \\ 将x_2带入b:\ \ w^Tx_2 + b = -1 \ \ \ (2) \\ (1) - (2):\ \ w^T \cdot (\vec{x_1} - \vec{x_2}) = 2 \\ 即:\ \ ||w|| \cdot ||(\vec{x_1} - \vec{x_2})|| \cdot cosθ = 2 \\ ||w|| \cdot d = 2 \\ d = \frac{2}{||w||} 将x1带入a: wTx1+b=1 (1)将x2带入b: wTx2+b=−1 (2)(1)−(2): wT⋅(x1 −x2 )=2即: ∣∣w∣∣⋅∣∣(x1 −x2 )∣∣⋅cosθ=2∣∣w∣∣⋅d=2d=∣∣w∣∣2所以问题就从求 d d d的最大值,转为求 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣的最小值。
+ 假设我们把超平面上方的点标记为1,下方的点标记为-1,根据两个支持向量平面 a a a、 b b b,我们可得约束条件如下:
{ w T x i + b ≥ 1 , y i = 1 w T x i + b ≤ − 1 , y i = − 1 即 : s . t . : y i ( w T x i + b ) ≥ 1 \begin{cases} w^T x_i + b ≥ 1,y_i = 1 \\ w^T x_i + b ≤ -1,y_i = -1 \end{cases} \\ 即:\ \ s.t.:\ \ y_i (w^T x_i + b) ≥ 1 {wTxi+b≥1,yi=1wTxi+b≤−1,yi=−1即: s.t.: yi(wTxi+b)≥1
所以我们需要再 s . t . s.t. s.t.约束下,求 m i n ∣ ∣ w ∣ ∣ min ||w|| min∣∣w∣∣,
问题一
。为了方便计算我们将 m i n ∣ ∣ w ∣ ∣ min ||w|| min∣∣w∣∣,加 1 2 \frac{1}{2} 21,并把摸写为矩阵形式,因为摸也是范数 就是向量根自己的内积再开方,写为 m i n 1 2 w T w min \frac{1}{2}w^Tw min21wTw。
所以这其实是一个凸优化问题,因为 m i n 1 2 w T w min \frac{1}{2}w^Tw min21wTw 可以写为 m i n 1 2 ∣ ∣ w ∣ ∣ 2 min \frac{1}{2} ||w||^2 min21∣∣w∣∣2。
在一定约束下求某个极值,满足拉格朗日乘法,所以我们先引入拉格朗日乘子 λ i ≥ 0 \lambda_i ≥ 0 λi≥0
m i n w , b m a x λ L ( w , b , λ i ) = 1 2 w T w + ∑ i = 1 n λ i ( 1 − y i ( w T x i + b ) ) \underset {w, b}{min} \ \underset {\lambda}{max} \ L(w, b, \lambda_i) = \frac{1}{2}w^Tw + \sum_{i=1}^{n} \lambda_i (1 - y_i(w^Tx_i + b)) w,bmin λmax L(w,b,λi)=21wTw+i=1∑nλi(1−yi(wTxi+b))
相当于我们把求 m i n ∣ ∣ w ∣ ∣ min ||w|| min∣∣w∣∣,将约束带进拉格朗日方程,转为无约束问题
问题二
。我们对 w w w、 b b b求偏导可得:
∂ L ∂ w = 0 w = ∑ i = 1 n λ i y i x i ∂ L ∂ b = 0 b = ∑ i = 1 n λ i y i \frac{\partial L}{\partial w} = 0 \\ w = \sum_{i=1}^{n} \lambda_i y_i x_i \\ \frac{\partial L}{\partial b} = 0 \\ b = \sum_{i=1}^{n} \lambda_i y_i ∂w∂L=0w=i=1∑nλiyixi∂b∂L=0b=i=1∑nλiyi
- 将 w w w、 b b b带回拉格朗日方程得:
m i n w , b m a x λ L ( w , b , λ i ) = ∑ i = 1 n λ i − 1 2 ∑ i = 1 n ∑ j = 1 n λ i λ j y i y j x i T x j \underset {w, b}{min} \ \underset {\lambda}{max} \ L(w, b, \lambda_i) = \sum_{i=1}^{n}\lambda_i - \frac{1}{2} \sum_{i=1}^{n}\sum_{j=1}^{n}\lambda_i \lambda_j y_i y_j x_i^Tx_j w,bmin λmax L(w,b,λi)=i=1∑nλi−21i=1∑nj=1∑nλiλjyiyjxiTxj
我们称这个方程为
问题二
的对偶问题,并且还可以证明它是强对偶的关系。然后我们可以通过KKT、SMO
(序列最小化优化)
来求得我们的最优解。这里就不再过多阐述了。
SVM的通俗讲解可以看下这篇文章:https://wangguisen.blog.csdn.net/article/details/107210881?spm=1001.2014.3001.5502
AdaBoostSVM代码实现
from sklearn.svm import SVC
from sklearn.naive_bayes import BernoulliNB
from sklearn.ensemble import AdaBoostClassifierbase = SVC(kernel='rbf', class_weight='balanced', C=1.0, probability=True)
# base = BernoulliNB()model = AdaBoostClassifier(n_estimators=10, base_estimator=base)
model.fit(x_train, y_train)print(model.predict_proba(x_train))
基于AdaBoostSVM的不平衡数据训练(原理+代码,超详细)相关推荐
- 【opencv】基于opencv实现人脸识别,原理代码部分
上一部分我们解决了环境问题,这一部分我们可以开始上代码,环境没有配好的可以参照上一篇博客:环境搭建解决: 下面先说一下原理: 一.原理部分 本文基于opencv来实现人脸识别,大致实现流程可以描述 ...
- java 金数据推送数据_基于JAVA的黄金数据接口调用代码实例
代码描述:基于JAVA的黄金数据接口调用代码实例 接口地址:http://www.juhe.cn/docs/api/id/29 1.[代码][Java]代码 import java.io.Buffer ...
- 条件随机场(CRF)极简原理与超详细代码解析
条件随机场(CRF)极简原理与超详细代码解析 1. 原理 1.1 从名称说起 1.2 优化的目标 1.3 如何计算 2. 代码 2.1 基本结构 2.2 模型初始化 2.3 BERT提取的特征如何输入 ...
- bat脚本常用命令及亲测示例代码超详细讲解
这篇文章主要介绍了bat脚本常用命令及亲测示例代码超详细讲解,在这里需要注意编辑bat文件请使用ANSI编码,不然容易出现中文乱码,需要的朋友可以参考下 目录一 1.语句注释 2.暂停 3.输出和换行 ...
- 三、Hive数据仓库应用之Hive数据操作语言(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7)
Hive远程模式部署参考: 一.Hive数据仓库应用之Hive部署(超详细步骤指导操作,WIN10,VMware Workstation 15.5 PRO,CentOS-6.7) Hive数据定义语言 ...
- BF算法代码(超详细)
在此之前需要用到的知识: 头文件<string.h>中包含strlen()函数计算字符串的长度,遇到结束性标 志'\0'时停止: 例如,字符串为"lx adore zlr&quo ...
- 【预测模型】基于RLS算法求解数据预测matlab代码
1 简介 为了提高经济领域统计数据的预测精度,代数多项式预测模型的建模 方法应运而生.该方法使用代数多项式模型拟合给定的经济统计数据,并使用递推最小二乘法(RLS)对多项式拟合模型的加权系数进行递推计 ...
- HashMap底层红黑树原理(超详细图解)+手写红黑树代码
在看完了小刘老师和黑马的源码视频之后,我整理了一篇HashMap的底层源码文章,学海无涯,这几天看了对红黑树的讲解,故将其整理出来 HashMap底层源码解析上 HashMap底层源码解析下 视频链接 ...
- 以面向对象的思想实现数据表的添加和查询,JDBC代码超详细
以面向对象的思想编写JDBC程序,实现使用java程序向数据表中添加学生信息,并且可以实现给定×××号查询学生信息或给定准考证号查询学生信息. 创建的数据表如下: CREATE TABLE EXAMS ...
- DSFD-Dual Shot Face Detector人脸检测模型原理代码超全面解剖
DSFD为19年腾讯提出的,用于人脸检测的轻量级实时模型,全称为Dual Shot Face Detector.接下来会给出模型的大结构,然后针对模型的创新点结合代码进行重点分析. 首先论文的效果图如 ...
最新文章
- Leetcode 257. 二叉树的所有路径 解题思路及C++实现
- 【下拉刷新】WEUI下拉刷新
- 使用phpize安装php模块
- 共轭梯度法求解线性方程组
- Windows——Windows 10 加装 Windoes 7 制作双系统时,Windoes 7 启动卡在正在启动界面,并且重启无效解决方案
- 在springBoot中配置web.xml中配置的servlet
- java矩阵类_151-矩阵类
- OpenCV-均值滤波cv::blur
- c php curl post,php curl post
- OPENCV数据结构体系和常用函数
- 震惊!华为服务器操作系统竟然开源了!
- python turtle画小狗_python-turtle-画雪花
- MATLAB 自带RS编码函数中 gf 数据转化为 double 数组的方法
- 程序员能力的四个境界(转)
- 亲民地理-第39期-佛山(2)南风古灶_我是亲民_新浪博客
- c#日期转换英文月份
- 赶紧学会!开发者愚人节怎么写代码。。。
- do vis是什么意思_餐前酒和餐后酒有什么区别
- Unity自定义组件之序列帧播放组件
- Vue 表情输入组件,微信face表情组件