1. 机器学习介绍
1.1 基本术语
机器学习:利用经验、通过计算、构建模型,来改善系统自身的性能。
属性(特征):描述事物在特定方面的表现或性质的事项。
属性值:属性上的取值。
属性空间(输入空间):属性的所有可能取值构成的集合,若属性为多维特征则是由多维属性张成的空间,属性空间X。
记录(样本、实例):一个具体事物的属性描述,由属性向量表示。
例如:第j个记录xj的属性向量,表示如下
xj=(xj(1),xj(2),⋯,xj(i),⋯,xj(n))⊤,j=1,2,⋯,Ni=1,2,⋯,nxj∈X
其中,xj(i)为第j个记录的第i个属性。(这里为啥要用⊤转置是因为机器学习中默认向量为列向量,由于列向量太占空间,所以这里用行向量加⊤转置表示列向量)
标记:描述事物某个特性或结果的事项。
标记值:标记上的取值。
标记空间(输出空间):标记的所有取值构成的集合,标记空间Y。
样例:拥有了对应标记的记录,由(记录,标记)对表示。第j个样例
(xj,yj),j=1,2,…,N,xj∈X,yj∈Y。
数据集:
记录的集合(无监督学习数据集),D={x1,x2,…,xN};
样例的集合(有监督学习数据集),D={(x1,y1),(x2,y2),…,(xN,yN)}。
有监督学习:
- 回归学习:有监督学习中,标记为连续值,Y=R。
- 分类学习:有监督学习中,标记为离散值。其中,
若∣Y∣=2,Y={0,1}或Y={+1,−1},则为二分类;
若∣Y∣>2,Y={c1,c2,…,cm},则为多分类。
训练数据集:用以训练模型的数据集的子集,Dtraining⊆D。
验证数据集:用以选择模型的数据集的子集,Dverification⊆D。
测试数据集:应用测试模型的数据集的子集,Dtesting⊆D。
1.2 假设空间与参数空间
有监督学习的目的在于学习一个从输入空间X到输出空间Y的映射f,或是条件概率P(Y∣X)。
决策函数(非概率模型):从输入空间X到输出空间Y的映射f:X→Y。
假设空间F定义为决策函数的集合
F={f∣Y=f(X)}
其中,X是定义在输入空间X上的变量,X∈X;Y是定义在输出空间Y上的变量,Y∈Y。
假设空间F通常是由一个参数向量决定的函数族
F={f∣Y=fw(X),w∈Rn}
其中,参数向量w=(w(1),⋯,w(n))⊤取值于n维向量空间Rn,称为参数空间。
概率模型:假设空间F定义为条件概率的集合
F={P∣P(Y∣X)}
其中,X是定义在输入空间X上的随机变量,Y是定义在输出空间Y上的随机变量。
假设空间F通常是由一个参数向量决定的概率分布族
F={P∣Pw(Y∣X),w∈Rn}
其中,参数向量w取值于n维向量空间Rn,称为参数空间。
1.3 模型策略
1.3.1 损失函数
损失函数:度量模型预测错误的程度,是模型的预测输出f(X)和实际输出Y的非负实值函数,记作L(Y,f(X))。
0−1 损失函数表示如下
L(Y,f(X))={ 1,Y=f(X)0,Y=f(X)=I(Y=f(X))
其中,I(⋅)是指示函数,当括号中条件成立返回1,否则返回0。
1.3.2 平方损失函数
L(Y,f(X))=(Y−f(X))2
1.3.3 绝对值损失函数
L(Y,f(X))=∣Y−f(X)∣
1.3.4 对数似然损失函数
L(Y,P(Y∣X))=−logP(Y∣X)
1.3.5 经验损失
经验风险(经验损失)是模型f关于训练数据集D
D={(x1,y1),(x2,y2),⋯,(xN,yN)}
的平均损失
Remp(f)=N1i=1∑NL(yi,f(xi))
学习目标:经验风险最小化
f∗=f∈FargminRemp(f)
其中,F是假设空间。
1.3.6 过拟合
学习时选择的模型复杂,所包含的参数过多,以至于出现对已知数据预测得很好,但对未知数据预测得很差的现象。
1.3.7 欠拟合
学习时选择的模型简单,所包含的参数过少,以至于出现不能对数据预测很好的现象。
1.3.8 泛化能力
学习得到的模型对未知数据的预测能力。
1.3.8 结构风险
在经验风险上增加表示模型复杂度的正则化项。
Rstr=N1i=1∑NL(yi,f(xi))+λJ(f)
其中,J(f)是模型复杂度,是正则化项,是定义在假设空间F上的泛函;λ≥0是系数,用以权衡风险和模型复杂度。
学习目标:结构风险最小化
f∗=argminf∈FRstr(f)
其中,F是假设空间。
正则化项可以是参数向量的L2范数
J2=21∥w∥22=21((w(1))2+⋯+(w(n))2)2=21((w(1))2+⋯+(w(n))2)
其中,∥w∥2表示参数向量w的L2范数。
正则化项可以是参数向量的L1范数
J1=∥w∥1=∣w(1)∣+⋯+∣w(n)∣
其中,∥w∥1表示参数向量w的L1范数。
1.4 优化算法
机器学习的训练过程就是使用训练数据集D,按照模型策略在假设空间F中寻找最优模型f∗的最优化求解过程
f∗=argminf∈FRstr(f)或者在参数空间中寻找最优参数w∗的最优化求解过程
w∗=argminfw∈FRstr(fw)。
梯度下降法:通过迭代的方法来计算训练集D上的风险函数最小值
wt+1=wt−α∂w∂RD(w)=wt−αN1i=1∑N∂w∂L(yi,fw(xi))
其中,wt为第t次迭代的参数值,α为学习率。
1.5 性能度量与评估方法
1.5.1 训练误差
模型Y=f(X)关于训练数据集的平均损失
Remp(f)=N1i=1∑NL(yi,f(xi))
其中,N是训练样本容量。
1.5.2 测试误差
模型Y=f(X)关于测试数据集的平均损失
etest=N′1i=1∑N′L(yi,f(xi))
其中,N′是测试样本容量。
当损失函数是0−1损失,测试误差就是测试集上的误差率
etest=N′1i=1∑N’I(yi=f(xi))
其中,I是指示函数,即y=f(x)时为1,否则为0。
测试集上的准确率
rtest=N′1i=1∑N’I(yi=f(xi))
则,rtest+etest=1。
分类中,模型的预测结果可分为:
- 真正例(True Positive,TP):将正类预测为正类;
- 假负类(False Negative,FN):将正类预测为负类;
- 假正类(False Positive,FP):将负类预测为正类;
- 真负类(True Negative,TN):将负类预测为负类。
1.5.3 精确率(查准率)
P=TP+FPTP
1.5.4 召回率(查全率)
R=TP+FNTP
F1值是精确率和召回率的调和均值
F12=P1+R1F1=2TP+FP+FN2TP
真正率
TPR=TP+FNTP
假正率
FPR=TN+FPFP
1.6 欠拟合与过拟合实例
import numpy as np
import scipy as sp
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
%matplotlib inline
def real_func(x):
return np.sin(2 * np.pi * x)
def fit_func(p, x):
f = np.poly1d(p)
return f(x)
def residuals_func(p, x, y):
ret = fit_func(p, x) - y
return ret
x = np.linspace(0, 1, 10)
x_points = np.linspace(0, 1, 1000)
y_ = real_func(x)
y = [np.random.normal(0, 0.1) + y1 for y1 in y_]
def fitting(M=0):
p_init = np.random.rand(M + 1)
p_lsq = leastsq(residuals_func, p_init, args=(x, y))
print('Fitting Parameters:', p_lsq[0])
plt.plot(x_points, real_func(x_points), label='real')
plt.plot(x_points, fit_func(p_lsq[0], x_points), label='fitted curve')
plt.plot(x, y, 'bo', label='noise')
plt.legend()
return p_lsq
p_lsq_0 = fitting(M=0)
p_lsq_1 = fitting(M=1)
p_lsq_3 = fitting(M=3)
p_lsq_9 = fitting(M=9)
regularization = 0.0001
def residuals_func_regularization(p, x, y):
ret = fit_func(p, x) - y
ret = np.append(ret, np.sqrt(0.5 * regularization * np.square(p)))
return ret
p_init = np.random.rand(9+1)
p_lsq_regularization = leastsq(residuals_func_regularization, p_init, args=(x, y))
plt.plot(x_points, real_func(x_points), label='real')
plt.plot(x_points, fit_func(p_lsq_9[0], x_points), label='fitted curve')
plt.plot(x_points, fit_func(p_lsq_regularization[0], x_points), label='regularization')
plt.plot(x, y, 'bo', label='noise')
plt.legend()
print(p_lsq_regularization[0])
[ -5.13841552 -2.86712381 1.52815237 6.55153915 9.28063603
5.58868868 -6.8006399 -17.16663939 9.17580857 -0.19034247]