有监督学习的概念
![](https://i-blog.csdnimg.cn/blog_migrate/569ee932ac3d449ae32d98ad42b5a7c4.png)
- 有监督的学习的主要任务是根据数据对象的特征,预测其标签,相应的学习算法需要对经验学习
- 经验来自带标签的训练数据,训练数据是从数据对象集合中随机采样的数据,也称样本。
特征组(特征)
定义:特征组在有监督的学习任务中,每个数据对象的n个特征构成的向量 x = ( x 1 , x 2 , . . . , x n ) ∈ R n x=(x_{1},x_{2},...,x_{n})\in R^n x=(x1,x2,...,xn)∈Rn,称该对象的特征组,也就是特征向量。设 X ⊆ R n X\subseteq R^n X⊆Rn是特征组的所有可能取值构成的集合,称 X X X为样本空间。
标签
定义:在回归问题中,训练数据含有一个数值标签
y
∈
R
y \in R
y∈R;在
k
k
k元分类问题中,训练数据含有一个向量标签
y
∈
[
0
,
1
]
k
y\in[0,1]^k
y∈[0,1]k。设
Y
Y
Y为全体可能的标签取值,称
Y
Y
Y为标签空间。
分类问题:
例如:手写数字识别问题:
y
∈
[
0
,
1
]
10
y\in [0,1]^{10}
y∈[0,1]10
- 数字3的向量标签: y = ( 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) y=(0,0,0,1,0,0,0,0,0,0,0) y=(0,0,0,1,0,0,0,0,0,0,0)
- 数字3的标量标签: y = 3 , y ∈ Y , Y = { 0 , 1 , 2 , 3 , . . . , 9 } y=3,y\in Y,Y=\{0,1,2,3,...,9\} y=3,y∈Y,Y={0,1,2,3,...,9}
模型
定义:设 X X X为样本空间, Y Y Y为标签空间, ϕ \phi ϕ为 X − > Y X->Y X−>Y的映射集合,称 ϕ \phi ϕ为模型空间,任意的模型空间中的映射 h ∈ ϕ h\in \phi h∈ϕ,称为一个模型
有监督学习任务
定义:给定样本空间 X X X,标签空间 Y Y Y,未知的特征分布 D D D与标签分布 { D x : x ∈ X } \{D_{x}:x\in X\} {Dx:x∈X},有监督的学习任务是训练一个模型 h h h,即计算从 X X X到 Y Y Y的一个映射,记作: h : X − > Y h:X->Y h:X−>Y对任意的样本的特征向量 x x x,由 h ( x ) h(x) h(x)作为对 x x x的标签的预测。 y ^ = h ( x ) \hat{y}=h(x) y^=h(x)
损失函数
定义:设
X
X
X是样本空间,
Y
Y
Y是标签空间,损失函数是一个从
Y
×
Y
Y\times Y
Y×Y到正实数
R
+
R+
R+的函数
l
:
Y
×
Y
−
>
R
+
l:Y\times Y->R^+
l:Y×Y−>R+:并要其满足如以下性质,对任意
y
∈
Y
y\in Y
y∈Y,有
l
(
y
,
y
)
=
0
l(y,y)=0
l(y,y)=0例如:0-1损失函数
l
(
y
,
y
^
)
=
{
0
,
i
f
y
=
y
^
1
,
o
t
h
e
r
w
i
s
e
l(y,\hat{y})= \left\{\begin{aligned}0, if\ y=\hat{y}\\1,otherwise\end{aligned}\right.
l(y,y^)={0,if y=y^1,otherwise
其中:
y
^
=
h
(
x
)
,
x
∈
X
,
y
^
∈
Y
\hat{y}=h(x),x\in X,\hat{y}\in Y
y^=h(x),x∈X,y^∈Y(
y
y
y是样本的标签真实值,
y
^
\hat{y}
y^是对样本x的标签预测值)
例如:平方损失函数 l ( y , y ^ ) = ( y − y ^ ) 2 , y , y ^ ∈ R l(y,\hat{y})=(y-\hat{y})^2,y,\hat{y}\in R l(y,y^)=(y−y^)2,y,y^∈R
测试数据与模型度量(测试误差)
在有监督学习中,给定样本空间
X
X
X,标签空间
Y
Y
Y,未知的特征分布
D
D
D与标签分布
{
D
x
:
x
∈
X
}
,
\{D_x:x\in X\},
{Dx:x∈X},假设有监督学习算法输出的模型型为
h
h
h。给定一组数据
T
=
{
(
x
(
1
)
,
y
(
1
)
)
,
(
x
(
2
)
,
y
(
2
)
)
,
.
.
.
,
(
x
(
t
)
,
y
(
t
)
)
}
T=\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(t)},y^{(t)})\}
T={(x(1),y(1)),(x(2),y(2)),...,(x(t),y(t))}其中,
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
t
)
∼
D
,
x^{(1)},x^{(2)},...,x^{(t)}\thicksim D,
x(1),x(2),...,x(t)∼D,为
X
X
X中依据特征分布
D
D
D的独立采样,并且对任意
1
≤
i
≤
t
,
1\leq i\leq t,
1≤i≤t,有
y
(
i
)
∼
D
x
(
i
)
,
y^{(i)}\thicksim D_{x^{(i)}},
y(i)∼Dx(i),将
T
T
T是测试数据集,用模型
h
h
h在测试数据集
T
T
T上的平均损失
L
T
(
h
)
=
1
t
∑
i
=
1
t
l
(
h
(
x
(
i
)
,
y
(
i
)
)
)
L_T(h)=\frac{1}{t}\sum_{i=1}^{t}l(h(x^{(i)},y^{(i)}))
LT(h)=t1i=1∑tl(h(x(i),y(i)))作为模型
h
h
h的效果的度量
当测试数据规模足够大时,经验损失能够良好近似期望损失。
一般来说 给定数据集(不清楚其分布 D D D),首先将其以一定的比例随机分成测试集合和训练集合,这样两个集合都会满足其原集合的分布 D D D,在训练集合上训练得出模型 h h h,在测试集合上计算损失,作为模型 h h h的效果度量
经验损失最小化算法架构(训练误差)
给定损失函数
l
,
l,
l,以及给定一组数据
S
=
{
(
x
(
1
)
,
y
(
1
)
)
,
(
x
(
2
)
,
y
(
2
)
)
,
.
.
.
,
(
x
(
t
)
,
y
(
t
)
)
}
S=\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(t)},y^{(t)})\}
S={(x(1),y(1)),(x(2),y(2)),...,(x(t),y(t))}其中,
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
t
)
∼
D
,
x^{(1)},x^{(2)},...,x^{(t)}\thicksim D,
x(1),x(2),...,x(t)∼D,为
X
X
X中依据特征分布
D
D
D的独立采样,并且对任意
1
≤
i
≤
t
,
1\leq i\leq t,
1≤i≤t,有
y
(
i
)
∼
D
x
(
i
)
,
y^{(i)}\thicksim D_{x^{(i)}},
y(i)∼Dx(i),将
S
S
S是训练数据集,在训练数据集上训练得到的模型
h
h
h在训练数据
S
S
S上的平均损失
L
S
(
h
)
=
1
t
∑
i
=
1
t
l
(
h
(
x
(
i
)
,
y
(
i
)
)
)
L_S(h)=\frac{1}{t}\sum_{i=1}^{t}l(h(x^{(i)},y^{(i)}))
LS(h)=t1i=1∑tl(h(x(i),y(i)))作为模型
h
h
h的经验损失
无约束经验损失最小化算法架构:
给定样本空间
X
X
X,标签空间
Y
Y
Y,模型空间
Φ
\varPhi
Φ,
损失函数:
l
:
Y
×
Y
−
>
R
+
l:Y\times Y->R^+
l:Y×Y−>R+
输入:
m
m
m个训练数据
S
=
{
(
x
(
1
)
,
y
(
1
)
)
,
(
x
(
2
)
,
y
(
2
)
)
,
.
.
.
,
(
x
(
m
)
,
y
(
m
)
)
}
S=\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\}
S={(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}
输出模型:
h
s
=
arg min
h
∈
ϕ
L
s
(
h
)
h_{s}=\argmin_{h\in\phi}L_s(h)
hs=argminh∈ϕLs(h)
特点:
h
s
(
x
)
h_s(x)
hs(x)在训练数据
S
S
S上的经验损失
L
s
(
h
)
=
0
L_s(h)=0
Ls(h)=0,无约束经验损失最小化算法,容易带来过度拟合问题
ps:无约束指的是空间(
ϕ
\phi
ϕ)无约束(所有符合要求的模型组成的模型空间)
过度拟合示例:
假定样本空间X=[-1,1],特征分布D是X上的均匀分布,标签空间Y=ℝ,标签分布Dx=N(x, 0.3)是期望为x且标准差是0.3的正态分布,损失函数是平方损失函数。
![](https://i-blog.csdnimg.cn/blog_migrate/2c1b6c31fb1313604cea6bf603f0345d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e36091513567ebaaa982f0b7f8aa0c8d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b0233e5265379786e4bad4e105d29aab.png)
过度拟合:训练误差小,测试误差大!
- h s ( x ) h_s(x) hs(x)在训练数据 S S S上的经验损失 L S ( h ) L_S(h) LS(h)----训练误差
-
h
s
(
x
)
h_s(x)
hs(x)在测试数据
S
S
S上的经验损失
L
T
(
h
)
L_T(h)
LT(h)----测试误差
·过拟合:训练误差小,测试误差大
·欠拟合:训练误差比较大
·泛化能力:训练误差小,测试误差小
我们致力于模型的泛化能力,防止拟合的方法:
- 引入模型假设(对标签分布或者模型结构做出恰当的假设,比如上面的例子,可以假设为线性模型)
- 正则化( L 1 、 L 2 L_1、L_2 L1、L2正则化)
- d r o p o u t dropout dropout(用于深度神经网络)
- 扩大训练样本
经验损失最小化实例:墨渍分类
from sklearn.datasets._samples_generator import make_blobs
import pandas as pd
import matplotlib.pylab as plt
import numpy as np
from sklearn.model_selection import train_test_split
# 感知器算法
class Perception:
def __init__(self):
self.b = None
self.w = None
def fit(self, X, y):
m, n = X.shape
w = np.zeros((n, 1))
b = 0
done = False
while not done:
done = True
for i in range(m):
x = X[i].reshape(1, -1)
if y[i] * (x.dot(w) + b) <= 0:
w = w + y[i] * x.T
b = b + y[i]
done = False
self.w = w
self.b = b
def predict(self, x):
return np.sign(x.dot(self.w) + self.b)
# 构建数据集合
X, y = make_blobs(n_samples=100, centers=2, n_features=2, cluster_std=0.6, random_state=0)
y[y == 0] = -1
data = pd.DataFrame(X, columns=['x1', 'x2'])
data['y'] = y
# 根据题意:划分不同的test_size
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(12, 8))
axes = axes.ravel()
ax1 =fig.add_subplot(131)
ax1.plot(data['x1'][data['y'] == 1], data['x2'][data['y'] == 1], "bs", ms=3)
ax1.plot(data['x1'][data['y'] == -1], data['x2'][data['y'] == -1], "rs", ms=3)
ax1.set_title('Original Data')
for i, test_size in enumerate([0.5, 0.4, 0.3, 0.2], start=1):
print(i,test_size)
# 划分数据集(训练集,测试集)
X_train, X_test, y_train, y_test = train_test_split(data[['x1', 'x2']], data['y'], test_size=test_size)
# 训练模型
model = Perception()
model.fit(np.array(X_train), np.array(y_train))
w = model.w
b = model.b
# 作图
if i == 3:
i = i+2
ax = axes[i]
ax.plot(data['x1'][data['y'] == 1], data['x2'][data['y'] == 1], "bs", ms=3)
ax.plot(data['x1'][data['y'] == -1], data['x2'][data['y'] == -1], "rs", ms=3)
ax.set_title('Test Size: {:.1f}'.format(test_size))
x_0 = np.linspace(-1, 3.5, 200)
line = -w[0] / w[1] * x_0 - b / w[1]
ax.plot(x_0, line)
plt.subplots_adjust(hspace=0.3)
plt.show()
结论:
- 在所有的测试集比例下,感知机模型都表现出了较好的分类效果,成功将数据集分为了两个簇。
- 在测试集比例为0.2的情况下,模型的表现最好,分类效果最接近真实分界线。
正则化算法
前言:
- 在经验损失最小化的过程中,合理的选择模型假设,是避免过度拟合的有效方法
- 尽管选取了模型假设,还是有可能发生过拟合,如何处理?正则化算法
正则化常用策略:
- L 1 L_1 L1正则化
- L 2 L_2 L2正则化
奥卡姆剃刀法则:如无必要,勿增实体
例如:每个
n
n
n元线性函数
h
(
x
)
=
<
w
,
x
>
+
b
,
x
∈
R
n
h(x)=<w,x>+b,x\in R^n
h(x)=<w,x>+b,x∈Rn都可以用
n
+
1
n+1
n+1个参数表示:
w
=
(
w
1
,
w
2
,
.
.
.
,
w
n
)
和
b
w=(w_1,w_2,...,w_n)和b
w=(w1,w2,...,wn)和b用
h
w
h_w
hw表示由
w
=
(
w
1
,
w
2
,
.
.
.
,
w
n
)
w=(w_1,w_2,...,w_n)
w=(w1,w2,...,wn)这组参数表示的模型。
机器学习中,用参数
w
w
w的范数来量化模型
h
w
h_w
hw的复杂度
L
1
范数:
∣
w
∣
=
∣
w
1
∣
+
∣
w
2
∣
+
.
.
.
+
∣
w
n
∣
L_1范数: |w|=|w_1|+|w_2|+...+|w_n|
L1范数:∣w∣=∣w1∣+∣w2∣+...+∣wn∣
L
2
范数:
∣
∣
w
∣
∣
=
w
1
2
+
w
2
2
+
.
.
.
+
w
n
2
L_2范数:||w||=\sqrt{w_1^2+w_2^2+...+w_n^2}
L2范数:∣∣w∣∣=w12+w22+...+wn2
ps:我们追求的是 h w h_w hw复杂度低,所以就是 w w w向量维数少且值小
L 1 范数: ∣ w ∣ = ∣ w 1 ∣ + ∣ w 2 ∣ + . . . + ∣ w n ∣ L_1范数: |w|=|w_1|+|w_2|+...+|w_n| L1范数:∣w∣=∣w1∣+∣w2∣+...+∣wn∣
![](https://i-blog.csdnimg.cn/blog_migrate/d80824921b392c5fc734671bd06743e6.png)
- 每一个非零参数 w j w_j wj都带来大小 λ ∣ w j ∣ \lambda |w_j| λ∣wj∣的惩罚
- 算法的 L s L_s Ls的值接近时,选 L 1 L_1 L1范数较小的模型
L 2 范数: ∣ ∣ w ∣ ∣ = w 1 2 + w 2 2 + . . . + w n 2 L_2范数:||w||=\sqrt{w_1^2+w_2^2+...+w_n^2} L2范数:∣∣w∣∣=w12+w22+...+wn2
![](https://i-blog.csdnimg.cn/blog_migrate/cc337cd5055fd6fb19a3b9124da4e00e.png)
- 每一个非零参数 w j w_j wj都带来大小 λ w j 2 \lambda w_j^2 λwj2的惩罚