参考文献:李航.统计学习方法[M].北京:清华大学出版社,2018.
该部分笔记全部总结自这本书。

1.统计学习方法概论

1.1 统计学习

  • 统计学习的方法:监督学习,非监督学习,半监督学习,强化学习等。
  • 三要素:模型、策略、算法。
    • 模型:所有可能的模型的假设空间
    • 策略:模型选择的准则
    • 算法:模型的具体计算方法。

1.2 监督学习

supervised learning:给定输入,预测输出。

1.2.1 基本概念

  1. 输入空间、特征空间与输出空间
  • 输入空间:输入的所有可能取值

输入空间可以是有限的,可以是整个欧氏空间,也可以在同一个空间,也可以不同空间‘通常输出空间远小于输入空间。

特征向量:所有特征向量存在的空间为特征空间。每一维对应一个特征。
模型实际上都是定义在特征空间的。

默认提到的向量均为列向量。

输入实例x的特征向量记作:
x=(x(1),x(2),x(3),...,x(n))Tx=(x^{(1)},x^{(2)},x^{(3)},...,x^{(n)})^{T}
xix^{i}表示x的第i个特征。注意xix^{i}xix_i不同,xix_i表示多个输入变量中的第i个,即:
xi=(xi(1),xi(2),xi(3),...,xi(n))x_i=(x^{(1)}_i,x^{(2)}_i,x^{(3)}_i,...,x^{(n)}_i)

样本点(xix_i,yiy_i),组成样本空间T。

  1. 联合概率分布

对于学习系统来说,联合概率分布的具体定义是未知的。训练集与测试集被看作是依据联合分布P(X,Y)独立同分布产生的。

  1. 假设空间

模型属于由输入空间到输出空间的映射的集合,这个集合就是假设空间(hypothesis space)。

1.2.2 问题的形式化

1.【笔记之】统计学习方法概论
李航统计学习方法书上的图片,下同,不累述了

1.3 统计学习三要素

之前总结过:点击这里!指标大全!传送门
方法=模型+策略+算法

1.3.2 策略

这块主要就是损失函数和风险函数。
经验风险最小化和结构风险最小化。

1.4 模型评估与模型选择

1.4.1 训练误差与测试误差

当损失函数给定时,基于损失函数的模型的训练误差和模型的测试误差就成为了学习方法评估的准则。

1.4.2 过拟合与模型选择

  • 过拟合:值学习时选择的模型所包含的参数过多,以至于出现这以模型随已知数据预测得很好,但对未知数据预测的很差的现象。

1.【笔记之】统计学习方法概论

常用的两个模型选择方法:正则化、交叉验证

1.5 正则化和交叉验证

1.5.1 正则化

  • 正则化:是结构风险最小化策略,是在经验风险后加一个正则化项或罚项。
    正则化一般具有如下形式:
    min=1Ni=1NL(yi,f(xi))+λJ(f)\min = \frac1N \sum_{i=1}^{N} L(y_i,f(x_i))+\lambda J(f)

在回归问题中:
L2范数的平方损失函数:L(ω)=1Ni=1N(f(xi;ω)yi)2+λ2ω2L(\omega)=\frac1N \sum_{i=1}^{N}(f(x_i;\omega)-y_i)^2 + \frac{\lambda}{2} ||\omega||^2
L1范数:L(ω)=1Ni=1N(f(xi;ω)yi)2+λω1 L(\omega)=\frac1N \sum_{i=1}^{N}(f(x_i;\omega)-y_i)^2 + {\lambda} ||\omega||_1

正则化符合奥卡姆剃刀原理:从所有可能选择的模型里面选择解释性很好的并且十分简单的模型。

从贝叶斯估计的角度看,正则化项对应于模型的先验概率。可以假设复杂的模型有较小的先验概率,简单的模型有较大的先验概率。

1.5.2 交叉验证

  • 训练集(trainning set)、测试集(test set)、验证集(validation set)
  • 简单交叉验证:70%训练集,30%测试集。
  • S折交叉验证:一般选用10折交叉验证,选用S折平均误差最小的模型。
  • 留一法:用于数据量较少的情况,S=N,N为数据量。

1.6 泛化能力

  • 通过比较两个模型的泛化误差上界来比较他们的优劣。
  • 泛化误差就是模型的期望风险:
    • 它是样本容量的函数,当样本容量增加时,泛化上界趋于0
    • 它是假设空间容量的函数,当假设空间越大,模型越难学,泛化误差上界就越大。

1.6.2 泛化误差上界

对于一个二分类问题,假设空间是有限个函数的集合ϝ={f1,f2,f3,...,fd}\digamma={\{f_1,f_2,f_3,...,f_d\} }时,对于任意一个函数,至少以概率1δ1-\delta,以下不等式成立:
R(f)=R^(f)+ε(d,N,δ) R(f)=\widehat R(f) + \varepsilon (d,N,\delta)
其中:ε(d,N,δ)=12N(logd+log1δ)\varepsilon(d,N,\delta)=\sqrt{\frac1{2N}(\log d + \log {\frac1{\delta}})}

这里要用到Hoeffding 不等式:

Sn=i=1nXiS_n=\sum_{i=1}^n X_i是独立随机变量X1,X2,X3,...,XnX_1,X_2,X_3,...,X_n之和,Xi[ai,bi]X_i \in [a_i,b_i],则对任意t>0,以下不等式成立:

P(ESnSnt)exp(2t2i=1n(biai)2)P(ES_n-S_n \geq t) \leq exp(\frac{-2t^2}{\sum_{i=1}^n (b_i-a_i)^2})

对任意函数fϝf \in \digammaR^(f)\widehat R(f) 是N个独立的随机变量L(Y,f(X))的样本均值,R(f)是随机变量L(Y,f(x))的期望值。如果损失函数取值于区间[0,1],即对所有i, [ai,bi]=[0,1][a_i,b_i]=[0,1] ,那么,对于 ε>0\varepsilon > 0,以下不等式成立:

P(R(f)R^(f)ε)exp(2Nε2)P(R(f)-\widehat R(f) \geq \varepsilon) \leq exp(-2N \varepsilon ^2)

1.7 生成模型与判别模型

监督学习=生成模型:
P(YX)=P(X,Y)P(X)P(Y|X)=\frac{P(X,Y)}{P(X)}

生成模型:模型表示给定输入X产生输出Y的生成关系,典型的是朴素贝叶斯法和隐马尔可夫模型。

判别模型:由数据直接学习决策函数f(X)或者条件概率分布P(Y|X)作为预测模型。典型的是:K近邻、感知机、决策树、logistic、支持向量机、提升树、条件随机场。

生成方法可以还原联合概率分布P(X,Y),而判别方式则不能;生成模型的学习收敛速度快。

1.8 分类问题

TN,TP,FN,FP

这篇文章总结的特别详细:评价指标大全!点这里,传送门!

1.9 案例一

leastsq(func, x0, args=(), Dfun=None,  
        full_output=0, col_deriv=0, ftol=1.49012e-08,  
        xtol=1.49012e-08, gtol=0.0, maxfev=0,   
        epsfcn=None, factor=100, diag=None)

这里会使用到的参数只有前三个:

  • func:误差函数(损失函数)
  • x0:函数的参数
  • args():数据点(样本对)

这里目标拟合一个$y= \cos 2 \pi x$,然后加上一个正太分布的噪声干扰,用多项式去拟合,并绘图

import numpy as np
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
## 定义函数
def func(x):
    return np.cos(2*np.pi*x)
    
## 生成一个多项式
def polynomial(p,x):
    f = np.polyld(p)
    return f(x)

## 残差
def residuals(p,x,y):
    return  polynomial(p,x)-y ## 实际参数在这里设置好了

#20个点
x = np.linspace(0,1,20)
## 加上正态分布的噪声
y=func(x)
yi= [np.random.normal(0,0.1) + y1 for y1 in y]

def fitting(p):
    para=np.random.rand(p+1) # 随便设置一组默认参数
    r=leastsq(residuals,para,args=(x,yi))
    print('fitting parameters:',r[0]) # 第一个是参数
    
    # 可视化
    a=np.linspace(0,1,1000)
    plt.plot(a,func(a),label='real')
    plt.plot(a,polynomial(r[0],a),label='fitted')
    plt.plot(x,yi,'bo',label='noise')
    plt.legend()
    return r

用常数拟合

r_0=fitting(0)

结果如图:
1.【笔记之】统计学习方法概论

用三阶、四阶、十九阶去拟合
这个绘图方法在matplotlib.plot总结过了,传送门这里,点击!

p1=plt.figure(figsize=(15,7),dpi=111)
pic1=p1.add_subplot(1,3,1) #一行三列的第一幅图
r_3=fitting(3)
pic2=p1.add_subplot(1,3,2)
r_4=fitting(4)
pic3=p1.add_subplot(1,3,3)
r_20=fitting(19)

结果如图:
1.【笔记之】统计学习方法概论
很明显三阶欠拟合,四阶刚刚好,十九阶过拟合。

1.10 第二个栗子

这里引入L2范数,也就是岭回归。假设lambda=0.0001

def regularization(p,x,y):
    reg= polynomial(p,x)-yi
    reg=np.append(reg,np.sqrt(0.5*0.0001*np.square(p)))
    return reg
    
def fitting1(p=19):
    para=np.random.rand(p+1) # 随便设置一组默认参数
    r_19=leastsq(regularization,para,args=(x,yi))
    print('fitting parameters:',r_19[0]) # 第一个是参数
    
    # 可视化
    a=np.linspace(0,1,1000)
    plt.plot(a,func(a),label='real')
    plt.plot(a,polynomial(r_19[0],a),label='fitted')
    plt.plot(x,yi,'bo',label='noise')
    plt.legend()
    
    return r_19
fitting1()

1.【笔记之】统计学习方法概论
看橙黄色那条,加入正则化之后,明显与紫色那条对比,矫正了过拟合现象。

相关文章: