李航 统计学习方法 监督学习部分

本文深入探讨了监督学习的基本原理,包括统计学习、模型选择、正则化和泛化能力。介绍了感知机、k近邻法、朴素贝叶斯法等常见算法,以及它们在实际问题中的应用。同时,讨论了无监督学习的特性,如聚类和降维,并提及了半监督学习和主动学习的概念。通过对统计学习方法三要素的解析,展示了如何构建和评估学习模型。
摘要由CSDN通过智能技术生成

本篇记录监督学习部分蓝书主要内容

1 统计学习及监督学习概论

1.1 统计学习概述

0.先补充一些统计基础知识。
(1)随机事件:在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件。
特点为:可在相同条件下重复进行;每个试验可能结果不止一个(只有一个还用试验?),并且可以事先预测事件所有可能的结果;进行一次试验之前不能确定哪一个结果会出现(确定了还用试验?)。
而必然事件与不可能事件都为随机事件,(因为满足其三个特点)特殊情况。
(2)统计规律性:支配大量个别偶然事件的整体行为的规律性。而大数定律只是表示在期望方面的统计规律性,而不是全部。
随机现象的偶然性在于每次随机试验的结果都是偶然而未知的,必然性在于进行很多次试验过后,其结果的分布会呈现一种稳定的分布状态
机器学习就是基于这样的现象才能进行有效的学习和预测,我们假设同类数据具有一定的统计规律性,这样才能利用统计方法进行有效的学习。如果不同类数据之间的统计规律性区分不明显,也就是不同类数据(广义)之间差别不大,那么难以进行有效的学习和分类(一般为数据或任务本身的问题,而不是模型算法的问题)。
(3)与随机事件相反的为模糊事件,它虽然具有偶然性但不具有确定性,也就是即便经过大量的试验之后依然无法找到其一般的稳定分布状态,这样的事件我们是难以用机器学习方法(或者说是通常的统计方法)进行研究的。

本书有很强的统计思维,注意各种统计假设以及数学和实际应用之间的区别。
1.表格

主题内容
什么是统计学习使用计算机基于数据构建概率统计模型并运用模型对数据进行预测和分析的一门学科(核心是学习数据间的统计规律性
统计学习特点计算机(硬件)、数据(研究对象)、预测与分析(目的)、各种方法(软件)
什么是学习系统通过执行某个过程改进其性能
统计学习基本假设假设同类数据具有一定统计规律性

2.实现统计学习的步骤
(1)得到一个有限的训练数据集合(部分代表并估计总体)
(2)确定学习模型的集合,即假设空间。(这个看个人意愿)
(3)确定模型选择的准则,即学习的策略。(也就是说什么模型是优。此不同于RL中的策略,那里面的策略是指模型,注意这里的模型是包含具体的参数的,参数不同,则模型也不同,那么很可能假设空间是无限的)
(4)实现求解最优模型的算法,即学习的算法。(如何求最优)
(5)通过学习方法选择最优模型。(行动)
(6)利用学习的最优模型对新数据进行预测或分析
3. 统计学习研究领域
(1)方法:新的学习方法。(可以理解成模型、策略、算法的集合体)
(2)理论:探求方法的有效性和效率。(就是收敛性、收敛速度这一块)
(3)应用:解决实际问题。(应用机器学习)
4. 数据挖掘十大经典算法
C-4.5 、K-Means 、SVM 、Aprior 、EM 、PageRank 、AdaBoost 、KNN 、CART

1.2 统计学习的分类

基本分类(最常用)
1 监督学习
输入空间(所有可能取值集合)、输出空间、实例(每个输入)、特征向量(数学化表示实例)、特征空间(实际上为所有包含特征向量的集合,它实际上我们将模型定义在特征空间上的,即在特征空间而非输入空间上学习)、样本(输入-输出对)
回归(输出变量为连续)、分类(离散)、标注(输入输出均为有序序列)
联合概率分布P(X,Y)、假设空间(包含全体模型,条件概率分布形式或者决策函数形式,类似于RL中的确定性策略和非确定性策略,注意无监督学习不是这样的)
核心观点:
在监督学习中,假设训练数据与测试数据是依照某一固定的概率分布(不妨设为它们的联合概率分布P(X,Y))而独立同分布产生的
2 无监督学习
特点:数据无标注、学习预测模型
本质:学习数据中的统计规律或者潜在结构
聚类、降维、概率估计
而无监督学习出来的结果难以直接检验准确率。
3 强化学习
智能系统在与环境的连续互动中学习最优行为策略的机器学习问题。
具体略过。
4 半监督学习与主动学习
半监督:利用未标注数据的信息,辅助标注数据进行监督学习。
主动学习:机器不断有选择性地发出教师未标注数据进行标注,然后对之进行学习。

按模型分类
(1)概率模型(非确定) VS 非概率模型(确定):
概率模型输出概率分布,非概率模型输出确定的值或对象。
这二者之间的区别不在于输入-输出对的映射关系,而在于模型内在结构,概率模型一定可以表示为联合概率分布形式,而后者不一定(比如回归问题,积分积出来为0)
(2)线性模型 VS 非线性模型:
前者包含感知机、线性SVM、k近邻、潜在语义分析等
后者包含核函数SVM、AdaBoost、神经网络等
(3)参数化模型(参数维度有限) VS 非参数化模型 (参数维度无穷大)
(4)生成模型 VS 判别模型
简单来说,生成方法指先学习 P ( X , Y ) P(X,Y) P(X,Y)后估计 P ( Y ∣ X ) P(Y|X) P(YX)或者 f ( X ) f(X) f(X)的过程,学得模型称为生成模型。判别方法指直接学习后者而无中间过程。
各自适合不同场景的问题。

按算法分类(优化方式)
在线学习(每次进入一个样本) VS 批量学习(一堆一堆样本进入)
强化学习本身拥有在线学习的特点

按技巧分类
(1)贝叶斯学习
特点:使用模型的先验分布(技巧:区别于极大似然(频率学派),二者刚好相反。贝叶斯学习计算 P ( θ ∣ D ) P(\theta|D) P(θD),认为存在 P ( θ ) P(\theta) P(θ),而极大似然估计 P ( D ∣ θ ) P(D|\theta) P(Dθ)
更具体一点:
先验概率:预先给出的模型的概率 P ( θ ) P(\theta) P(θ)(贝叶斯方法计算过程中使用)
后验概率:给定数据条件下模型的概率 P ( θ ∣ D ) P(\theta|D) P(θD)(贝叶斯方法最终计算)
贝叶斯估计(贝叶斯学派): θ ^ = a r g   m a x θ   P ( θ ∣ D ) = a r g   m a x θ   P ( θ ) P ( D ∣ θ ) P ( D ) \hat{\theta}=arg\,\underset{\theta}{max}\,P(\theta|D)=arg\,\underset{\theta}{max}\,\frac{P(\theta)P(D|\theta)}{P(D)} θ^=argθmaxP(θD)=argθmaxP(D)P(θ)P(Dθ)
极大似然估计(频率学派):
θ ^ = a r g   m a x θ   P ( D ∣ θ ) \hat{\theta}=arg\,\underset{\theta}{max}\,P(D|\theta) θ^=argθmaxP(Dθ)
故而若 θ \theta θ均匀分布时,贝叶斯估计和极大似然估计等效。
(2)核方法
使用核函数表示和学习非线性模型的一种机器学习方法。(技巧:不显式地定义两个空间之间的映射关系,而是直接定义核函数)

1.3 统计学习方法三要素

方法=模型+策略+算法
(这三要素在不同的书中称谓不一样,但本质差不多)
1.模型(空间
F = { f ∣ Y = f ( X ) } \mathcal{F} =\left \{ f|Y=f(X)\right\} F={fY=f(X)}
F = { P ∣ P ( Y ∣ X ) } \mathcal{F}=\left \{P|P(Y|X)\right\} F={PP(YX)}
一般的我们带上参数就为
F = { f ∣ Y = f θ ( X ) ,    θ ∈ Θ } \mathcal{F} =\left \{ f|Y=f_{\theta}(X) ,\;\theta\in\Theta\right \} F={fY=fθ(X),θΘ}
F = { P ∣ P θ ( Y ∣ X ) ,    θ ∈ Θ } \mathcal{F}=\left \{P|P_{\theta}(Y|X),\;\theta\in\Theta\right\} F={PPθ(YX),θΘ}
其实就是假设空间的每个元素。
2.策略(优秀标准,也就是好的参数评判标准

总的说来,使用根本准则(期望风险最小化),并结合具体的损失函数的定义,导出相应的模型优秀标准。一般来说根本准则公式无法直接得到,所以就要用我们得到的各种函数在已有的数据集上进行估计。而后面的朴素贝叶斯估计部分所得到的后验概率最大化分类标准,主要适用于分类问题,它告诉我们假设使用0-1损失,在得到P(Y|X)的估计后,如何对X类别进行确定性判断才是合理的,而这个过程并不局限于朴素贝叶斯算法里面。

损失函数(0-1损失、平方损失、对数损失等)
定义期望风险(或期望损失):
R e x p ( f ) = ∫ X × Y L ( y , f ( x ) ) P ( x , y ) d x d y R_{exp}(f)=\int_{ \mathcal{X}\times \mathcal{Y} }^{}L(y,f(x))P(x,y)dxdy Rexp(f)=X×YL(y,f(x))P(x,y)dxdy
p ( y ∣ x ) p(y|x) p(yx)也可以替换上面 f ( x ) f(x) f(x).
学习框架书中如下式子(觉得有用):
E ( ξ ) = ∫ X × Y ξ E(\xi)=\int_{X\times{Y}}\xi E(ξ)=X×Yξ(其实广义的期望应该是勒贝格可积所建立的积分式)
∫ X × Y φ ( x , y ) d ρ = ∫ X ( ∫ Y φ ( x , y ) d ρ ( y ∣ x ) ) d ρ X \int_{X\times{Y}}\varphi(x,y)d\rho=\int_{X}(\int_{Y}\varphi(x,y)d\rho(y|x))d\rho_{X} X×Yφ(x,y)dρ=X(Yφ(x,y)dρ(yx))dρX
这是我们最终要优化的对象,如果我们直接以优化期望损失为依据,因真实值是我们不知道的,由此监督学习就成为一个病态问题,只能用样本得出的损失值来估计它。
然后定义经验风险(求平均)和结构风险(经验风险加上正则化项)以估计期望损失。
R e m p = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) R_{emp}=\frac{1}{N}\sum_{i=1}^{N}L(y_{i},f(x_{i})) Remp=N1i=1NL(yi,f(xi))
R s r m = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) + λ J ( f ) R_{srm}=\frac{1}{N}\sum_{i=1}^{N}L(y_{i},f(x_{i}))+\lambda J(f) Rsrm=N1i=1NL(yi,f(xi))+λJ(f)
注意这只是一种写法,像决策树的损失项(预测误差项)就不是像这样将每个样本得出一个损失值而后求算术平均的形式,而是根据特殊的结构灵活决定损失项的构造。同时结构风险损失函数在本质上是损失项和正则项的和。
3.算法(如何达到那么最优的模型)
此阶段对应问题即为最优化问题

注意当统计方法三要素确定以后,统计方法基本确定。

1.4 模型评估与模型选择

训练误差、验证误差、测试误差
训练集(训练模型)、验证集(通过对比决定模型超参数)、测试集(最终评比)
过拟合现象,不绝对,根据实际数据的复杂程度来看。由于训练数据本身存在噪声(注意这里的噪声应主要为实际采样过程中受外界影响从而采样数据不 那么准确),过于复杂的拟合模型往往泛化能力不好。

1.5 正则化和交叉验证

正则化加入正则化项,减少过拟合现象。
奥卡姆剃刀原则:假设多个假设和观测一致,则选择最简单那个(能简则简)。
交叉验证:(针对数据量不充分或者想要更大程度利用数据信息的情况,应对的是如何划分各类数据集的问题)
简单交叉、S折交叉(等分)、留一法(极端S折交叉)

1.6 泛化能力

1.用期望风险(期望损失)表示公式:
R e x p ( f ^ ) = E P [ L ( Y , f ^ ( X ) ) ] = ∫ X × Y L ( y , f ^ ( x ) ) P ( x , y ) d x d y R_{exp}(\hat{f})=E_{P}[L(Y,\hat{f}(X))]=\int_{\mathcal{X\times Y}}{}L(y,\hat{f}(x))P(x,y)dxdy Rexp(f^)=EP[L(Y,f^(X))]=X×YL(y,f^(x))P(x,y)dxdy
2. 这里给出一个泛化误差上界估计不等式,就是用来表现我们用经验风险 R e m p R_{emp} Remp来替代理论期望风险 R e x p R_{exp} Rexp时的差异大小(这个不等式使用范围狭窄,只适用于二分类,且假设空间有限情况,一般为确定性模型才是这样),描述如下:
设二分类问题,有限假设空间 F = { f 1 , f 2 , . . . f n } \mathcal{F}=\left \{f_{1},f_{2},...f_{n}\right\} F={f1,f2,...fn}, 则对 ∀   f ∈ F \forall\,f\in\mathcal{F} fF,至少以概率 1 − δ ,    0 < δ < 1 1-\delta,\;0<\delta<1 1δ,0<δ<1成立: R ( f ) ≤ R ^ ( f ) + ε ( n , N , δ ) , w h i c h      ε ( n , N , δ ) = 1 2 N ( l o g n + l o g 1 δ ) R(f)\le\hat{R}(f)+\varepsilon(n,N,\delta),which\;\;\varepsilon(n,N,\delta)=\sqrt{\frac{1}{2N}(logn+log\frac{1}{\delta})} R(f)R^(f)+ε(n,N,δ),whichε(n,N,δ)=2N1(logn+logδ1)
这里面 N N N表示样本数,使用的是经验风险式(直接平均)来估计。
证明过程使用Hoeffding不等式,过程很简单,这个例子说明理论上的泛化误差上界在一些简单情况下可以做粗略的估计,但还需深入,这里面式子说明当概率越大(也就是理论上结论更可靠的时候),泛化误差上界会不断增大并趋于无穷,可以人为地设置最低概率。当然,不等式还表明抽取的样本越多,或者假设空间越大, ε \varepsilon ε 越大。

1.7 监督学习应用

二分类问题评价模型预测指标(正负为类别而非正误)
TP(真实正->预测正) FN(正->负)
FP(真实负->预测正) FN(负->负)
精确率 P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP 表示预测为正类的准确率
召回率 R = T P T P + F N R=\frac{TP}{TP+FN} R=TP+FNTP表示将正类判错比例
这里面没有涉及到FN
此外有 F 1 = 2 1 P + 1 R F_{1}=\frac{2}{\frac{1}{P}+\frac{1}{R}} F1=P1+R12 P P P R R R都高时, F 1 F_{1} F1值也高。

2 感知机

感知机为二分类的线性分类器,输出取 { + 1 , − 1 } \left\{+1,-1\right\} {+1,1}

2.1 感知机模型(空间)

感知机模型:
X ⊆ R n , Y = { + 1 , − 1 } \mathcal{X}\subseteq R^{n},\mathcal{Y}=\left\{+1,-1\right\} XRn,Y={+1,1}
f ( x ) = s i g n ( ω ⋅ x + b ) ,      ω ∈ R n ,   b ∈ R f(x)=sign(\omega\cdot x+b),\;\;\omega\in R^{n},\,b\in R f(x)=sign(ωx+b),ωRn,bR
感知机模型假设空间:(我觉得这样更好一点,才能和前面概念统一起来)
{ s i g n ( f ) ∣ f ( x ) = ω ⋅ x + b ,      ω ∈ R n ,   b ∈ R } \left\{sign(f)|f(x)=\omega\cdot x+b,\;\;\omega\in R^{n},\,b\in R\right\} {sign(f)f(x)=ωx+b,ωRn,bR}
每一个 ( ω , b ) (\omega,b) (ω,b)唯一决定一个模型。

2.2 感知机学习策略(何为优)

1.定义数据集线性可分性
2.给定数据集,定义损失函数(经验风险函数)为
L ( ω , b ) = − ∑ x i ∈ M y i ( ω ⋅ x i + b ) = ∑ x i ∈ M ∣ ω ⋅ x i + b ∣ L(\omega,b)=-\sum_{x_{i}\in M}{}y_{i}(\omega\cdot x_{i}+b)=\sum_{x_{i}\in M}|\omega \cdot x_{i}+b| L(ω,b)=xiMyi(ωxi+b)=xiMωxi+b
M M M为误分点集。给定训练集 T T T,损失函数为连续可导函数(正确分类为0,而且因为距离的性质,以及样本点有限)。

2.3 感知机学习算法(如何优化)

1.随机梯度下降,在线学习。
step1:初始化 ω 和 b \omega和b ωb
step2:取出 ( x i , y i ) (x_{i},y_{i}) (xi,yi),如果误分,即 y i ( ω ⋅ x i + b ) ≤ 0    t h e n y_{i}(\omega \cdot x_{i}+b)\le0 \; then yi(ωxi+b)0then
ω = ω + η y i x i ,    b = b + η y i \omega=\omega+\eta y_{i}x_{i},\;b=b+\eta y_{i} ω=ω+ηyixi,b=b+ηyi
注意这个等于0的条件,如果没有等于0,如果我们赋参数初值均为0时算法无法优化。
step3:转至step2,直到没有误分点。

2.查看算法收敛性
(Novikoff)设数据集 T T T(有 N N N个样本)为线性可分,其它和前面一致,则
(1)存在单位超平面将数据集完全分开,且存在 γ > 0 \gamma>0 γ>0,对所有样本均有 y i ( ω o p t ^ ⋅ x i ^ ) = y i ( ω o p t ⋅ x i + b o p t ) ≥ γ y_{i}(\hat{\omega_{opt}}\cdot \hat{x_{i}})=y_{i}(\omega_{opt}\cdot x_{i}+b_{opt})\ge\gamma yi(ωopt^xi^)=yi(ωoptxi+bopt)γ
(2)令 R = m a x 1 ≤ i ≤ N ∣ ∣ x i ^ ∣ ∣ R=\underset{1\le i\le N}{max}||\hat{x_{i}}|| R=1iNmaxxi^,则感知机算法在训练集上的误分类次数 k k k满足
k ≤ ( R γ ) 2 k\le(\frac{R}{\gamma})^{2} k(γR)2
误分类次数 k k k是有限的,经过有限次搜索可以找到将所有数据完全正确分类的超平面。
当训练数据集线性可分时,感知机学习算法存在无穷多个解,其解由于不同初值或不同迭代顺序而可能有所不同。

3.感知机算法的对偶形式
对偶形式是在其基本形式上做一些关于 ( x i , y i ) (x_{i},y_{i}) (xi,yi)的累加调整。令 ω = ∑ i = 1 N α i y i x i \omega=\sum_{i=1}^{N}\alpha_{i}y_{i}x_{i} ω=i=1Nαiyixi
b = ∑ i = 1 N α i y i b=\sum_{i=1}^{N}\alpha_{i}y_{i} b=i=1Nαiyi
改进算法:
step1: α = 0 ,    b = 0 \alpha=0,\;b=0 α=0,b=0
step2:选取样本,若 y i ( ∑ j = 1 N α j y j x j ⋅ x i + b ) ≤ 0 : y_{i}(\sum_{j=1}^{N}\alpha_{j}y_{j}x_{j}\cdot x_{i}+b)\le 0: yi(j=1Nαjyjxjxi+b)0:
α i = α i + η ,    b = b + η y i \alpha_{i}=\alpha_{i}+\eta,\;b=b+\eta y_{i} αi=αi+η,b=b+ηyi
如此可以使用Gram矩阵以便于存储。

2.4 代码实践

尝试一次试验,发现诸多问题,首先是之前花大量时间学pandas其实都忘完了,说明学习代码(不管是C++,Java,还是Python都要勤于动手多总结多记笔记,不然空耗时间也一无所获),其次要学会和熟练代码调试
这次试验我用+1代表 y = e x y=e^{x} y=ex 函数,用-1代表 y = s i n ( x ) y=sin(x) y=sin(x) 函数,并加入随机噪声 r a n d o m . r a n d o m ( ) random.random() random.random(),故而每次运行得到的数据集都不一样,初始化 w , b w,b w,b均为0,学习率设为0.01,经过不同的迭代次数可以达到完全线性可分,后续还可以继续改进。
本次试验代码如下

import math
import numpy as np
import matplotlib.pyplot as plt
import random
import pandas as pd

# 生成数据
w=[0,0]
b=0
lr=0.01
x=list(np.arange(0,1,0.01))
N=len(x)
pos_y=[math.exp(x)+random.random() for x in list(x)]
pos=pd.DataFrame(np.array([[x[i],pos_y[i],1]for i in range(N)]))
neg_y=[math.sin(x)+random.random() for x in list(x)]
neg=pd.DataFrame(np.array([[x[i],neg_y[i],-1]for i in range(N)]))
data=pd.concat((pos,neg),0)  # 纵向合并
data=data.reset_index(drop=True)  # 删除原来索引,在现有基础上重排
plt.plot(pos.iloc[:,0],pos.iloc[:,1],label='正',color='blue')
plt.plot(neg.iloc[:,0],neg.iloc[:,1],label='负',color='yellow')
# 设置感知机
stop=False
for iter in range(200):
    print('b:',b,'w:',w)
    print('iter:',iter)
    if stop==False:
        for i in range(len(data[0][:])):
           if (data[0][i]*w[0]+data[1][i]*w[1]+b)*data[2][i]<=0:
               b+=lr*data[2][i]
               w+=lr*data[2][i]*np.array(data.iloc[i,0:2])
               break
           elif i==len(data[0][:])-1:
               stop=True
    else:
        break
pred_y=[-(w[0]*xx+b)/w[1] for xx in x]
plt.plot(x,pred_y,color='green')
plt.show()

在这里插入图片描述
在这里插入图片描述

3 k近邻法(k-NN)

k k k近邻法不具有显式的学习过程。

3.1 k近邻算法

step1: 在训练集中找出与 x x x最近的 k k k个点,记为 N k ( x ) N_{k}(x) Nk(x)
step2: 根据投票法得出预测类别(哪个类别最多就取这个类别): y = a r g    m a x c j    ∑ x i ∈ N k ( x ) I ( y i = c j ) y=arg\;\underset{c_{j}}{max}\;\sum_{x_{i}\in N_{k}(x)}^{}I(y_{i}=c_{j}) y=argcjmaxxiNk(x)I(yi=cj)

3.2 k近邻模型

1.当特征空间为 R n R^{n} Rn的子集时,一般取 L p 距 离 : L_{p}距离: Lp
L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ p ) 1 p L_{p}(x_{i},x_{j})=(\sum_{l=1}^{n}|x_{i}^{(l)} -x_{j}^{(l)}|^{p})^{\frac{1}{p}} Lp(xi,xj)=(l=1nxi(l)xj(l)p)p1
一般取 L 2 L_{2} L2
2.在应用中一般取一个较小的 k k k(太小会只关注附近几个点,增大估计误差,易受噪音影响和发生过拟合,整体模型复杂;太大则忽略了很多距离信息,减小估计误差,增大近似误差,使整体模型过于简单),通常通过交叉验证来寻找最优 k k k值。
注意此中概念:
估计误差:可以理解为对测试集的测试误差(表现泛化能力)。
近似误差:可以理解为对现有训练集的训练误差(表现拟合效果)。
3.分类决策规则
使用的是多数表决规则,且在决定 c j c_{j} cj时使用多数表决规则( m a x    ∑ x i ∈ N k ( x ) I ( y i = c j ) max\;\sum_{x_{i}\in N_{k}(x)}I(y_{i}=c_{j}) maxxiNk(x)I(yi=cj))等价于使误分类率最小(经验风险最小化):
m i n      1 − 1 k ∑ x i ∈ N k ( x ) I ( y i = c j ) min\;\;1-\frac{1}{k}\sum_{x_{i}\in N_{k}(x)}{}I(y_{i}=c_{j}) min1k1xiNk(x)I(yi=cj)

3.3 k近邻法的实现:kd树(k-dimensional tree)

蓝书上写的有点笼统不清楚,kd树为对k维空间中实例点进行存储和以便对其进行快速检索的树形数据结构。
下面这一篇讲的很详细,但有些步骤小地方还可以改进:
查看kd树具体过程
我尝试写一下步骤吧:
kd树的构造(kd平衡树)
step1 (初始切分): 选取 x ( 1 ) x^{(1)} x(1)为坐标轴,以训练集中所有数据 x ( 1 ) x^{(1)} x(1)坐标的中位数作为切分点(若为双数数目则取后面那个,其实都一样看喜好),将矩形切分为两个子区域。
step2 (继续切分): 对深度为 j j j 的结点,选择 x ( l ) x^{(l)} x(l)为切分点, l = j ( m o d    k ) + 1 l=j(mod\;k)+1 l=j(modk)+1(也就是每类坐标按深度增加进行轮换),继续以该结点区域中训练数据的 x ( l ) x^{(l)} x(l)坐标的中位数作为切分点,将该区域划分为两个子区域,且生成深度为 j + 1 j+1 j+1的左、右子结点。左结点对应的 x ( l ) x^{(l)} x(l)坐标小于切分点对应坐标,右侧大于。不断地重复step2,直至两个子区域没有数据或者只有一个实例为止。

kd树k最近邻搜索
寻找点 p p p k k k最近邻,记为 S S S
step1:由 p p p的坐标从根结点向下搜索直至叶子结点(小则左,否则右)。
step2: 若当前结点不是根结点,则继续(1),否则退出。
(1) 回退到父节点,记为当前结点,若当前节点已经被访问过,则继续(1),若不然,则执行(2-3)。
(2) 若此时 S S S未满,则直接添加当前结点,否则判断其与 p p p的距离再看是否添加。
(3) 如果当前结点没有另一个子结点,则返回step2。不然的话计算 p p p点和当前结点切分线(与坐标轴平行)的距离,若距离大于等于 S S S中距离 p p p的最远距离且 S S S中已满或者当前结点没有,则返回step2,否则从当前结点的另一个子结点开始执行step1。

总的来说,为以下几步:
1、找到叶子结点,看能不能加入到 S S S
2、回退到父结点,看父结点能不能加入到 S S S
3、看目标点和回退到的父结点切分线的距离,判断另一子结点能不能加入到 S S S中。

k d kd kd树更适用于训练实例数远大于空间维数时的 k k k近邻搜索。

因为树形结构编程相对我现在水平还太过复杂,所以先跳过编程这一块,主要是怎么较好地表示树形结构数据,还有待于看了数据结构以后再来,深刻感觉我的水平太菜

3.4 试验代码(MNIST)

使用MNIST数据集做预测,直接将其每张图片展开为 1 × 784 1\times784 1×784的特征向量,再调包进行KNN分类,60000(训练)+10000(预测)一共大概20分钟左右,时间复杂度有点高,最后精确度达到96.65%,代码如下。
其中我将MNIST数据集放到F盘机器学习数据集中,下面代码导入的mnist.py在其中。

import os,sys,mnist
from mnist import load_mnist
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier  # 调包

sys.path.append(os.pardir)
(x_train,t_train),(x_test,t_test)=load_mnist(flatten=True,normalize=False)
print(x_train.shape,x_test.shape,t_train.shape)

knn=KNeighborsClassifier(n_neighbors=10) # 数据量较大,适当放大K值
knn.fit(x_train,t_train)

y_predict=knn.predict(x_test)
accurate=(t_test==y_predict).mean()
print(accurate)

4 朴素贝叶斯法

4.1 朴素贝叶斯算法

朴素贝叶斯法建立的模型属于生成模型,其方法为生成方法。假设从分布为 P ( X , Y ) P(X,Y) P(X,Y)的数据中 i . i . d i.i.d i.i.d获取样本集,而后先学习 P ( X , Y ) P(X,Y) P(X,Y),再在此基础上估计 P ( Y ∣ X ) P(Y|X) P(YX).
注意其 X ⊂ R n , Y = { c 1 , c 2 , . . . c K } \mathcal{X}\subset{R^{n}},\mathcal{Y}=\left\{c_{1},c_{2},...c_{K}\right\} XRn,Y={c1,c2,...cK},也就是从无限空间映射到有限空间。
1.朴素贝叶斯算法(学习与分类):
(1)估计先验概率及条件概率(下面使用极大似然估计)(学习
P ( Y = c k ) = ∑ i = 1 N I ( y i = c k ) N ,      k = 1 , 2 , . . . , K P(Y=c_{k})=\frac{\sum_{i=1}^{N}I(y_{i}=c_{k})}{N},\;\;k=1,2,...,K P(Y=ck)=Ni=1NI(yi=ck),k=1,2,...,K
P ( X ( j ) = a j l ∣ Y = c k ) = ∑ i = 1 N I ( x i ( j ) = a j l , y i = c k ) ∑ i = 1 N I ( y i = c k )      j = 1 , 2 , . . . , n ;    l = 1 , 2 , . . . , S j    ; k = 1 , 2 , . . . K P(X^{(j)}=a_{jl}|Y=c_{k})=\frac{\sum_{i=1}^{N}I(x_{i}^{(j)}=a_{jl},y_{i}=c_{k})}{\sum_{i=1}^{N}I(y_{i}=c_{k})}\;\;j=1,2,...,n;\;l=1,2,...,S_{j}\;;k=1,2,...K P(X(j)=ajlY=ck)=i=1NI(yi=ck)i=1NI(xi(j)=ajl,yi=ck)j=1,2,...,n;l=1,2,...,Sj;k=1,2,...K
其中 K K K表示公有类别数, j j j表输入随机变量第 j j j个特征, S j S_{j} Sj表示特征空间每个特征的取值数目。

注意概率估计也可使用贝叶斯估计(使用上面估计式可能造成估计值为0的情况,从而影响到后验概率的计算结果,使分类产生偏差,故加上一个修正量)是在 P ( Y = c k ) P(Y=c_{k}) P(Y=ck)估计式的分子分母分别加上 λ \lambda λ K λ K\lambda Kλ,在 P ( X ( j ) = a j l ∣ Y = c k ) P(X^{(j)}=a_{jl}|Y=c_{k}) P(X(j)=ajlY=ck)估算式中分子分母分别加上 λ \lambda λ S j λ S_{j}\lambda Sjλ,其确实为一种概率分布(和为1),这里面 λ ≥ 0 \lambda\ge 0 λ0,故而极大似然估计为贝叶斯估计的特殊情况( λ = 0 \lambda=0 λ=0), λ = 1 \lambda=1 λ=1时为 L a p l a c e Laplace Laplace平滑。

极大似然估计或者贝叶斯估计只是朴素贝叶斯算法中的一步而已。
(2)对于给定实例 x = ( x ( 1 ) , x ( 2 ) , . . . , x ( n ) ) x=(x^{(1)},x^{(2)},...,x^{(n)}) x=(x(1),x(2),...,x(n)),计算
P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) ,      k = 1 , 2 , . . . , K P(Y=c_{k})\prod_{j=1}^{n}P(X^{(j)}=x^{(j)}|Y=c_{k}),\;\;k=1,2,...,K P(Y=ck)j=1nP(X(j)=x(j)Y=ck),k=1,2,...,K
(3)确定实例 x x x的类别(分类)
y = a r g    m a x c k    P ( Y = c k ) ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) y=arg\;\underset{c_{k}}{max}\;P(Y=c_{k})\prod_{j=1}^{n}P(X^{(j)}=x^{(j)}|Y=c_{k}) y=argckmaxP(Y=ck)j=1nP(X(j)=x(j)Y=ck)

2.现叙述朴素贝叶斯算法如何来的:
(1)为什么要计算先验概率 P ( Y ) P(Y) P(Y)和条件概率 P ( X ∣ Y ) P(X|Y) P(XY)
我们要得到最优的 P ( Y ∣ X ) P(Y|X) P(YX)模型,现使用贝叶斯概率公式
P ( Y ∣ X ) = P ( X , Y ) P ( X ) = P ( Y ) P ( X ∣ Y ) ∑ P ( Y ) P ( X ∣ Y ) P(Y|X)=\frac{P(X,Y)}{P(X)}=\frac{P(Y)P(X|Y)}{\sum P(Y)P(X|Y)} P(YX)=P(X)P(X,Y)=P(Y)P(XY)P(Y)P(XY)
(2)为什么对条件概率分布 P ( X ∣ Y ) P(X|Y) P(XY)作了条件独立性假设(朴素的由来 )?
若直接算
P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , X ( 2 ) = x ( 2 ) , . . . X ( n ) = x ( n ) ∣ Y = c k ) P(X=x|Y=c_{k})=P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...X^{(n)}=x^{(n)}|Y=c_{k}) P(X=xY=ck)=P(X(1)=x(1),X(2)=x(2),...X(n)=x(n)Y=ck)
则一共有 K ∏ j = 1 n S j K\prod_{j=1}^{n} S_{j} Kj=1nSj个参数,这是指数倍计算量太大,在实际中做出估计不可行。而做出独立性假设
P ( X = x ∣ Y = c k ) = ∏ j = 1 n P ( X ( j ) = x ( j ) ∣ Y = c k ) P(X=x|Y=c_{k})=\prod_{j=1}^{n}P(X^{(j)}=x^{(j)}|Y=c_{k}) P(X=xY=ck)=j=1nP(X(j)=x(j)Y=ck)后,参数量大减为 K ∑ j = 1 n S j K\sum_{j=1}^{n}S_{j} Kj=1nSj,这样就可以做出较好的估计。
(3)极大似然估计式是如何得到的?
我们记 P ( Y = c k ) P(Y=c_{k}) P(Y=ck) p k p_{k} pk,记 ∑ i = 1 N I ( y i = c k ) \sum_{i=1}^{N}I(y_{i}=c_{k}) i=1NI(yi=ck) n k n_{k} nk,现将之作为未知参数进行估计,由于假设数据采样的 i . i . d i.i.d i.i.d条件,故
a r g   m a x p k    P ( D ∣ p k ) = p k n k ( 1 − p k N − n k ) arg\,\underset{p_{k}}{max}\;P(D|p_{k})=p_{k}^{n_{k}}(1-p_{k}^{N-n_{k}}) argpkmaxP(Dpk)=pknk(1pkNnk)
∂   l o g ( P ( D ∣ p k ) ) ∂   p k = n k p k − N − n k 1 − p k = 0 \frac{\partial \,log(P(D|p_{k}))}{\partial\,p_{k}}=\frac{n_{k}}{p_{k}}-\frac{N-n_{k}}{1-p_{k}}=0 pklog(P(Dpk))=pknk1pkNnk=0
即得 p k = n k N p_{k}=\frac{n_{k}}{N} pk=Nnk
另一个估计是一样的,就是加了条件而已。
(4)为什么要使用后验概率最大化分类准则
注意这是在算出 P ( Y ∣ X ) P(Y|X) P(YX)后,查看用其进行最大分类准则和前面规定的期望风险最小化准则的一致性。
其实最终得到的是一个分类器(确定性) f ( x ) f(x) f(x).
期望风险最小化准则(根本准则):
a r g   m i n f    E P ( X , Y ) [ L ( f ( X ) , Y ) ] arg\,\underset{f}{min}\;E_{P(X,Y)}[L(f(X),Y)] argfminEP(X,Y)[L(f(X),Y)]
= a r g   m i n f    ∫ X ∈ X ∫ Y ∈ Y L ( f ( X ) , Y ) P ( X , Y ) d y d x =arg\,\underset{f}{min}\;\int_{X\in \mathcal{X}}\int_{Y\in\mathcal{Y}}L(f(X),Y)P(X,Y)dydx =argfminXXYYL(f(X),Y)P(X,Y)dydx
= a r g   m i n f    ∫ X ∈ X ( ∫ Y ∈ Y L ( f ( X = x ) , Y ) P ( X = x , Y ) d ( y ∣ x ) ) d x =arg\,\underset{f}{min}\;\int_{X\in \mathcal{X}}(\int_{Y\in\mathcal{Y}}L(f(X=x),Y)P(X=x,Y)d(y|x))dx =argfminXX(YYL(f(X=x),Y)P(X=x,Y)d(yx))dx
= a r g   m i n f E X [ ∑ k = 1 K [ L ( c k , f ( X ) ) ] P ( c k ∣ X ) ] =arg\,\underset{f}{min}E_{X}[\sum_{k=1}^{K}[L(c_{k},f(X))]P(c_{k}|X)] =argfminEX[k=1K[L(ck,f(X))]P(ckX)]
等价于对每个 x x x分别极小化:
f ( x ) = a r g   m i n y ∈ Y    ∑ k = 1 K L ( c k , y ) P ( c k ∣ X = x ) f(x)=arg\,\underset{y\in\mathcal{Y}}{min}\;\sum_{k=1}^{K} L(c_{k},y)P(c_{k}|X=x) f(x)=argyYmink=1KL(ck,y)P(ckX=x)
采用0-1损失就有
= a r g   m i n y ∈ Y    ∑ k = 1 K P ( y ≠ c k ∣ X = x ) =arg\,\underset{y\in\mathcal{Y}}{min}\;\sum_{k=1}^{K} P(y\ne c_{k}|X=x) =argyYmink=1KP(y=ckX=x)
= a r g   m i n y ∈ Y ∑ k = 1 K ( 1 − P ( y = c k ∣ X = x ) ) =arg\,\underset{y\in\mathcal{Y}}{min}\sum_{k=1}^{K}(1-P(y=c_{k}|X=x)) =argyYmink=1K(1P(y=ckX=x))
= a r g   m a x c k    P ( c k ∣ X = x ) =arg\,\underset{c_{k}}{max}\;P(c_{k}|X=x) =argckmaxP(ckX=x)
注意这里的 Y = { c 1 , c 2 , . . . , c K } \mathcal{Y}=\left\{c_{1},c_{2},...,c_{K}\right\} Y={c1,c2,...,cK}表类别空间。
由此,即从最小期望风险准则导出选择后验概率最大的类别这一做法的合理性
3. 现在来看朴素贝叶斯法的模型、策略和算法,我理解的如此,不知是否合理。
模型:估计 P ( Y ) P(Y) P(Y) P ( X ∣ Y ) P(X|Y) P(XY),再用它们通过贝叶斯概率公式和独立性假设估计 P ( X , Y ) P(X,Y) P(X,Y) P ( Y ∣ X ) P(Y|X) P(YX),相当于用估计来做估计,假设空间中的模型可以理解为 P ( Y ) P(Y) P(Y) P ( X ∣ Y ) P(X|Y) P(XY)的参数池经过后面的变换过程,再使用后验概率最大化准则选择对应分类,注意这个准则不应该视为策略的一部分,因为这一选择过程中不存在新参数,而且也不是仅适用于贝叶斯算法,这是通用的法则。
策略:定义0-1损失的情况下,如何使 P ( Y ) P(Y) P(Y) P ( X ∣ Y ) P(X|Y) P(XY)估计得更准确,采用的标准是 a r g    m a x θ    P ( θ ∣ D ) arg \;\underset{\theta}{max}\;P(\theta|D) argθmaxP(θD),其实逻辑上说的通,但没有严格的数学证明(比如说明为什么经验风险最小化或者什么准则能导出这个极大似然标准,还要看后面学习过程)。
算法:极大似然估计的具体求解过程等等,也就是最优化的过程。

4.2 试验代码

1.使用sklearn自带的鸢尾花数据集
导入数据集并处理,数据包含三种鸢尾花的四个特征(花萼长和宽、花瓣长和宽)。

# 导入数据集并处理
import sklearn.datasets as datasets
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
X = iris['data']
y = iris['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 训练集和测试集划分
# 查看数据分布特征
plt.hist(X[:,0], bins=20)  # bins指定显示多少竖条
plt.hist(X[:,1], bins=20)
plt.hist(X[:,2], bins=20)
plt.hist(X[:,3], bins=20)
plt.show()

四个特征的直方图显示如下,可以看出同一类别同一特征数据大致呈现正态分布。
在这里插入图片描述
现使用朴素贝叶斯分类器。
(1)高斯分布朴素贝叶斯
数据分布满足高斯分布(正态分布)
P ( x i ∣ y ) = 1 2 π σ y 2 e x p ( − ( x i − μ y ) 2 2 σ y 2 ) P(x_{i}|y)=\frac{1}{\sqrt{2\pi\sigma_{y}^{2}}}exp(-\frac{(x_{i}-\mu_{y})^{2}}{2\sigma_{y}^{2}}) P(xiy)=2πσy2 1exp(2σy2(xiμy)2)
此式中 x i x_{i} xi表示第 i i i个特征维的取值。

# 导入包,后续进行训练、测试,输出分类正确率
from sklearn.naive_bayes import GaussianNB

gNB = GaussianNB()
gNB.fit(X_train, y_train)  # 训练模型
accuracy=gNB.score(X_test, y_test)  # 测试
print(accuracy)

精度不断变化,基本上都可在95%以上,训练集数目较少仍影响不大,应该是这样的数据太规范了吧。
(2)多项式分布朴素贝叶斯(前面极大似然估计)
θ ^ y i = N y i + α N y + α n \hat{\theta}_{y_{i}}=\frac{N_{y_{i}}+\alpha}{N_{y}+\alpha n} θ^yi=Ny+αnNyi+α

from sklearn.naive_bayes import MultinomialNB

mNB = MultinomialNB()
mNB.fit(X_train, y_train)  # 训练模型
accuracy=mNB.score(X_test, y_test)  # 测试
y_pred=mNB.predict(X_test)
# print(y_pred==y_test)
print(accuracy)

精度变化很大,在50%到95%之间浮动,这种方法在这个问题上还有待改进。
2.对MNIST分类(使用多项式朴素贝叶斯)

from sklearn.naive_bayes import MultinomialNB

mNB = MultinomialNB()
mNB.fit(x_train, t_train)
accuracy=mNB.score(x_test, t_test)
print(accuracy)

准确率:83.65%,且不会变化,速度几秒钟,虽然精度不如KNN,但速度很快。

5 决策树

5.1 决策树方法叙述

模型:分类决策树模型是一种描述对实例进行分类的树形结构,包括内部结点(表示特征或属性)和叶子结点
既可以将决策树表示成 if-then 规则集合(满足互斥并完备条件),也可以表示给定特征条件下类的条件概率分布(使用不同方式划分特征空间)。
以上两种表示完成后,决策树在做分类时将类别判给这一区域样本集中类别最多的类。
如果我们用条件概率分布的方式来观察,则假设空间应为所有划分特征空间的方式(或者加上一些限制),而这样的划分方式通常有无限多种(当然如果所有特征取值有限则可能有限)。
策略:我们一般将损失函数定为正则化的极大似然函数,策略是以损失函数(结构风险)最小化。
算法:在寻优过程中,我们难以穷尽搜索(NP完),通常采用启发式方法近似寻优。我们通常递归地选择最优特征,并根据此特征对训练数据进行分割,使得对各个子数据集有一个最好的分类过程,直至得到尽可能好的结果。
而后为了减缓过拟合,对构造的决策树剪枝,减少其复杂度。
可以看出决策树的算法部分包含特征选择决策树的生成(可以理解成在确定好特征选择准则后,用其不断地递归生成子树的过程),剪枝过程。其中特征选择考虑局部最优(在生成过程中,只考虑此步,不考虑过拟合问题),剪枝考虑全局最优(考虑整体模型好坏)。

5.2 算法第一步:确定特征选择准则(ID3,C4.5)

1.补充信息论知识
(1)信息熵
表示随机变量的不确定性,设 X X X为一个取有限个值的离散随机变量,其概率分布为
P ( X = x i ) = p i ,      i = 1 , 2 , . . . , n P(X=x_{i})=p_{i},\;\;i=1,2,...,n P(X=xi)=pi,i=1,2,...,n
定义其熵为 H ( X ) = − ∑ i = 1 n p i   l o g p i H(X)=-\sum_{i=1}^{n}p_{i}\,logp_{i} H(X)=i=1npilogpi
这里底数一般取2,当然取其它也可以,取 r r r时称为 r r r进制熵,转换公式为
H r ( x ) = H ( x ) l o g ( r ) H_{r}(x)=\frac{H(x)}{log(r)} Hr(x)=log(r)H(x)
数据集的熵可以理解为在数据集中随机抽取所得值对应的随机变量的熵,其衡量数据集数据分布的不确定程度。
随机变量的熵越大时数据不确定性越大

H ( p ) H(p) H(p)是有界的, 0 ≤ H ( p ) ≤ l o g ( n ) 0\le H(p)\le log(n) 0H(p)log(n),这是因为 y = l o g ( x ) y=log(x) y=log(x)为凹,故
∑ i = 1 n p i l o g ( 1 p i ) ≤ l o g ( ∑ i = 1 n p i ⋅ 1 p i ) \sum_{i=1}^{n}p_{i}log(\frac{1}{p_{i}})\le log(\sum_{i=1}^{n}p_{i}\cdot\frac{1}{p_{}i}) i=1npilog(pi1)log(i=1npipi1)

(2)条件熵
定义为 X X X给定条件下 Y Y Y的条件概率分布的熵对 X X X的数学期望:
H ( Y ∣ X ) = ∑ i = 1 n P ( X = x i ) H ( Y ∣ X = x i ) ,      i = 1 , 2 , . . . , n H(Y|X)=\sum_{i=1}^{n}P(X=x_{i})H(Y|X=x_{i}),\;\;i=1,2,...,n H(YX)=i=1nP(X=xi)H(YX=xi),i=1,2,...,n

从另一角度,由于 X X X Y Y Y为随机变量,故 Z = ( X , Y ) Z=(X,Y) Z=(X,Y)也为随机变量,进而
H ( Y ∣ X ) = H ( X , Y ) − H ( X ) H(Y|X)=H(X,Y)-H(X) H(YX)=H(X,Y)H(X)直接用定义证明即可。

(3)相对熵(KL散度)
定义为两个分布的信息熵的差值
K L ( P ∣ ∣ Q ) = H ( Q ) − H ( P ) = ∑ x ∈ X P ( x )   l o g P ( x ) Q ( x ) KL(P||Q)=H(Q)-H(P)=\sum_{x\in\mathcal{X}}P(x)\,log\frac{P(x)}{Q(x)} KL(PQ)=H(Q)H(P)=xXP(x)logQ(x)P(x)
也可写成积分形式。
(4)互信息
定义为联合分布和独立分布的相对熵
I ( X , Y ) = K L ( P ( X , Y ) ∣ ∣ P ( X ) P ( Y ) ) I(X,Y)=KL(P(X,Y)||P(X)P(Y)) I(X,Y)=KL(P(X,Y)P(X)P(Y))
I ( X , Y ) = ∑ y ∈ Y ∑ x ∈ X p ( x , y ) l o g ( p ( x , y ) p ( x ) p ( y ) ) I(X,Y)=\sum_{y\in\mathcal{Y}}\sum_{x\in\mathcal{X}}p(x,y)log(\frac{p(x,y)}{p(x)p(y)}) I(X,Y)=yYxXp(x,y)log(p(x)p(y)p(x,y))
如果是连续随机变量,则将加号替换为积分。

可以从定义推出:
I ( X , Y ) = H ( Y ) − H ( Y ∣ X ) I(X,Y)=H(Y)-H(Y|X) I(X,Y)=H(Y)H(YX) H ( Y ∣ X ) = H ( Y ) − I ( X , Y ) H(Y|X)=H(Y)-I(X,Y) H(YX)=H(Y)I(X,Y) H ( X ∣ Y ) = H ( X ) − I ( X , Y ) H(X|Y)=H(X)-I(X,Y) H(XY)=H(X)I(X,Y) 由前面推论有:
I ( X , Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I(X,Y)=H(X)+H(Y)-H(X,Y) I(X,Y)=H(X)+H(Y)H(X,Y)
我们可以得出 H ( X ∣ Y ) ≤ H ( X ) ,    H ( Y ∣ X ) ≤ H ( Y ) H(X|Y)\le H(X),\;H(Y|X)\le H(Y) H(XY)H(X),H(YX)H(Y),也就是对于一个与 X X X随机变量 Y Y Y,如果我们得知了关于 Y Y Y的一些信息,那么 X X X的不确定就会减小或不变

2.在定义好各种信息论概念后,我们看具体如何选择。
实际中,我们需要估计各种概率参数(一般用极大似然估计),称此时得到的熵和条件熵为经验熵经验条件熵
(1) 信息增益准则
特征 A A A对训练数据集 D D D的信息增益定义为(经验熵-经验条件熵)
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)
信息增益越大的特征对数据集分类的能力越强,故我们对训练数据集或子集计算每个特征的信息增益并选取值最大的特征。
(2)确定 H ( D ) H(D) H(D) H ( D ∣ A ) H(D|A) H(DA)的估算方式(经验熵、经验条件熵)
在这里插入图片描述

H ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣   l o g 2   ∣ C k ∣ ∣ D ∣ H(D)=-\sum_{k=1}^{K}\frac{|C_{k}|}{|D|}\,log_{2}\,\frac{|C_{k}|}{|D|} H(D)=k=1KDCklog2DCk
H ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ H ( D i ) = − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ ∑ k = 1 K ∣ D i k ∣ ∣ D i ∣   l o g 2 ∣ D i k ∣ ∣ D i ∣ H(D|A)=\sum_{i=1}^{n}\frac{|D_{i}|}{|D|}H(D_{i})=-\sum_{i=1}^{n}\frac{|D_{i}|}{|D|}\sum_{k=1}^{K}\frac{|D_{ik}|}{|D_{i}|}\,log_{2}\frac{|D_{ik}|}{|D_{i}|} H(DA)=i=1nDDiH(Di)=i=1nDDik=1KDiDiklog2DiDik
(3)信息增益比(校正
校正信息增益式子(因在原式子中,取值数更多的特征更易被选中)
g R ( D , A ) = g ( D , A ) H A ( D ) = g ( D , A ) − ∑ i = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ g_{R}(D,A)=\frac{g(D,A)}{H_{A}(D)}=\frac{g(D,A)}{-\sum_{i=1}^{n}\frac{|D_{i}|}{|D|}log_{2}\frac{|D_{i}|}{|D|}} gR(D,A)=HA(D)g(D,A)=i=1nDDilog2DDig(D,A)

5.3 决策树的生成(ID3,C4.5)

本书中所写算法
ID3和C4.5唯一区别是前者用信息增益,后者用信息增益比。二者都用了最大信息增益(比)的阈值(这里是信息增益(比) 的阈值,当然也可以加入样本集数量阈值),这样可以判定哪些结点的分类已经较好(也就是该子集的数据已经被基本分类正确),如果结点处没有多余可选特征(特征集为空)则以样本数最多的类别为分类类别,此外是递归调用时注意每个子结点的特征集是在父节点特征集中减去父节点所选取的特征,而同一深度不同结点子结点的特征集通常不一样
ID3相当于用极大似然法(因比值估计式由极大似然估计得到)进行概率模型的选择。

5.4 剪枝(ID3,C4.5)

T T T叶节点个数 ∣ T ∣ |T| T,叶节点 t t t N t N_{t} Nt个样本点,其中第 k k k类样本点有 N t k N_{tk} Ntk个, k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K H t ( T ) H_{t}(T) Ht(T)为叶节点 t t t上的经验熵, α ≥ 0 \alpha\ge 0 α0.
损失函数(加上正则项): C α ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) + α ∣ T ∣ C_{\alpha}(T)=\sum_{t=1}^{|T|}N_{t}H_{t}(T)+\alpha|T| Cα(T)=t=1TNtHt(T)+αT
经验熵:
H t ( T ) = − ∑ k N t K N t l o g N t K N t H_{t}(T)=-\sum_{k}\frac{N_{tK}}{N_{t}}log\frac{N_{tK}}{N_{t}} Ht(T)=kNtNtKlogNtNtK
继续重写等式右边第一项:
C ( T ) = ∑ t = 1 ∣ T ∣ N t H t ( T ) = − ∑ t = 1 ∣ T ∣ ∑ k = 1 K N t K   l o g N t K N t C(T)=\sum_{t=1}^{|T|}N_{t}H_{t}(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^{K}N_{tK}\,log\frac{N_{tK}}{N_{t}} C(T)=t=1TNtHt(T)=t=1Tk=1KNtKlogNtNtK
从而有:
C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T)=C(T)+\alpha|T| Cα(T)=C(T)+αT
确定 α \alpha α后,我们的目标便是找到对应的 T T T满足:
a r g   m i n T    C α ( T ) arg\,\underset{T}{min}\;C_{\alpha}(T) argTminCα(T)
上式可以理解为是对近似误差(拟合训练数据集能力)和估计误差(泛化能力)的一个折中 α \alpha α越大越偏向简单模型,极端情况就一个根节点。
而是否剪枝,就看剪枝前和剪枝后损失函数的对比,如果后者更小或相等则剪枝,递归地往上回缩。这种剪枝算法可以由一种动态规划的算法实现。

注意生成决策树的过程是没有加入正则项的,而在剪枝过程中是加入了正则项的。

5.5 CART算法(分类与回归树)

CART假设决策树为二叉树,递归地二分每个特征。
1.CART生成
(1)回归树
假设将 X \mathcal{X} X划分为 M M M个单元 R 1 , R 2 , . . . , R M R_{1},R_{2},...,R_{M} R1,R2,...,RM,每个单元对应一个固定输出值 c m c_{m} cm,则回归树模型可表示为:
f ( x ) = ∑ m = 1 M c m I ( x ∈ R m ) f(x)=\sum_{m=1}^{M}c_{m}I(x\in R_{m}) f(x)=m=1McmI(xRm)
损失函数
∑ x i ∈ R m ( y i − f ( x i ) ) 2 \sum_{x_{i}\in R_{m}}(y_{i}-f(x_{i}))^{2} xiRm(yif(xi))2
经由 i . i . d i.i.d i.i.d等假设, c m c_{m} cm的最优估计为:
c m ^ = m e a n ( y i ∣ x i ∈ R m ) \hat{c_{m}}=mean(y_{i}|x_{i}\in R_{m}) cm^=mean(yixiRm)
如何对输入空间进行划分?我们采用启发式方法(切分变量和切分点)
R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } ,    R 2 ( j , s ) = { x ∣ x ( j ) > s } R_{1}(j,s)=\left\{x|x^{(j)}\le s\right\},\;R_{2}(j,s)=\left\{x|x^{(j)}> s\right\} R1(j,s)={xx(j)s},R2(j,s)={xx(j)>s}
而后寻找具体的 j j j s s s
m i n j , s    [ m i n c 1    ∑ x i ∈ R 1 ( j , s )    ( y i − c 1 ) 2 + m i n c 2    ∑ x i ∈ R 2 ( j , s )    ( y i − c 2 ) 2 ] \underset{j,s}{min}\;[\underset{c_{1}}{min}\;\sum_{x_{i}\in R_{1}(j,s)}\;(y_{i}-c_{1})^{2}+\underset{c_{2}}{min}\;\sum_{x_{i}\in R_{2}(j,s)}\;(y_{i}-c_{2})^{2}] j,smin[c1minxiR1(j,s)(yic1)2+c2minxiR2(j,s)(yic2)2]
我们遍历切分变量 j j j,对固定的 j j j扫描切分点 s s s,找到最优的一对 ( j , s ) (j,s) (j,s),对空间进行切分后递归地进行下一次切分操作,具体算法可看书。
(2)分类树的生成
和前面信息熵的定义大同小异。
基尼指数( K K K个类别, p k p_{k} pk表示样本点属于第 k k k类的概率):
G i n i ( X ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(X)=\sum_{k=1}^{K}p_{k}(1-p_{k})=1-\sum_{k=1}^{K}p_{k}^{2} Gini(X)=k=1Kpk(1pk)=1k=1Kpk2
经验基尼指数(展开):
G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum_{k=1}^{K}(\frac{|C_{k}|}{|D|})^{2} Gini(D)=1k=1K(DCk)2
经验条件基尼指数( D 1 D_{1} D1 D 2 D_{2} D2由是否 A = a A=a A=a产生,二分划):
G i n i ( D ∣ A = a ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 2 ∣ ∣ D ∣ G i n i ( D 2 ) Gini(D|A=a)=\frac{|D_{1}|}{|D|}Gini(D_{1})+\frac{|D_{2}|}{|D|}Gini(D_{2}) Gini(DA=a)=DD1Gini(D1)+DD2Gini(D2)
这后面的过程和ID3基本一样,二者只是对数据确定性的衡量标准不一样,还有前者是多叉树,后者是二叉树,算法的思想都是一样的。
2.CART剪枝
子树损失函数计算公式(加入正则项):
C α ( T ) = C ( T ) + α ∣ T ∣ C_{\alpha}(T)=C(T)+\alpha|T| Cα(T)=C(T)+αT
C ( T ) C(T) C(T)为预测误差(如基尼系数),或者理解成损失项,后面 α ∣ T ∣ \alpha|T| αT为正则项。
我们的本意是:当 α \alpha α确定以后,可以由损失函数来衡量模型的优劣,损失函数最小的为最优子树。而对于每个固定的 α \alpha α,必然存在唯一的最优子树。(因为二叉树的结构和损失函数的构成决定,证明可看书)最优子树可受 α \alpha α变化而变化, α = 0 \alpha=0 α=0时为整棵树 T 0 T_{0} T0 α \alpha α充分大时为单根结点 T n T_{n} Tn n n n是不确定的)。
而实际中我们是不知道 α \alpha α应当如何选取,因为 α \alpha α越大的话模型越简单,太简单的模型可能对训练数据没有较好的学习,故而尝试多个不同的 α \alpha α。我们考虑仅仅在各种 α \alpha α对应的最优子树的集合中选取最终的决策树。
现在通过递归的方法可以构造出这样的集合。
具体地,从 T 0 T_{0} T0开始剪枝,对所有的内部结点(非叶子结点)进行搜索,不妨设一个内部结点为 t t t,设以 t t t为单根结点的子树为 t t t,以 t t t为根节点的子树为 T t T_{t} Tt(此时 t t t处对应的数据为整体树流到 t t t结点时的数据,而非是全体数据,同时因为决策树的损失项(预测误差)是将各叶子的损失项相加,故可以只考虑这一叶子的局部分支),我们有
C α ( t ) = C ( t ) + α ,      C α ( T t ) = C ( T t ) + α ∣ T t ∣ C_{\alpha}(t)=C(t)+\alpha ,\;\;C_{\alpha}(T_{t})=C(T_{t})+\alpha |T_{t}| Cα(t)=C(t)+α,Cα(Tt)=C(Tt)+αTt

α = 0 \alpha=0 α=0时, C α ( t ) < C α ( T t ) C_{\alpha}(t)<C_{\alpha}(T_{t}) Cα(t)<Cα(Tt)(严格小,因为生成过程中的阈值);
α \alpha α充分大时, C α ( t ) > C α ( T t ) C_{\alpha}(t)>C_{\alpha}(T_{t}) Cα(t)>Cα(Tt)(严格大);
令二者相等,我们有 α = C ( t ) − C ( T t ) ∣ T t − 1 ∣ \alpha=\frac{C(t)-C(T_{t})}{|T_{t}-1|} α=Tt1C(t)C(Tt)
遍历所有内部结点,找到最小的 α \alpha α对应的结点剪枝生成子树 T 1 T_{1} T1,记 α 0 = 0 , α 1 = C ( t ) − C ( T t ) ∣ T t − 1 ∣ \alpha_{0}=0,\alpha_{1}=\frac{C(t)-C(T_{t})}{|T_{t}-1|} α0=0,α1=Tt1C(t)C(Tt),如此反复进行下去,直到内部结点只剩根节点为止,得到一个子树集合 { T 1 , T 2 , . . . , T n } \left\{T_{1},T_{2},...,T_{n}\right\} {T1,T2,...,Tn},这里面每个 T i T_{i} Ti都是 [ α i , α i + 1 ] [\alpha_{i},\alpha_{i+1}] [αi,αi+1]中的最优子树。再在此集合中选取在独立的验证集中(交叉验证)表现最好的子树作为最终结果。不懂的参考书本。

6 Logistic回归与最大熵模型

6.1 Logistic 回归模型

·

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值