機器學習(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(θ)=θ1x1+θ2x2+θ3x3+...+θnxn+b h(\theta) = \theta_1x_1 + \theta_2x_2 + \theta_3x_3 + ... + \theta_nx_n + b
    • θ: 模型係數
    • b: 模型偏置
  • 機器學習(模型訓練)的過程:
    • 把訓練集的數據, 帶入到通用公式中, 求解θ和b的過程
  • 預測過程:
    • 把預測的特徵值, 帶入通用公式, 結果就是預測的目標值
  • 按照自變量個數分類:
    • 一個自變量: 單變量回歸
  • 多個自變量: 多元迴歸
  • 線性迴歸模型與目標關係:
    • 線性關係; 一次方程
    • 非線性關係: 多次方程, 方程中有2次項,3次項或以上.

2.2 api初步簡介

  • API: sklearn.linear_mode.LinearRegression()
    • 方法:
      • fit(x, y)
      • predict(x)
    • 屬性:
      • 模型係數: coef_

2.4 線性迴歸的損失和優化[***]

  1. 線性迴歸的損失:

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

    • 求解 最小二乘法損失最小值
    • 兩種方式:
      • 正規方程: 通過正規方程的公式, 直接求解
      • 梯度下降: 隨意初始化模型係數(θ)和偏置(b), 使用梯度下降方法, 一步一步求解最優模型係數(θ)和偏置(b),
  3. 正規方程:

    • 缺點:
      1. 計算量大
      2. 有些時候無法求解.
  4. 梯度下降

    • 梯度:
      • 單變量函數: 函數的斜率
      • 多變量函數: 偏導數, 帶入對應的點.
      • 關鍵點:
    • 梯度下降公式: θi=θiαJ(θ)θi \theta_i = 上一次\theta_i - \alpha\frac{J(\theta)}{\theta_i}
      - α: 學習率(步長))
      - 太小就需要很多步
      - 太大就會錯失最優解
      - 梯度乘以負號的原因: 梯度是上升最快方向, 我們求解最下值, 要找下降最快的方向, 所以要加負號.
  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')
      
發佈了112 篇原創文章 · 獲贊 316 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章