机器学习:利用经验、通过计算、构建模型,来改善系统自身的性能。
属性(特征):描述事物在特定方面的表现或性质的事项。
属性值:属性上的取值。
属性空间(输入空间):属性的所有可能取值构成的集合,若属性为多维特征则是由多维属性张成的空间,属性空间 X \mathcal{X} X。
记录(样本、实例):一个具体事物的属性描述,由属性向量表示。
例如:第 j j j个记录 x j \mathbf{x}_j xj的属性向量,表示如下
x j = ( x j ( 1 ) , x j ( 2 ) , ⋯ , x j ( i ) , ⋯ , x j ( n ) ) ⊤ , j = 1 , 2 , ⋯ , N i = 1 , 2 , ⋯ , n x j ∈ X \mathbf{x} _ { j } = \left( x _ { j } ^ { ( 1 ) } , x _ { j } ^ { ( 2 ) } , \cdots , x _ { j } ^ { ( i ) } , \cdots , x _ { j } ^ { ( n ) } \right) ^ { \top } , \quad j = 1,2 , \cdots , N \quad i=1,2,\cdots,n \quad\mathbf{x}_j\in\mathcal{X} xj=(xj(1),xj(2),⋯,xj(i),⋯,xj(n))⊤,j=1,2,⋯,Ni=1,2,⋯,nxj∈X
其中, x j ( i ) x_j^{\left(i\right)} xj(i)为第 j j j个记录的第 i i i个属性。(这里为啥要用 ⊤ \top ⊤转置是因为机器学习中默认向量为列向量,由于列向量太占空间,所以这里用行向量加 ⊤ \top ⊤转置表示列向量)
标记:描述事物某个特性或结果的事项。
标记值:标记上的取值。
标记空间(输出空间):标记的所有取值构成的集合,标记空间 Y \mathcal{Y} Y。
样例:拥有了对应标记的记录,由(记录,标记)对表示。第 j j j个样例
( x j , y j ) , j = 1 , 2 , … , N , x j ∈ X , y j ∈ Y 。 \left(\mathbf{x}_j,y_j\right),\quad j=1,2,\dots,N,\quad\mathbf{x}_j\in\mathcal{X},y_j\in\mathcal{Y}。 (xj,yj),j=1,2,…,N,xj∈X,yj∈Y。
数据集:
记录的集合(无监督学习数据集), D = { x 1 , x 2 , … , x N } D=\{\mathbf{x}_1,\mathbf{x}_2,\dots,\mathbf{x}_N\} D={x1,x2,…,xN};
样例的集合(有监督学习数据集), D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } D=\{\left(\mathbf{x}_1,y_1\right),\left(\mathbf{x}_2,y_2\right),\dots,\left(\mathbf{x}_N,y_N\right)\} D={(x1,y1),(x2,y2),…,(xN,yN)}。
有监督学习:
训练数据集:用以训练模型的数据集的子集, D t r a i n i n g ⊆ D D_{training} \subseteq D Dtraining⊆D。
验证数据集:用以选择模型的数据集的子集, D v e r i f i c a t i o n ⊆ D D_{verification}\subseteq D Dverification⊆D。
测试数据集:应用测试模型的数据集的子集, D t e s t i n g ⊆ D D_{testing} \subseteq D Dtesting⊆D。
有监督学习的目的在于学习一个从输入空间 X \mathcal{X} X到输出空间 Y \mathcal{Y} Y的映射 f f f,或是条件概率 P ( Y ∣ X ) P\left(Y|X\right) P(Y∣X)。
决策函数(非概率模型):从输入空间 X \mathcal{X} X到输出空间 Y \mathcal{Y} Y的映射 f : X → Y f:\mathcal{X}\to\mathcal{Y} f:X→Y。
假设空间 F \mathcal{F} F定义为决策函数的集合
F = { f ∣ Y = f ( X ) } \mathcal{F} = \left\{ f | Y = f \left( \mathbf{X} \right) \right\} F={f∣Y=f(X)}
其中, X \mathbf{X} X是定义在输入空间 X \mathcal{X} X上的变量, X ∈ X \mathbf{X}\in\mathcal{X} X∈X; Y Y Y是定义在输出空间 Y \mathcal{Y} Y上的变量, Y ∈ Y Y\in\mathcal{Y} Y∈Y。
假设空间 F \mathcal{F} F通常是由一个参数向量决定的函数族
F = { f ∣ Y = f w ( X ) , w ∈ R n } \mathcal{F} = \left\{ f | Y = f_{\mathbf{w}} \left( \mathbf{X} \right), \mathbf{w} \in \mathbb{R}^{n} \right\} F={f∣Y=fw(X),w∈Rn}
其中,参数向量 w = ( w ( 1 ) , ⋯ , w ( n ) ) ⊤ \mathbf{w}=\left(w^{\left(1\right)},\cdots,w^{\left(n\right)}\right)^\top w=(w(1),⋯,w(n))⊤取值于 n n n维向量空间 R n \mathbb{R}^{n} Rn,称为参数空间。
概率模型:假设空间 F \mathcal{F} F定义为条件概率的集合
F = { P ∣ P ( Y ∣ X ) } \mathcal{F} = \left\{ P | P \left( Y | \mathbf{X} \right) \right\} F={P∣P(Y∣X)}
其中, X \mathbf{X} X是定义在输入空间 X \mathcal{X} X上的随机变量, Y Y Y是定义在输出空间 Y \mathcal{Y} Y上的随机变量。
假设空间 F \mathcal{F} F通常是由一个参数向量决定的概率分布族
F = { P ∣ P w ( Y ∣ X ) , w ∈ R n } \mathcal{F} = \left\{ P | P_{\mathbf{w}} \left( Y | \mathbf{X} \right), \mathbf{w} \in \mathbb{R}^{n} \right\} F={P∣Pw(Y∣X),w∈Rn}
其中,参数向量 w \mathbf{w} w取值于 n n n维向量空间 R n \mathbb{R}^{n} Rn,称为参数空间。
损失函数:度量模型预测错误的程度,是模型的预测输出 f ( X ) f\left(\mathbf{X}\right) f(X)和实际输出 Y Y Y的非负实值函数,记作 L ( Y , f ( X ) ) L \left(Y, f \left( \mathbf{X} \right) \right) L(Y,f(X))。
0 − 1 0-1 0−1 损失函数表示如下
L ( Y , f ( X ) ) = { 1 , Y ≠ f ( X ) 0 , Y = f ( X ) = I ( Y ≠ f ( X ) ) \begin{aligned} L \left(Y, f \left( \mathbf{X} \right) \right) &= \left\{ \begin{aligned} \ & 1, \quad Y \neq f \left( \mathbf{X} \right) \\ & 0, \quad Y = f \left( \mathbf{X} \right) \end{aligned} \right. \\ &=I\left(Y \neq f \left( \mathbf{X}\right)\right)\end{aligned} L(Y,f(X))={ 1,Y=f(X)0,Y=f(X)=I(Y=f(X))
其中, I ( ⋅ ) I\left(\cdot\right) I(⋅)是指示函数,当括号中条件成立返回 1 1 1,否则返回 0 0 0。
L ( Y , f ( X ) ) = ( Y − f ( X ) ) 2 \begin{aligned} L \left(Y, f \left( \mathbf{X} \right) \right) = \left( Y - f \left( \mathbf{X} \right) \right)^{2} \end{aligned} L(Y,f(X))=(Y−f(X))2
L ( Y , f ( X ) ) = ∣ Y − f ( X ) ∣ \begin{aligned} L \left(Y, f \left( \mathbf{X} \right) \right) = \left| Y - f \left( \mathbf{X} \right) \right| \end{aligned} L(Y,f(X))=∣Y−f(X)∣
L ( Y , P ( Y ∣ X ) ) = − log P ( Y ∣ X ) \begin{aligned} L \left(Y, P \left( Y | \mathbf{X} \right) \right) = - \log P \left( Y | \mathbf{X} \right) \end{aligned} L(Y,P(Y∣X))=−logP(Y∣X)
经验风险(经验损失)是模型 f f f关于训练数据集 D D D
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x N , y N ) } \begin{aligned} \\& D = \left\{ \left( \mathbf{x}_{1}, y_{1} \right), \left( \mathbf{x}_{2}, y_{2} \right), \cdots, \left( \mathbf{x}_{N}, y_{N} \right) \right\} \end{aligned} D={(x1,y1),(x2,y2),⋯,(xN,yN)}
的平均损失
R e m p ( f ) = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) \begin{aligned} R_{emp} \left( f \right) = \dfrac{1}{N} \sum_{i=1}^{N} L \left(y_{i}, f \left( \mathbf{x}_{i} \right) \right) \end{aligned} Remp(f)=N1i=1∑NL(yi,f(xi))
学习目标:经验风险最小化
f ∗ = arg min f ∈ F R e m p ( f ) f^*=\mathop{\arg\min}\limits_{f\in\mathcal{F}} R_{emp}\left(f\right) f∗=f∈FargminRemp(f)
其中, F \mathcal{F} F是假设空间。
学习时选择的模型复杂,所包含的参数过多,以至于出现对已知数据预测得很好,但对未知数据预测得很差的现象。
学习时选择的模型简单,所包含的参数过少,以至于出现不能对数据预测很好的现象。
学习得到的模型对未知数据的预测能力。
在经验风险上增加表示模型复杂度的正则化项。
R s t r = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) + λ J ( f ) \begin{aligned} R_{str}= \dfrac{1}{N} \sum_{i=1}^{N} L \left(y_{i}, f \left( \mathbf{x}_{i} \right) \right) + \lambda J \left(f\right) \end{aligned} Rstr=N1i=1∑NL(yi,f(xi))+λJ(f)
其中, J ( f ) J \left(f\right) J(f)是模型复杂度,是正则化项,是定义在假设空间 F \mathcal{F} F上的泛函; λ ≥ 0 \lambda \geq 0 λ≥0是系数,用以权衡风险和模型复杂度。
学习目标:结构风险最小化
f ∗ = arg min f ∈ F R s t r ( f ) f^*=\mathop{\arg\min}_{f\in\mathcal{F}} R_{str}\left(f\right) f∗=argminf∈FRstr(f)
其中, F \mathcal{F} F是假设空间。
正则化项可以是参数向量的 L 2 L_{2} L2范数
J 2 = 1 2 ∥ w ∥ 2 2 = 1 2 ( ( w ( 1 ) ) 2 + ⋯ + ( w ( n ) ) 2 ) 2 = 1 2 ( ( w ( 1 ) ) 2 + ⋯ + ( w ( n ) ) 2 ) J_{2} = \frac{1}{2}\| \mathbf{w} \|_2^2=\frac{1}{2}\left(\sqrt{\left(w^{\left(1\right)}\right)^2+\cdots+\left(w^{\left(n\right)}\right)^2}\right)^2=\frac{1}{2}\left(\left(w^{\left(1\right)}\right)^2+\cdots+\left(w^{\left(n\right)}\right)^2\right) J2=21∥w∥22=21((w(1))2+⋯+(w(n))2)2=21((w(1))2+⋯+(w(n))2)
其中, ∥ w ∥ 2 \|\mathbf{w}\|_2 ∥w∥2表示参数向量 w \mathbf{w} w的 L 2 L_{2} L2范数。
正则化项可以是参数向量的 L 1 L_{1} L1范数
J 1 = ∥ w ∥ 1 = ∣ w ( 1 ) ∣ + ⋯ + ∣ w ( n ) ∣ J_{1} = \| \mathbf{w} \|_{1}=|w^{\left(1\right)}|+\cdots+|w^{\left(n\right)}| J1=∥w∥1=∣w(1)∣+⋯+∣w(n)∣
其中, ∥ w ∥ 1 \|\mathbf{w}\|_{1} ∥w∥1表示参数向量 w \mathbf{w} w的 L 1 L_{1} L1范数。
机器学习的训练过程就是使用训练数据集 D D D,按照模型策略在假设空间 F \mathcal{F} F中寻找最优模型 f ∗ f^* f∗的最优化求解过程
f ∗ = arg min f ∈ F R s t r ( f ) f^* = \mathop{\arg\min}_{f\in\mathcal{F}}R_{str}\left(f\right) f∗=argminf∈FRstr(f)或者在参数空间中寻找最优参数 w ∗ \mathbf{w}^* w∗的最优化求解过程
w ∗ = arg min f w ∈ F R s t r ( f w ) 。 \mathbf{w}^*=\mathop{\arg\min}_{f_{\mathbf{w}}\in\mathcal{F}}R_{str}\left(f_{\mathbf{w}}\right)。 w∗=argminfw∈FRstr(fw)。
梯度下降法:通过迭代的方法来计算训练集 D D D上的风险函数最小值
w t + 1 = w t − α ∂ R D ( w ) ∂ w = w t − α 1 N ∑ i = 1 N ∂ L ( y i , f w ( x i ) ) ∂ w \begin{aligned}\mathbf{w}_{t+1}&=\mathbf{w}_t-\alpha\frac{\partial R_D\left(\mathbf{w}\right)}{\partial\mathbf{w}} \\ &=\mathbf{w}_t-\alpha\frac{1}{N}\sum_{i=1}^N\frac{\partial L\left(y_i,f_{\mathbf{w}}\left(\mathbf{x}_i\right)\right) }{\partial\mathbf{w}} \end{aligned} wt+1=wt−α∂w∂RD(w)=wt−αN1i=1∑N∂w∂L(yi,fw(xi))
其中, w t \mathbf{w}_t wt为第 t t t次迭代的参数值, α \alpha α为学习率。
模型 Y = f ( X ) Y = f \left(X\right) Y=f(X)关于训练数据集的平均损失
R e m p ( f ) = 1 N ∑ i = 1 N L ( y i , f ( x i ) ) \begin{aligned} R_{emp} \left( f \right) = \dfrac{1}{N} \sum_{i=1}^{N} L \left(y_{i}, f \left( \mathbf{x}_{i} \right) \right) \end{aligned} Remp(f)=N1i=1∑NL(yi,f(xi))
其中, N N N是训练样本容量。
模型 Y = f ( X ) Y = f \left(X\right) Y=f(X)关于测试数据集的平均损失
e t e s t = 1 N ′ ∑ i = 1 N ′ L ( y i , f ( x i ) ) \begin{aligned} e_{test} = \dfrac{1}{N'} \sum_{i=1}^{N'} L \left(y_{i}, f \left( \mathbf{x}_{i} \right) \right) \end{aligned} etest=N′1i=1∑N′L(yi,f(xi))
其中, N ′ N' N′是测试样本容量。
当损失函数是 0 − 1 0-1 0−1损失,测试误差就是测试集上的误差率
e t e s t = 1 N ′ ∑ i = 1 N ’ I ( y i ≠ f ( x i ) ) \begin{aligned} e_{test} = \dfrac{1}{N'} \sum_{i=1}^{N’} I \left( y_{i} \neq f \left(\mathbf{x}_{i} \right) \right) \end{aligned} etest=N′1i=1∑N’I(yi=f(xi))
其中, I I I是指示函数,即 y ≠ f ( x ) y \neq f \left( \mathbf{x} \right) y=f(x)时为1,否则为0。
测试集上的准确率
r t e s t = 1 N ′ ∑ i = 1 N ’ I ( y i = f ( x i ) ) \begin{aligned} r_{test} = \dfrac{1}{N'} \sum_{i=1}^{N’} I \left( y_{i} = f \left(\mathbf{x}_{i} \right) \right) \end{aligned} rtest=N′1i=1∑N’I(yi=f(xi))
则, r t e s t + e t e s t = 1 r_{test} + e_{test} = 1 rtest+etest=1。
分类中,模型的预测结果可分为:
P = T P T P + F P \begin{aligned} P = \dfrac{TP}{TP+FP}\end{aligned} P=TP+FPTP
R = T P T P + F N \begin{aligned} R = \dfrac{TP}{TP+FN}\end{aligned} R=TP+FNTP
F 1 F_{1} F1值是精确率和召回率的调和均值
2 F 1 = 1 P + 1 R F 1 = 2 T P 2 T P + F P + F N \begin{aligned} \\ & \dfrac{2}{F_{1}} = \dfrac{1}{P} + \dfrac{1}{R} \\ & F_{1} = \dfrac{2TP}{2TP+FP+FN}\end{aligned} F12=P1+R1F1=2TP+FP+FN2TP
真正率
T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP
假正率
F P R = F P T N + F P FPR=\frac{FP}{TN+FP} FPR=TN+FPFP
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]