目录
- 偏差和方差
- 误差是偏差和方差而产生的,推导数学公式
- 过拟合,欠拟合,分别对应bias和variance什么情况
- 鞍点
- 解决办法
- 梯度下降
- Batch与Mini-Batch,SGD梯度下降的区别
- 根据样本大小选择哪个梯度下降(批量梯度下降,Mini-Batch)
- SGD和Mini-Batch的代码
- 交叉验证
- 归一化
- 回归模型评价指标
1.偏差和方差
- 误差是偏差和方差而产生的,并且推导数学公式
偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据。
方差:描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散。
如图所示,偏置影响真实与预测值的远近,方差影响离散程度。
- 过拟合(overfitting),欠拟合(underfitting)分别对应bias和什么情况
- 过拟合,对于特征的学习过于好,w权值影响大。
- 欠拟合,偏置影响大。
2.学习鞍点
定义:
一个不是局部最小值的驻点(一阶导数为0的点)称为鞍点。数学含义是: 目标函数在此点上的梯度(一阶导数)值为 0, 但从改点出发的一个方向是函数的极大值点,而在另一个方向是函数的极小值点。
解决鞍点
- 随机梯度下降,给梯度加噪音。
3.梯度下降
-
Batch与Mini-Batch,SGD梯度下降的区别
- Batch(梯度下降):全部数据训练完后更新权值。
优点:全局最优解;
缺点:当样本数目很多时,训练过程会很慢。 - SGD(随机梯度下降):每个训练数据训练完都更新权值。
优点:训练速度快;
缺点:准确度下降,并不是全局最优 - Mini-Batch(批量随机梯度下降):训练的数据(1,n)之间,训练完更新权值。
注意:克服了上面两个的缺点,继承了他们的优点
- Batch(梯度下降):全部数据训练完后更新权值。
-
根据样本大小选择哪个梯度下降(批量梯度下降,Mini-Batch)
如果样本量比较小,采用批量梯度下降算法。如果样本太大,使用随机梯度下降算法。在一般情况下,采用小批量梯度下降算法。 -
SGD和Mini-Batch的代码
class GD():
def __init__(self,epochs=20000,lr=0.01,b=0,w=0):
"""
:param epochs: 迭代次数
:param lr: 学习率
:param b: 初始偏置
:param w: 初始权重
"""
self.epochs = epochs
self.lr = lr
self.b = b
self.w =w
def gradient_descent(self,x_data,y_data):
"""
梯度下降,计算w权值和b偏置
:return:
"""
# 计算总数据量
m = float(len(x_data))
for i in range(self.epochs):
b_grad = 0
k_grad = 0
# 计算梯度的总和再求平均
for j in range(len(x_data)):
b_grad += -(1 / m * (y_data[j] - self.b - self.w *x_data[j]))
k_grad += -(1 / m * (y_data[j] - self.b - self.w *x_data[j])) * x_data[j]
# 更新 b 和 k
self.b = self.b - (self.lr * b_grad)
self.w= self.w- (self.lr * k_grad)
return self.b,self.w
def stochastic_gradient_descent(self,x_data,y_data):
"""
随机梯度下降,每次都要更新权值,计算w权值和b偏置
:return:
"""
for i in range(self.epochs):
for j in range(len(x_data)):
b_grad = -(y_data[j] - self.b - self.w * x_data[j])
k_grad = -(y_data[j] - self.b - self.w * x_data[j]) * x_data[j]
# 更新 b 和 k
self.b = self.b - (self.lr * b_grad)
self.w = self.w - (self.lr * k_grad)
return self.b,self.w
def mini_batch_(self,x_data,y_data,mini_batch=10):
"""
把样本分成几份,每一个训练一份
:return:
"""
m = float(len(x_data))/mini_batch
for i in range(self.epochs):
for index in range(mini_batch):
b_grad = 0
k_grad = 0
# 计算梯度的总和再求平均
x_data = x_data[index*m:m*(index+1)]
y_data = y_data[index*m:m*(index+1)]
for j in range(len(x_data)):
b_grad += -(1 / m * (y_data[j] - self.b - self.w * x_data[j]))
k_grad += -(1 / m * (y_data[j] - self.b - self.w * x_data[j])) *\
x_data[j]
# 更新 b 和 k
self.b = self.b - (self.lr * b_grad)
self.w = self.w - (self.lr * k_grad)
return self.b,self.w
4.交叉验证(Cross-validation)
- 定义:
交叉验证主要用于建模中,例如回归建模中。在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,记录它们的平方加和。 - 交叉验证的基本思想
是把在某种意义下将原始数据进行分组,一部分做为训练集,另一部分做为验证集 ,首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型,以此来做为评价分类器的性能指标。 - 简单的交叉验证
例如随机的选择70%的数据作为测试,30%作为验证,重复几次,选择最好的模型。 - K折交叉验证
随机的将给定的数据切成K个互不相交且大小相同的子集,选择K-1个子集作为训练集,1个作为验证集。
重复K,选择损失函数最小的模型。
10折交叉验证(10-fold cross validation)
将数据集分成十份,轮流将其中9份做训练1份做验证。 - 留一验证
K折交叉验证的特殊情况,K=N,N为给定的数据容量。
注意:
- 在机器学习中数据分为训练集(train set),,验证数据(validation set,测试集(test set),训练集合验证集有标签,测试集是真的使用没有标签。
- 交叉验证就是集成学习使用的方法。
5.归一化
归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为标量。 在多种计算中都经常用到这种方法。
- max-min
是对原始数据进行线性变换,使结果落到[0,1]区间。
x ∗ = x − m i n m a x − m i n x^{*}=\frac{x-min}{max-min} x∗=max−minx−min - 标准化
对原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理后的数据满足标准正态分布,即均值为0,标准差为1。
x ∗ = x − μ σ x^{*}=\frac{x-\mu }{\sigma } x∗=σx−μ
注意:在测试数据时使用了归一化,在验证数据必须使用一样的方法即max和min相同。
6.回归模型评价指标
f i f_{i} fi预测值, y i y_{i} yi真实值, y ˉ \bar{y} yˉ真实值的平均
- MAE(平均绝对误差)
M A E = 1 n ∑ i = 1 n ∣ f i − y i ∣ MAE =\frac{1}{n}\sum_{i=1}^{n}\left | f_{i} -y_{i}\right | MAE=n1i=1∑n∣fi−yi∣ - 均方误差(MSE)
M S E = 1 n ∑ i = 1 n ( f i − y i ) 2 MSE=\frac{1}{n}\sum_{i=1}^{n}\left ( f_{i} -y_{i}\right )^2 MSE=n1i=1∑n(fi−yi)2 - 总平方和,真实和真实的平均
S S T = ∑ i = 1 n ( y i − y ˉ ) 2 SST=\sum_{i=1}^{n}\left ( y_{i}-\bar{y}\right )^2 SST=i=1∑n(yi−yˉ)2 - 回归平方和,预测和真实的平均
S S R = ∑ i = 1 n ( f i − y ˉ ) 2 SSR=\sum_{i=1}^{n}\left ( f_{i} -\bar{y}\right )^2 SSR=i=1∑n(fi−yˉ)2 - 残差平方和,真实和预测
S S E = ∑ i = 1 n ( f i − y i ) 2 SSE=\sum_{i=1}^{n}\left ( f_{i} -y_{i}\right )^2 SSE=i=1∑n(fi−yi)2 - SST、SSR、SSE三者的关系
SST=SSR+SSE
决定系数:可以用于描述非线性或者两个及以上变量的相关关系,可以用来评价模型的好坏。
决定系数 R 2 = S S R S S T = 1 − S S E S S T R^2=\frac{SSR}{SST}=1-\frac{SSE}{SST} R2=SSTSSR=1−SSTSSE