1. 程式人生 > 實用技巧 >模型選擇與調優

模型選擇與調優

1、為什麼需要交叉驗證

交叉驗證目的:為了讓被評估的模型更加準確可信

2、什麼是交叉驗證(cross validation)

交叉驗證:將拿到的訓練資料,分為訓練和驗證集。以下圖為例:將資料分成5份,其中一份作為驗證集。然後經過5次(組)的測試,每次都更換不同的驗證集。即得到5組模型的結果,取平均值作為最終結果。又稱5折交叉驗證。

2.1 分析

我們之前知道資料分為訓練集和測試集,但是為了讓從訓練得到模型結果更加準確。做以下處理

  • 訓練集:訓練集+驗證集
  • 測試集:測試集

問題:那麼這個只是對於引數得出更好的結果,那麼怎麼選擇或者調優引數呢?

通常情況下,有很多引數是需要手動指定的(如k-近鄰演算法中的K值),這種叫超引數。但是手動過程繁雜,所以需要對模型預設幾種超引數組合。每組超引數都採用交叉驗證來進行評估。最後選出最優引數組合建立模型。

3.1 模型選擇與調優

  • sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
    • 對估計器的指定引數值進行詳盡搜尋
    • estimator:估計器物件
    • param_grid:估計器引數(dict){“n_neighbors”:[1,3,5]}
    • cv:指定幾折交叉驗證
    • fit:輸入訓練資料
    • score:準確率
    • 結果分析:
      • bestscore:在交叉驗證中驗證的最好結果_
      • bestestimator:最好的引數模型
      • cvresults:每次交叉驗證後的驗證集準確率結果和訓練集準確率結果

4、Facebook簽到位置預測K值調優

  • 使用網格搜尋估計器
# 使用網格搜尋和交叉驗證找到合適的引數
knn = KNeighborsClassifier()

param = {"n_neighbors": [3, 5, 10]}

gc = GridSearchCV(knn, param_grid=param, cv=2)

gc.fit(x_train, y_train)

print("選擇了某個模型測試集當中預測的準確率為:", gc.score(x_test, y_test))

# 訓練驗證集的結果
print("在交叉驗證當中驗證的最好結果:", gc.best_score_)
print("gc選擇了的模型K值是:", gc.best_estimator_)
print("每次交叉驗證的結果為:", gc.cv_results_)