有监督学习的概念
- 有监督的学习的主要任务是根据数据对象的特征,预测其标签,相应的学习算法需要对经验学习
- 经验来自带标签的训练数据,训练数据是从数据对象集合中随机采样的数据,也称样本。
特征组(特征)
定义:特征组在有监督的学习任务中,每个数据对象的n个特征构成的向量x=(x1,x2,...,xn)∈,称该对象的特征组,也就是特征向量。设X ⊆ 是特征组的所有可能取值构成的集合,称X为样本空间。
标签
定义:在回归问题中,训练数据含有一个数值标签y ∈ R;在k元分类问题中,训练数据含有一个向量标签。设Y为全体可能的标签取值,称Y为标签空间。
分类问题:
模型
定义:设X为样本空间,Y为标签空间,ϕ为X − > Y 的映射集合,称ϕ为模型空间,任意的模型空间中的映射h ∈ ϕ,称为一个模型
有监督学习任务
定义:给定样本空间X,标签空间Y,未知的特征分布D与标签分布,有监督的学习任务是训练一个模型h,即计算从X到Y的一个映射,记作:
对任意的样本的特征向量x xx,由h ( x ) h(x)h(x)作为对x xx的标签的预测。
损失函数
定义:设X是样本空间,Y是标签空间,损失函数是一个从Y × Y到正实数R+的函数
:并要其满足如以下性质,对任意y ∈ Y,有
例如:0-1损失函数
测试数据与模型度量(测试误差)
作为模型h的效果的度量
当测试数据规模足够大时,经验损失能够良好近似期望损失。
一般来说 给定数据集(不清楚其分布D DD),首先将其以一定的比例随机分成测试集合和训练集合,这样两个集合都会满足其原集合的分布D DD,在训练集合上训练得出模型h hh,在测试集合上计算损失,作为模型h hh的效果度量
经验损失最小化算法架构(训练误差)
给定损失函数 l,以及给定一组数据
作为模型h的经验损失
无约束经验损失最小化算法架构:
特点:在训练数据S SS上的经验损失,无约束经验损失最小化算法,容易带来过度拟合问题
ps:无约束指的是空间(ϕ)无约束(所有符合要求的模型组成的模型空间)
过度拟合示例:
假定样本空间X=[-1,1],特征分布D是X上的均匀分布,标签空间Y=ℝ,标签分布Dx=N(x, 0.3)是期望为x且标准差是0.3的正态分布,损失函数是平方损失函数。
过度拟合:训练误差小,测试误差大!
·过拟合:训练误差小,测试误差大
·欠拟合:训练误差比较大
·泛化能力:训练误差小,测试误差小
我们致力于模型的泛化能力,防止拟合的方法:
1.引入模型假设(对标签分布或者模型结构做出恰当的假设,比如上面的例子,可以假设为线性模型)
2.正则化
3.dropout(用于深度神经网络)
4.扩大训练样本
经验损失最小化实例:墨渍分类
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的情况下,模型的表现最好,分类效果最接近真实分界线。
正则化算法
前言:
- 在经验损失最小化的过程中,合理的选择模型假设,是避免过度拟合的有效方法
- 尽管选取了模型假设,还是有可能发生过拟合,如何处理?正则化算法
正则化常用策略:
奥卡姆剃刀法则:如无必要,勿增实体
例如:每个n元线性函数
都可以用n+1个参数表示:
ps:我们追求的是复杂度低,所以就是向量维数少且值小