偏差和方差
- 偏差(bias):偏差衡量了模型的预测值与实际值之间的偏离关系。通常在深度学习中,我们每一次训练迭代出来的新模型,都会拿训练数据进行预测,偏差就反应在预测值与实际值匹配度上,比如通常在keras运行中看到的准确度为96%,则说明是低偏差;反之,如果准确度只有70%,则说明是高偏差。
- 方差(variance):方差描述的是训练数据在不同迭代阶段的训练模型中,预测值的变化波动情况(或称之为离散情况)。从数学角度看,可以理解为每个预测值与预测均值差的平方和的再求平均数。通常在深度学习训练中,初始阶段模型复杂度不高,为低方差;随着训练量加大,模型逐步拟合训练数据,复杂度开始变高,此时方差会逐渐变高。
鞍点
鞍点(Saddle point)在微分方程中,沿着某一方向是稳定的,另一条方向是不稳定的奇点,叫做鞍点。
梯度下降
Batch gradient descent:批梯度下降是指遍历全部数据集计算一次损失函数,计算梯度,更新梯度
stochastic gradient descent:随机梯度下降,数据集随机选取。
mini-batch gradient decent:将数据按批次更新参数,减少了随机性,计算量也小。
def SGD(x, y, theta, alpha, m, max_iteration):
"""
随机梯度下降法:stochastic_Gradient_Descent
:param x:train_data
:param y:train_label
:param theta:初始化权重
:param alpha:学习速率
:param m:
:param max_iteration:迭代次数
:return:
"""
data = list(range(4))
for i in range(0, max_iteration):
hypothesis = np.dot(x, theta)
loss = hypothesis - y # 损失函数
index = random.sample(data, 1)[0] # 从data列表中随机选取一个数
# 下降梯度
gradient = loss[index] * x[index]
# 求导之后得到theta
theta = theta - alpha * gradient
return theta
def miniBatch( eta,X,y, n_iter = 200):
w = np.zeros(1 + X.shape[1])
cost = []
net_input = np.dot(X, w_[1:]) + w_[0]
m,n = np.shape(X)
dataIndex = len(m) # 获取数据集行下标列表
for j in range(n_iter): # 迭代次数
for i in range(m): # 遍历行列表
# alpha在每次迭代的时候都会调整,这个缓和数据波动或者高频波动
# 虽然alpha会随着迭代次数不断减小,但永远不会减小到0,这是因为此项还存在一个常数项
# 这样做的原因是为了保证在多次迭代之后新数据仍然具有一定的影响
alpha = 4 / (1.0 + j + i) + 0.01
# 通过随机选取样本来更新回归系数,这种方法将减少周期性的波动
randIndex = int(random.uniform(0, len(m))) # 随机获取样本
output = net_input
errors = (y-output)
w[1:] += eta * errors * X[randIndex]
w[0] += eta * errors.sum()
# 这种方法随机从列表中选出一个值,然后从列表中删掉该值
del(X[randIndex])
cost = (errors ** 2).sum() / 2.0 # array.sum()对array的全部元素进行相加
return cost
交叉验证
K折交叉验证: KFold 将所有的样例划分为 k 个组,称为折叠 (fold) (如果 k = n, 这等价于 Leave One Out(留一) 策略),都具有相同的大小(如果可能)。预测函数学习时使用 k - 1 个折叠中的数据,最后一个剩下的折叠会用于测试。
K折重复多次: RepeatedKFold 重复 K-Fold n 次。当需要运行时可以使用它 KFold n 次,在每次重复中产生不同的分割。
留一交叉验证: LeaveOneOut (或 LOO) 是一个简单的交叉验证。每个学习集都是通过除了一个样本以外的所有样本创建的,测试集是被留下的样本。 因此,对于 n 个样本,我们有 n 个不同的训练集和 n 个不同的测试集。这种交叉验证程序不会浪费太多数据,因为只有一个样本是从训练集中删除掉的:
留P交叉验证: LeavePOut 与 LeaveOneOut 非常相似,因为它通过从整个集合中删除 p 个样本来创建所有可能的 训练/测试集。对于 n 个样本,这产生了 {n \choose p} 个 训练-测试 对。与 LeaveOneOut 和 KFold 不同,当 p > 1 时,测试集会重叠。
用户自定义数据集划分: ShuffleSplit 迭代器将会生成一个用户给定数量的独立的训练/测试数据划分。样例首先被打散然后划分为一对训练测试集合。
学习归一化
归一化:1)把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。
Min-Max Normalization:
x' = (x - X_min) / (X_max - X_min)
平均归一化:
x' = (x - μ) / (MaxValue - MinValue)
学习回归模型评价指标
MAE(平均绝对误差)
均方误差(MSE)
ROC曲线
逻辑回归里面,对于正负例的界定,通常会设一个阈值,大于阈值的为正类,小于阈值为负类。如果我们减小这个阀值,更多的样本会被识别为正类,提高正类的识别率,但同时也会使得更多的负类被错误识别为正类。为了直观表示这一现象,引入ROC。根据分类结果计算得到ROC空间中相应的点,连接这些点就形成ROC curve,横坐标为False Positive Rate(FPR假正率),纵坐标为True Positive Rate(TPR真正率)。