统计学习包括监督学习,半监督学习,非监督学习,强化学习。
监督学习利用训练数据集学习的一个模型,再用模型对测试样本集进行预测,训练集往往是人工给出的,所以称之为监督学习。
输入空间是在输入过程中,所有可能取值的集合。
输入变量常用X表示,输入变量的值用x表示
每个具体的输入是一个实例 x,用特征向量(列向量)表示
我的理解是:
输出空间是在输出过程中,所有可能取值的集合
输出变量常用Y表示,输出变量的值用y表示
人们根据输入,输出变量的不同类型,对预测任务给予不同的名称
回归问题:X,Y均为连续变量的预测
分类问题:X,Y均为有限个离散变量的预测
标注问题:X,Y均为变量序列的预测
监督学习可以归结为最小化一个目标函数。求模型多项式的参数,防止过拟合。
方法 = 模型 + 策略 + 算法
假设空间用F表示,模型的假设空间包含所有可能的条件概率分布或决策函数。
假设决策函数是输入变量的线性函数,那么模型的假设空间就是所有这些线性函数构成的函数集合。假设空间中的模型一般有无穷多个。假设空间(模型)的确定意味着学习范围的确定。
假设空间的定义
参数向量 & 参数空间:
损失函数
预测值f(X)与真实值Y可能一致也可能不一致,用一个损失函数或代价函数来度量预测错误的程度
损失函数是f(X)和Y的非负实值函数
损失函数的类型:
备注:如何理解对数损失函数
对数损失函数和似然函数的关系
P(theta | x1, ..., xn) = P(x1 | theta) * ... * P(xn | theta)
其中theta是参数,xi是数据。为什么要取对数?
为什么要取负数?
风险函数 & 经验风险
损失函数值越小,模型就越好。由于模型的输入、输出(X,Y)是随机变量,遵循联合分布P(X,Y),所以损失函数的期望是
这是理论上模型f(X)关于联合分布P(X,Y)的平均意义下的损失,称为风险函数(risk function)或期望损失(expected loss)。
由于联合概率分布在学习系统中是未知的(无论是学习模型,还是生成模型),所以期望损失(风险函数)无法计算,只能用经验风险来替代。
模型f(X)关于训练数据集的平均损失成为经验风险或者经验损失。
期望风险和经验风险的关系:
期望风险 R e x p ( f ) R_{exp} (f) Rexp(f)是模型关于联合分布的期望损失,经验风险 R e m p ( f ) R_{emp} (f) Remp(f)是模型关于训练样本集的平均损失。根据大数定律,当样本容量N趋于无穷时,经验风险 R e m p ( f ) R_{emp} (f) Remp(f)趋于期望风险 R e x p ( f ) R_{exp} (f) Rexp(f)。
结构风险
在经验风险上加上表示模型复杂度的正则化项(regularizer)或罚项(penalty term)
J ( f ) J(f) J(f)为模型的复杂度,复杂度表示了对复杂模型的惩罚,模型 f f f越复杂,复杂度 J ( f ) J(f) J(f)就越大;反之,模型 f f f越简单,复杂度 J ( f ) J(f) J(f)就越小
λ≥0是系数,用以权衡经验风险和模型复杂度
对正则化项的理解
正则化项可以取不同的形式。例如,回归问题中,损失函数是平方损失,正则化项可以是参数向量的L-2 范数。$||w||_2 $表示参数向量w的L-2 范数。
正则化项也可以是参数向量的L-1 范数。 ∣ ∣ w ∣ ∣ 1 ||w||_1 ∣∣w∣∣1 表示参数向量w的L-1 范数。
为什么要引入范数?
范数的分类?
矩阵范数:描述矩阵引起变化的大小,AX=B,矩阵X变化了A个量级,然后成为了B。
向量范数:描述向量在空间中的大小。向量范数的通用公式为L-P范数。
经验风险最小化
结构风险最小化
结构风险最小化(structural risk minimization,SRM)是为了防止过拟合而提出来的策略。结构风险最小化等价于正则化(regularization)。
当模型是条件概率分布、损失函数是对数损失函数、模型复杂度由模型的先验概率表示时,结构风险最小化就等价于最大后验概率估计。
结构风险小需要经验风险与模型复杂度同时小。结构风险小的模型往往对训练数据以及未知的测试数据都有较好的预测。
注意训练集的个数N和参数的个数M不一定相等,所以加号不表示数组依次相加,而是数组的合并。
这里可以参考两个视频进行理解正则化
什么是 L1 L2 正规化 正则化 Regularization (深度学习 deep learning)
10分钟彻底搞懂L2正则化–转自台大老师李宏毅2020
基于损失函数的模型的训练误差(training error)和模型的测试误差(test error)就自然成为学习方法评估的标准。最终的目的是使测试误差达到最小。
训练误差:模型Y= f^(X)关于训练数据集的平均损失(N为训练样本容量)
测试误差:模型Y= f^(X)关于测试数据集的平均损失(N’为测试样本容量)
统计学习方法具体采用的损失函数未必是评估时使用的损失函数。当然,让两者一致是比较理想的。
指学习时选择的模型所包含的参数过多,以致于出现这一模型对已知数据预测得很好,但对未知数据预测得很差的现象
如果M=9,多项式曲线通过每个数据点,训练误差为0。从对给定训练数据拟合的角度来说,效果是最好的。但是,因为训练数据本身存在噪声,这种拟合曲线对未知数据的预测能力往往并不是最好的。
当M=3时,多项式曲线对训练数据拟合效果足够好,模型也比较简单,是一个较好的选择。
随着 多项式次数(模型复杂度) 的增加,训练误差会减小,直至趋向于0,但测试误差却不如此,它会随着多项式次数(模型复杂度)的增加先减小而后增大。多项式的次数越大,输入变量x前的次数越多(参数就越多),模型复杂度越大。
训练误差和测试误差与模型复杂度的关系
如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集(training set)、验证集(validation set)和测试集(test set)。训练集用来训练模型,验证集用于模型的选择,而测试集用于最终对学习方法的评估。由于验证集有足够多的数据,用它对模型进行选择也是有效的。
但是,在许多实际应用中数据是不充足的。为了选择好的模型,可以采用交叉验证方法。交叉验证的基本想法是重复地使用数据;把给定的数据进行切分,将切分的数据集组合为训练集与测试集,在此基础上反复地进行训练、测试以及模型选择。
交叉验证的分类
简单交叉验证:
一般来说,简单交叉验证并非一种交叉验证,因为数据并没有交叉使用。
由于验证集和训练集是分开的,就避免了过拟合的现象。
S折交叉验证:
留一交叉验证:
学习方法的泛化能力(generalization ability)是指由该方法学习到的模型对未知数据的预测能力
测试误差的缺点:现实中采用最多的办法是通过测试误差来评价学习方法的泛化能力。但这种评价是依赖于测试数据集的。因为测试数据集是有限的,很有可能由此得到的评价结果是不可靠的。
举个栗子:二类分类问题的泛化误差
它是样本容量的函数,当样本容量增加时,泛化上界趋于0;它是假设空间容量(capacity)的函数,假设空间容量越大,模型就越难学,泛化误差上界就越大。
泛化误差 & 泛化误差上界:
不等式(1.25)左端 R ( f ) R(f) R(f)是泛化误差,右端即为泛化误差上界。
在泛化误差上界中,第1项是训练误差(经验风险),训练误差越小,泛化误差也越小。
第2项 ξ ( d , N , σ ) ξ (d,N, σ) ξ(d,N,σ)是N的单调递减函数,当N趋于无穷时趋于0;d是函数的个数,同时它也是** l o g d logd logd阶的函数**,假设空间F包含的函数越多,其值越大。(假设空间容量越大,模型就越难学,泛化误差上界就越大)
监督学习方法又可以分为生成方法(generative approach)和判别方法(discriminative approach)。所学到的模型分别称为生成模型(generative model)和判别模型(discriminative model)。
生成方法由数据学习联合概率分布P(X,Y),然后**求出条件概率分布P(Y|X)**作为预测的模型,即生成模型:
生成方法的特点:
生成方法可以还原出联合概率分布P(X,Y),而判别方法则不能;
生成方法的学习收敛速度更快,即当样本容量增加的时候,学到的模型可以更快地收敛于真实模型;
当存在隐变量时,仍可以用生成方法学习,此时判别方法就不能用
典型的生成模型有:朴素贝叶斯法和隐马尔可夫模型
通常以关注的类为正类,其他类为负类,分类器在测试数据集上的预测或正确或不正确,4种情况出现的总数分别记作:
k近邻法、感知机、朴素贝叶斯法、决策树、决策列表、逻辑斯谛回归模型、支持向量机、提升方法、贝叶斯网络、神经网络、Winnow等
可以认为标注问题是分类问题的一个推广,标注问题又是更复杂的结构预测(structure prediction)问题的简单形式。
举个栗子:输入:At Microsoft Research,输出:At/O Microsoft/B Research/E
标注方法:隐马尔可夫模型、条件随机场。
回归用于预测输入变量(自变量)和输出变量(因变量)之间的关系。回归模型正是表示从输入变量到输出变量之间映射的函数。
回归问题的学习等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据。
并不是所有的拟合问题都是回归问题,只要模型是函数(用函数进行分类),就存在拟合问题。
回归的分类:
回归方法:
回归学习最常用的损失函数是平方损失函数,在此情况下,回归问题可以由著名的最小二乘法(least squares)求解。
了解代码之前,先回顾之前的概念,以及了解一些新概念
https://www.zhihu.com/question/37031188
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DjihJUP1-1594783584760)(./img/Snipaste_2020-06-30_19-55-38.png)]
但是在python代码中,用了以下语句实现正则化,会发现得到的ret数组不是在原来的ret数组上,依次加上L-2范数。而是将ret数组和L-2范数得到的数组,合并成一个大的数组。
# 经验风险[0.31972216 -0.28167978 -0.64009235 -0.23185228 0.37735337 1.20983082 1.89436378 2.78654483
# 3.26961043 3.81895049] M+1个数
# 结构风险[3.19722159e-01 -2.81679783e-01 -6.40092347e-01 -2.31852279e-01 3.77353372e-01 1.20983082e+00
# 1.89436378e+00 2.78654483e+00 3.26961043e+00 3.81895049e+00 4.97801504e-04 8.94357277e-04 2.55965917e-
# 03 6.09320893e-03 5.60403167e-03 3.88778337e-04 5.08172080e-03 2.28874924e-03 2.16380642e-03
# 2.23093071e-03] 2*(M+1)个数
设想一下,经验风险是平均损失,与训练数据个数N有关;而模型复杂度与参数个数有关, J ( f ) J(f) J(f)数组中元素个数,无论用是L-1范数,还是L-2范数计算,个数都与多项式的次数M有关;无法保证N和M相等,则数组不能相加,只能合并。
residuals_func_regularization:
...
print(len(ret)," ", len(np.sqrt(0.5*regularization*np.square(p))))
ret = ret + np.sqrt(0.5*regularization*np.square(p));
main:
# 在[0,1]区间内产生10个真实点(x,y)
x_points = np.linspace(0,1,10)
y_points = real_func(x_points)
...
y_polyld_reg = fit_func(fitting(3, x_points, y_points, residuals_func_regularization), x)
plt.plot(x, y_polyld_reg, label="regulation curve", color="cyan", lw=2.0)
---
ValueError: operands could not be broadcast together with shapes (10,) (4,)
当参数 w i w_i wi越趋近于0时,function越光滑。在计算机制图中,会经常遇到曲线的光滑处理。曲线的光滑方法有许多,大体有两种类型:https://baike.baidu.com/item/曲线光滑/5170091
Q1:为什么用噪点来训练得到最优的参数向量((p_lsq_9[0]),但是在绘制图像时不用噪点x_point,y_point来绘制?
A1:因为如果用噪点画function,画不出光滑曲线,应该用非噪点的x,代入选择的最优模型,求y_point进行绘制。
plt.plot(x, fit_func(p_lsq_9[0], x), label='fitted curve')
np.poly1d()
的使用:通过传入长度为M+1的参数列表,构造M次多项式
通过最小二乘法(fitting方法里)+ 残差函数(或者正则化的残差函数)训练得到最优的参数列表
import numpy as np;
from scipy.optimize import leastsq
import matplotlib.pyplot as plt;
# 目标函数sin(2πx)
def real_func(x):
return np.sin(2*np.pi*x)
# 关于一个变量x的(次数依次递减)多项式函数
# p是一个多项式的系数列表,次数为M,系数个数为M+1
def fit_func(p,x):
# np.poly1d的使用
# >>> p = np.poly1d([1, 2, 3])
# | >>> print(np.poly1d(p))
# | 2
# | 1 x + 2 x + 3
# |
# | Evaluate the polynomial at :math:`x = 0.5`:
# |
# | >>> p(0.5)
# | 4.25
f = np.poly1d(p)
return f(x)
# 经验风险(残差函数):预测值 - 真实值
def residual_func(p,x,y):
return fit_func(p,x) - y
# 在residual_func经验风险的基础上,加上正则化项,变成结构风险
def residuals_func_regularization(p, x, y):
regularization = 0.0001
# 经验风险
ret = residual_func(p,x,y)
# print("经验风险", ret)
# 经验风险[0.31972216 -0.28167978 -0.64009235 -0.23185228 0.37735337 1.20983082 1.89436378 2.78654483
# 3.26961043 3.81895049] M+1个数
# 结构风险(np。append()将两个数组合并成一个大数组,不是两个数组依次相加)
ret = np.append(ret, np.sqrt(0.5*regularization*np.square(p))) # L2范数作为正则化项
# print("结构风险", ret)
# 结构风险[3.19722159e-01 -2.81679783e-01 -6.40092347e-01 -2.31852279e-01 3.77353372e-01 1.20983082e+00
# 1.89436378e+00 2.78654483e+00 3.26961043e+00 3.81895049e+00 4.97801504e-04 8.94357277e-04 2.55965917e- # 03 6.09320893e-03 5.60403167e-03 3.88778337e-04 5.08172080e-03 2.28874924e-03 2.16380642e-03 # 2.23093071e-03] 2*(M+1)个数
#如果是经验风险和正则化项依次相加,则有可能报错
#print(len(ret)," ", len(np.sqrt(0.5*regularization*np.square(p))))
#ret = ret + np.sqrt(0.5*regularization*np.square(p));
return ret
# 函数参数是:M=多项式次数,x=训练集(噪点)横坐标,y=训练集(噪点)纵坐标,func=最小二乘法中选择的策略函数
# 通过产生M+1个随机的,[0,1]内的系数列表
# 使用最小二乘法的策略来避免学习到的多项式过拟合于目标函数
# 返回值是最优参数列表
def fitting(M, x, y, func):
# dn表示数组的维度
# out: ndarray, shape
# ``(d0, d1, ..., dn)``
# Random values.
# >> > np.random.rand(3, 2)
# array([[0.14022471, 0.96360618], # random
# [0.37601032, 0.25528411], # random
# [0.49313049, 0.94909878]]) # random
p_init = np.random.rand(M + 1)
print("初始参数列表", p_init)
# 最小二乘法得到最优的参数向量(多项式中的系数(权值)列表)
# leastsq()第一个参数为模型选择的策略函数:损失函数,经验风险函数,结构风险函数
# 这里使用residual_func(),或者residuals_func_regularization作为策略函数,目的是得到最优的p_init列表,
# args=(x,y)为residual_func()剩余的参数
# 注意第一个参数是函数名,不带()
p_lsq = leastsq(func,p_init,args=(x,y))
print('最优参数列表', p_lsq[0])
return p_lsq[0]
if __name__ == '__main__':
# 在[0,1]区间内产生10个真实点(x,y)
x_points = np.linspace(0,1,10)
y_points = real_func(x_points)
# 将真实点加上正态分布噪音的目标函数的值,作为训练集,散点表示
# 参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布,
# 参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。
# 参数size(int 或者整数元组):输出的值赋在shape里,默认为None。
y_points = [np.random.normal(0, 0.1) + y1 for y1 in y_points]
plt.scatter(x_points, y_points, label="noise",color="blue")
# 在[0,1]区间内产生1000个点,汇出光滑的目标函数曲线
x = np.linspace(0,1,1000)
y = real_func(x)
plt.plot(x, y, label="real curve",color="red",lw=2.0)
# 利用噪点来训练多项式
# 1、利用最小二乘法得到最优的参数列表 print(fitting(3,x_points,y_points))
# 2、将最优的参数列表,噪点x代入fit_func(p, x),得到最优的多项式,即最优的模型
y_polyld = fit_func(fitting(9,x_points,y_points,residual_func),x)
plt.plot(x, y_polyld, label="fitted curve", color="green",lw=2.0)
y_polyld_reg = fit_func(fitting(9, x_points, y_points, residuals_func_regularization), x)
plt.plot(x, y_polyld_reg, label="regulation curve", color="cyan", lw=2.0)
# 把所有图例放在一起
plt.legend()
plt.show()
Q1:L-2范数的正则化项如何避免过拟合?
Q2:回归问题的学习等价于函数拟合,是不是说函数拟合问题只在回归问题中出现,在分类,标注问题中没出现?
Q3:联合概率分布是不是在判别模型中是未知的,但在生成模型中是已知的?
A3:联合概率在学习系统中是未知的
1、对数损失函数
2、对数损失函数是如何度量损失的?
3、机器学习中的范数规则化之(一)L0、L1与L2范数
4、L1,L2,L0区别,为什么可以防止过拟合 - 简书
5、范数的用途、什么是范数
6、交叉验证(Cross Validation)
7、交叉验证(简单交叉验证、k折交叉验证、留一法)
8、李航统计学习方法笔记——泛化误差上界
9、机器学习面试之生成模型VS判别模型
10、如何解释召回率与精确率?
11、怎样区分线性和非线性_线性与非线性的区别(线性分析、线性模型)
12、最小二乘法的本质是什么?
13、什么是 L1 L2 正规化 正则化 Regularization (深度学习 deep learning)
14、10分钟彻底搞懂L2正则化–转自台大老师李宏毅2020
15、李航老师的《统计学习方法》