机器学习(7)- 线性回归

1.11 交叉验证,网格搜索[****]

  • 交叉验证

    • 目的: 为了提高模型训练结果可信度, 可以提高模型的范化能力.
    • 步骤:
      • 把数据集划分为 训练集 和 测试集
      • 把训练集划分为 训练集 和 验证集
      • 什么是n交叉验证:
        • 把训练集分成n等份, 每轮选择其中一份做验证集, 其他作为训练集, 训练n轮.
        • 一般n选择为10.
  • 网格搜索

    • 作用: 模型选择参数调优, 选择出来比较好的超参数.
    • 超参数: 在进行模型训练的时候, 需要手动指定的参数. 举例: KNN中的k值就是超参数
  • 网格搜索与交叉验证

    • API: sklearn.model_selection.GridSearchCV(estimator, param_grid, cv)
    • 参数
      • estimtor: 需要进行参数调优的评估器
      • param_grid, 字典格式超参数列表
      • cv: 几折交叉验证
    • 方法
      • fit
      • predict
      • score
    • 交叉验证相关的属性
      • best_score_: 交叉验证最好的准确率
      • best_estimator: 交叉验证最好的模型
      • cv_results_: 交叉验证的结果.

1.11 案例:facebook位置预测[***]

  • 步骤:

    1. 加载数据
    2. 数据基本处理
      1. 减少数据规模, 为了演示方便(实际中不要这么做)
      2. 选择有效的时间特征, 把单位为秒的时间戳, 该为天, 星期, 小时
      3. 去掉签到比较少的地方
      4. 确定特征值和目标值
      5. 分割数据集
    3. 特征工程-特征预处理-标准化
    4. 机器学习(KNN+GridSearchCV)
    5. 模型评估
    # 2. 数据基本处理
    #   2.1 缩小数据规模(只是为了演示方便, 实际中不要这个做)
    facebook_data = data.query('x>2.0&x<2.5&y>2.0&y<2.5')
    # facebook_data
    #  2.2 选择有效的时间特征
    date_time = pd.to_datetime(facebook_data['time'], unit='s')
    date = pd.DatetimeIndex(date_time)
    facebook_data['day'] = date.day
    facebook_data['weekday'] = date.weekday
    facebook_data['hour'] = date.hour
    # facebook_data
    # 2.3 去掉签到比较少的地方
    place_id_counts = facebook_data.groupby('place_id').count()
    place_id = place_id_counts.query('row_id>5')
    # facebook_data 中筛选place_id里面的地方
    facebook = facebook_data[facebook_data['place_id'].isin(place_id.index)]
    #   2.4 确定特征值和目标
    x = facebook[['x','y','accuracy','day','weekday', 'hour']]
    y = facebook['place_id']
    #   2.5 分割数据集
    
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=8)
    

2.线性回归

2.1 线程回归简介

  • 定义: 使用回归方程对一个自变量或多自变量(特征) 和 因变量(目标值) 建模一种方式.
  • 通用公式: h ( θ ) = θ 1 x 1 + θ 2 x 2 + θ 3 x 3 + . . . + θ n x n + b h(\theta) = \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + ... + \theta_nx_n + b h(θ)=θ1x1+θ2x2+θ3x3+...+θnxn+b
    • θ: 模型系数
    • b: 模型偏置
  • 机器学习(模型训练)的过程:
    • 把训练集的数据, 带入到通用公式中, 求解θ和b的过程
  • 预测过程:
    • 把预测的特征值, 带入通用公式, 结果就是预测的目标值
  • 按照自变量个数分类:
    • 一个自变量: 单变量回归
  • 多个自变量: 多元回归
  • 线性回归模型与目标关系:
    • 线性关系; 一次方程
    • 非线性关系: 多次方程, 方程中有2次项,3次项或以上.

2.2 api初步简介

  • API: sklearn.linear_mode.LinearRegression()
    • 方法:
      • fit(x, y)
      • predict(x)
    • 属性:
      • 模型系数: coef_

2.4 线性回归的损失和优化[***]

  1. 线性回归的损失:

    • 最小二乘法: J ( θ ) = ( h θ ( x 1 ) − y 1 ) 2 + ( h θ ( x 2 ) − y 2 ) 2 + . . . + ( h θ ( x n ) − y n ) 2 J(\theta) = (h_\theta(x_1) - y_1)^2 + (h_\theta(x_2) - y_2)^2 + ... + (h_\theta(x_n) - y_n)^2 J(θ)=(hθ(x1)y1)2+(hθ(x2)y2)2+...+(hθ(xn)yn)2
  2. 优化:

    • 求解 最小二乘法损失最小值
    • 两种方式:
      • 正规方程: 通过正规方程的公式, 直接求解
      • 梯度下降: 随意初始化模型系数(θ)和偏置(b), 使用梯度下降方法, 一步一步求解最优模型系数(θ)和偏置(b),
  3. 正规方程:

    • 缺点:
      1. 计算量大
      2. 有些时候无法求解.
  4. 梯度下降

    • 梯度:
      • 单变量函数: 函数的斜率
      • 多变量函数: 偏导数, 带入对应的点.
      • 关键点:
    • 梯度下降公式: θ i = 上 一 次 θ i − α J ( θ ) θ i \theta_i = 上一次\theta_i - \alpha\frac{J(\theta)}{\theta_i} θi=θiαθiJ(θ)
      - α: 学习率(步长))
      - 太小就需要很多步
      - 太大就会错失最优解
      - 梯度乘以负号的原因: 梯度是上升最快方向, 我们求解最下值, 要找下降最快的方向, 所以要加负号.
  5. 梯度下降与正规方程对比

    • 梯度下降 正规方程
    • 需要选择学习率 不需要
    • 需要迭代求解 一次运算得出
    • 特征数量较大可以使用 需要计算方程,时间复杂度高O(n3)
  6. 选择:

    • 小规模数据:
      • 正规方程: LinearRegression
      • 改进: 岭回归(Ridge)
    • 大规模数据:
      • 梯度下降: SGDRegressor

2.5 梯度下降法介绍 [*]

  • 全梯度下降算法(FG)

    • 每次梯度下降的时候, 都使用所有训练样本数据
  • 随机梯度下降算法(SG)

    • 每次梯度下降的时候, 随机选择一个样本数据
  • 小批量梯度下降算法(mini-bantch)

    • 每次梯度下降的时候, 随机选择一小批训练样本, 然后对这一小批的样本使用全梯度下降算法
  • 随机平均梯度下降算法(SAG)

  • 会记录每次梯度, 每次梯度下降的时候, 随机选择一个样本, 计算梯度, 带入的梯度下降公式时候, 使用是前面所有梯度平均值.

  • 总结:

    (1**)FG方法由于它每轮更新都要使用全体数据集,故花费的时间成本最多,内存存储最大。**

    (2)SAG在训练初期表现不佳,优化速度较慢。这是因为我们常将初始梯度设为0,而SAG每轮梯度更新都结合了上一轮梯度值。

    (3)综合考虑迭代次数和运行时间,SG表现性能都很好,能在训练初期快速摆脱初始梯度值,快速将平均损失函数降到很低。但要注意,在使用SG方法时要慎重选择步长,否则容易错过最优解。

    (4)mini-batch结合了SG的“胆大”和FG的“心细”,从6幅图像来看,它的表现也正好居于SG和FG二者之间。在目前的机器学习领域,mini-batch是使用最多的梯度下降算法,正是因为它避开了FG运算效率低成本大和SG收敛效果不稳定的缺点。

2.6 案例–正规方程[**]

  • 正规化API:
    • sklearn.linear_model.LinearRegression(fit_intercept=True)
  • 参数:
    • fit_intercept: 是否计算偏置
  • 属性:
    • coef_: 模型系数
    • intercept_: 模型偏置
  • 回归模型评估:
    • sklearn.metric.mean_squared_error(y_true, y_pred)
      • 计算均方误差: 预测值-真实值的平方和除以样本数量
      • y_true: 真实目标值
      • y_pred: 预测目标值. .

2.7 案例 – 梯度下降法[***]

  • 梯度下降API:
    • API:

      • sklearn.linear_model.SGDRegressor(loss=“squared_loss”, fit_intercept=True, learning_rate =‘invscaling’, eta0=0.01)
    • 参数:

      • learning_rate: 学习率, 默认invscaling, 每次迭代的时候, 学习率是递减
      • eta0: 初始学习率
    • 属性:

      • 模型系数: coef_
      • 模型偏置: intercept_

2.8 欠拟合,过拟合[****]

  • 欠拟合:

    • 概念: 模型在训练集上表现的不好, 在测试集表现也不好
    • 原因: 模型太简单了, 学到特征太少了
    • 解决:
      1. 增添其他的特征项
      2. 添加多次项
  • 过拟合

    • 概念: 模型在训练集上表现的很好, 但是在测试集上表现不好
    • 原因: 模型太复杂了, 学到特征特多了(不使用通用规律的特征也被学到了)
    • 解决:
      1. 清洗数据: 把嘈杂特征清洗掉, 让数据更纯.
      2. 增加训练集
      3. 正则化
      4. 特征降维(减少特征的个数)
  • 正则化:

    • 正规化是用于解决什么问题的?

      • 解决模型过拟合的问题.
    • L2正则化:

      • 作用: 让一些特征的模型系数很小, 从而削弱这些特征的影响
      • 说明: 模型系数越小模型就越简单, 模型越简单, 就越不容易过拟合
    • L1正则化

      • 作用: 让一些特征的模型系数直接为0, 就相当于删除这个特征.
  • 维灾难[了解]:

    • 随着维度的增加,分类器性能逐步上升,到达某点之后,其性能便逐渐下降

2.9 正则化与线性模型

  • 岭回归(L2正则化):

    • 就是在损失函数上添加了L2正则化项
    • L2正则化项: 模型系数的平方和
  • Lasso回归(L1正则化):

    • 就是在损失函数上添加了L1正则化项
    • L1正则化项: 模型系数的绝对值的和
  • Elastic Net 弹性网络

    • 正则化项: 是结合岭回归和Lasso回归
  • Early Stopping

    • 当损失带到一个可以接受范围, 就可以停止训练.

2.10 岭回归[***]

  • API:

    • sklearn.linear_model.Ridge(alpha=1)
  • 参数:

    • alpha: 正则化力度
  • 正则化力度与系数之间的关系:

    1. 正则化力度越大, 模型系数就越小
    2. 正则化力度越小, 模型系数就越大
  • 岭回归与线性回归的区别:

    1. 岭回归也是一种线性回归
    2. 岭回归使用L2正则化 和 随机平均梯度下降法
    • 总结: 岭回归是一种使用L2正则化和随机平均梯度下降法的线性回归
  • SGDRegressor:

    • 随机梯度下降下降法
  • Ridge

    • L2正则化
    • 随机平均梯度下降法.

2.11 模型保存和加载

  • 所在模块: sklearn.externals.joblib

    • API:
      • 保存模型: joblib.dump(模型, ‘路径’)
      • 加载模型: joblib.load(‘路径’)
      • 注意: 文件后缀名是pkl.
  • 学习目标反馈

    • 知道交叉验证实现过程

      • 把数据集划分为 训练集 和 测试集
      • 把训练集划分为 训练集 和 验证集
      • n折交叉验证:
        • 把训练集为n等份,
        • 每次都选择一份做验证集 其他 做训练集
        • 使用训练集训练模型, 使用验证集评估评估
        • 重复上面两个步骤, 重复n-1次.
    • 知道超参数搜索过程

      • 给超参数, 指定为若干备选值
      • 使用交叉验证的方式, 尝试这些被选超参数
      • 最后从中选择一个最好超参数.
    • 应用GridSearchCV实现算法参数的调优

      # 4. 机器学习(模型训练)
      #    4.1 创建KNN评估器
      estimator = KNeighborsClassifier()
      
      #    4.2 创建网格搜索与交叉验证的评估器
      param_grid = {'n_neighbors': [3, 5, 7, 9]}
      estimator = GridSearchCV(estimator, param_grid=param_grid, cv=5)
      
    • 掌握线性回归的实现过程

      • 准备线性回归通用公式
      • 把训练集带入通用公式中, 求解模型系数与偏置
      • 带入未知数据的样本到通用公式中, 进行预测
    • 应用LinearRegression或SGDRegressor实现回归预测

      # 4. 机器学习(正规方程)
      estimator = LinearRegression()
      estimator.fit(x_train, y_train)
      
      # 4. 机器学习(随机梯度下载)
      estimator = SGDRegressor()
      estimator.fit(x_train, y_train)
      
    • 知道回归算法的评估标准及其公式

      • 均方损失: 预测值-真实值的平方和再除以样本数量
      • 平均绝对损失 预测值-真实值的绝对值的和再除以样本数量
    • 知道过拟合与欠拟合的原因以及解决方法

      • 过拟合
        • 表现; 在训练集表现很好, 但是在测试集上表现的不好
        • 原因: 模型太复杂了, 学到特征太多了
        • 解决:
          • 清洗数据, 让数据变更纯, 去掉噪声数据
          • 增加样本数量
          • 正则化
          • 特征降维, 减少特征维度(个数)
      • 欠拟合
        • 表现: 在训练集 上表现不好, 在测试集上表现页不好
        • 原因: 模型太简单了, 学到特征太少了
        • 解决:
          • 添加其他的特征项
          • 添加多次项.
    • 知道岭回归的原理及与线性回归的不同之处

      • 岭回归; 在线性回归损失函数上添加一个L2的正则化项, L2正则化项; 系数的平方和
      • 线性回归的不同之处:
        • 使用L2的正则化
        • 使用随机平均梯度下降
    • 应用Ridge实现回归预测

      # 4. 机器学习(岭回归: L2正则化项 + 随机平均梯度下降)
      estimator = Ridge()
      estimator.fit(x_train, y_train)
      
    • 应用joblib实现模型的保存与加载

      
      # 4. 机器学习(岭回归: L2正则化项 + 随机平均梯度下降)
      # estimator = Ridge()
      # estimator.fit(x_train, y_train)
      
      # 保存训练好的模型
      # joblib.dump(estimator, 'test.pkl')
      
      estimator = joblib.load('test.pkl')
      

你可能感兴趣的:(AI)