天天看點

Machine Learning——模型的選擇與調優一、如何選擇合适的算法模型二、交叉驗證三、網格搜尋(超參數搜尋)

一、如何選擇合适的算法模型

在解決問題的時候,必須考慮下面兩個問題:一、使用機器學習算法的目的,想要算法完成何種任務,比如是預測明天下雨的機率還是對投票者按照興趣分組;二、需要分析或者收集的資料是什麼。

首先考慮使用機器學習算法的目的。如果想要預測目标變量的值,則可以選擇監督學習算法,否則可以選擇無監督學習算法,确定選擇監督學習算法之後,需要進一步确定目标變量類型,如果目标變量是離散型,如是/否、1/2/3,A/B/C/或者紅/黑/黃等,則可以選擇分類算法;如果目标變量是連續的數值,如0.0~100.0、-999~999等,則需要選擇回歸算法。

如果不想預測目标變量的值,則可以選擇無監督算法。進一步分析是否需要将資料劃分為離散的組。如果這是唯一的需求,則使用聚類算法。

當然在大多數情況下,上面給出的選擇辦法都能幫助讀者選擇恰當的機器學習算法,但這也并非一成不變。也有分類算法可以用于回歸。

其次考慮的是資料問題,我們應該充分了解資料,對實際資料了解的越充分,越容易建立符合實際需求的應用程式,主要應該了解資料的以下特性:

(1)特征值是 離散型變量 還是 連續型變量 ,(2)特征值中是否存在缺失的值,(3)何種原因造成缺失值,(4)資料中是否存在異常值,(5)某個特征發生的頻率如何,等等。充分了解上面提到的這些資料特性可以縮短選擇機器學習算法的時間。

二、交叉驗證

目的:為了讓被評估的模型更加準确可信

1、交叉驗證過程

操作:将所有的資料分成n等份,将拿到的資料,分為訓練和驗證集。

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

Machine Learning——模型的選擇與調優一、如何選擇合适的算法模型二、交叉驗證三、網格搜尋(超參數搜尋)

(1)具體過程(以4折交叉驗證為例)

做法:對多次得到的準确率取平均值(模型)
Machine Learning——模型的選擇與調優一、如何選擇合适的算法模型二、交叉驗證三、網格搜尋(超參數搜尋)

三、網格搜尋(超參數搜尋)

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

作用:用來調整超參數,比如K-近鄰:超參數K
  • 注:一般情況下,最常用的是10折交叉驗證
Machine Learning——模型的選擇與調優一、如何選擇合适的算法模型二、交叉驗證三、網格搜尋(超參數搜尋)

注:出現多個超參數時,一般就是做法就是:組合,比如兩個K值時,一般都是兩個超參數可選值兩兩結合

1、操作API

超參數搜尋-網格搜尋API:sklearn.model_selection.GridSearchCV

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)---->對估計器的指定參數值進行詳盡搜尋

作用:組合(包裝)驗證,相當于——>
#fit、predict、score
knn.fit(x_train, y_train)
#得出預測結果
y_predict = knn.predict(x_test)
print("預測的目标簽到位置為:", y_predict)
#得出準确率
print("預測的準确率:", knn.score(x_test, y_test))
           
參數介紹:
  • estimator:估計器對象
  • param_grid:估計器參數(dict)----{“n_neighbors”:[1,3,5]}
  • cv:指定幾折交叉驗證
  • fit:輸入訓練資料
  • score:準确率
結果分析:
  • best_score:在交叉驗證中測試的最好結果
  • best_estimator:最好的參數模型
  • cv_results_:每次交叉驗證後的驗證集準确率結果和訓練集準确率結果

2、鸢尾花案例操作

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split,GridSearchCV

def knn():
  iris = load_iris()
  x = iris.data  #鸢尾花特征值
  y = iris.target  # 鸢尾花目标值
  x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.25)

  # 進行算法流程
  knn = KNeighborsClassifier()

  # 構造一些參數的值進行搜素(超參數)
  param = {"n_neighbors":[3,5,10]}

  # 進行網格搜尋
  gc = GridSearchCV(knn,param,cv=5)
  gc.fit(x_train,y_train)

  #預測準确率
  print("在測試集上準确率為:",gc.score(x_test,y_test))
  print("在交叉驗證中測試的最好結果:",gc.best_score_)
  print("最好的參數模型:",gc.best_estimator_)
  print("每次交叉驗證後的驗證集準确率結果和訓練集準确率結果:")
  print(gc.cv_results_)

if __name__ == '__main__':
    knn()
           
Machine Learning——模型的選擇與調優一、如何選擇合适的算法模型二、交叉驗證三、網格搜尋(超參數搜尋)

繼續閱讀