机器学习(二)梯度下降、归一化、交叉验证、模型评判

目录

  • 偏差和方差
    • 误差是偏差和方差而产生的,推导数学公式
    • 过拟合,欠拟合,分别对应bias和variance什么情况
  • 鞍点
    • 解决办法
  • 梯度下降
    • Batch与Mini-Batch,SGD梯度下降的区别
    • 根据样本大小选择哪个梯度下降(批量梯度下降,Mini-Batch)
    • SGD和Mini-Batch的代码
  • 交叉验证
  • 归一化
  • 回归模型评价指标

1.偏差和方差

  • 误差是偏差和方差而产生的,并且推导数学公式
    偏差:描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据。
    方差:描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散。
    机器学习(二)梯度下降、归一化、交叉验证、模型评判_第1张图片如图所示,偏置影响真实与预测值的远近,方差影响离散程度。
  • 过拟合(overfitting),欠拟合(underfitting)分别对应bias和什么情况
    • 过拟合,对于特征的学习过于好,w权值影响大。
    • 欠拟合,偏置影响大。

2.学习鞍点

定义:
     一个不是局部最小值的驻点(一阶导数为0的点)称为鞍点。数学含义是: 目标函数在此点上的梯度(一阶导数)值为 0, 但从改点出发的一个方向是函数的极大值点,而在另一个方向是函数的极小值点。
解决鞍点

  • 随机梯度下降,给梯度加噪音。

3.梯度下降

  • Batch与Mini-Batch,SGD梯度下降的区别

    • Batch(梯度下降):全部数据训练完后更新权值。
          优点:全局最优解;
          缺点:当样本数目很多时,训练过程会很慢。
    • SGD(随机梯度下降):每个训练数据训练完都更新权值。
          优点:训练速度快;
          缺点:准确度下降,并不是全局最优
    • Mini-Batch(批量随机梯度下降):训练的数据(1,n)之间,训练完更新权值。
          注意:克服了上面两个的缺点,继承了他们的优点
  • 根据样本大小选择哪个梯度下降(批量梯度下降,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为给定的数据容量。

注意:

  1. 在机器学习中数据分为训练集(train set),,验证数据(validation set,测试集(test set),训练集合验证集有标签,测试集是真的使用没有标签。
  2. 交叉验证就是集成学习使用的方法。

5.归一化

    归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为标量。 在多种计算中都经常用到这种方法。

  • max-min
        是对原始数据进行线性变换,使结果落到[0,1]区间。
    x ∗ = x − m i n m a x − m i n x^{*}=\frac{x-min}{max-min} x=maxminxmin
  • 标准化
        对原始数据的均值(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=1nfiyi
  • 均方误差(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=1n(fiyi)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=1n(yiyˉ)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=1n(fiyˉ)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=1n(fiyi)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=1SSTSSE

你可能感兴趣的:(机器学习)