機器學習---模型選擇

我們運用手裏有的數據,選擇機器學習方法,建造好了模型,除了評估指標外,我們還可以判斷模型的是否錯誤:

有兩種常見的錯誤類型:

  1. 欠擬合和過擬合
  • 欠擬合,模型過於簡單,擬合的不夠好,經常發生錯誤(高偏差)。
    相當於一個學生沒有認真學習,很多題都沒做對。
  • 過擬合,模型過於複雜。傾向於記住了訓練集數據(高方差),而不是學習數據的特點。
    相當於一個學生把所有書本背下來了,會學過的知識,新題就不會了。
  1. 模型複雜度圖表
    根據前面學的知識,我們把數據分爲訓練集和測試集兩部分,我們通過模型可以得出:訓練集的錯誤數量和測試集的錯誤數量。我們使用不同的模型把這些錯誤都標記出來,如下圖模型複雜度圖表所示:
    在這裏插入圖片描述
    從模型複雜度圖表上我們可以看出左側是一個欠擬合模型,具有較高的訓練誤差和測試誤差。右邊是過擬合模型,它具有較低的訓練誤差和較高的測試誤差。中間的模型剛剛好,它具有相對較低的訓練誤差和測試誤差。這就是我們應該選擇的模型。
    我們雖然通過模型複雜度圖表選擇了最佳模型,但是我們犯了一個致命錯誤,就是使用了測試集。除了最後一步,任何時候我們都不應該使用測試集。

  2. 交叉驗證
    爲了達到以上相同的效果並且不動用測試集,我們把訓練集再劃分,分爲:訓練集和交叉驗證集。測試集照樣不動它。
    我們更爲一般話的模型複雜度圖表爲:
    在這裏插入圖片描述
    我們力求在誤差和學習能力之間找到一個最佳位置。

  3. K-FOLD交叉驗證
    數據被分爲訓練集和測試集,那麼總是會有些對訓練模型有用的數據被浪費了,爲了充分利用數據,我們學習K-FOLD交叉驗證。
    把所有數據分成K份,
    每次留出一份作爲測試集,其餘數據作爲訓練集,
    這樣循環K次,求結果的平均值,最終得到模型。
    使用sklearn中實現

    from sklearn.model_selection import KFold
    kf = KFold(12,3,shuffle = True) #數據集和測試集大小,第三個參數是隨機化數據集
    
    for train_indices,test_indices in kf:
    	print train_indices,test_indices
    
  4. 學習曲線(判斷模型欠擬合過擬合的標準)
    前面四個知識點把是爲了獲得更好的模型對數據的準備,數據準備好了,就可以機器學習了,那麼我們如何得知這個模型是欠擬合還是過擬合呢?
    例:
    我們第一次取4個點,然後分爲訓練集和交叉驗證集,得到訓練集的錯誤數和驗證集的錯誤數。
    我們第二次取8個點,然後分爲訓練集和交叉驗證集,得到訓練集的錯誤數和驗證集的錯誤數。
    我們第三次取12個點,然後分爲訓練集和交叉驗證集,得到訓練集的錯誤數和驗證集的錯誤數。
    把點數作爲橫座標,錯誤數作爲縱座標,畫出曲線圖。

    黃色是驗證集的錯誤曲線,綠色是訓練集的錯誤曲線。
    第一幅圖是一次函數,第二幅圖是二次函數,第三幅圖是六次函數。
    特點:
    第一幅:欠擬合的黃綠曲線接近,但是錯誤點較高,意思是錯誤較多。
    第二幅:黃綠曲線接近,錯誤點較低。
    第三幅:過擬合的黃綠曲線相隔較遠,明顯的訓練集表現好,交叉驗證集表現很差,非常符合過擬合的特點。
    這些曲線叫學習曲線,可以用學習曲線來判斷欠擬合過擬合,並選出合適的模型。


機器學習過程:
首先使用數據訓練一推模型,(訓練集)
然後使用交叉驗證調蓄那最佳模型,(交叉驗證集)得到F1得分,
最後對F1得分較高的模型使用測試集測試模型是否很好。(測試集)
例:邏輯迴歸

模型 訓練集訓練後的曲線斜率和係數 交叉驗證後的F1得分
第一個邏輯回顧模型:一次模型 0.5
第二個邏輯回顧模型:二次模型 0.8
第三個邏輯回顧模型:三次模型 0.4
第四個邏輯回顧模型:四次模型 0.2

在這裏插入圖片描述
邏輯迴歸中F1得分最高的是0.8,所以我們會使用測試集來驗證二次函數的邏輯回顧模型是否很好。總體來看,這些算法參數是多項式的係數。我們先稱它爲超參數。
例:決策樹
我們決定決策樹的超參數是深度。意思是根據超參數的值調整模型,現在,我們的超參數是深度,我們就改變決策樹的深度值,形成各個模型。

模型 訓練集訓練後的曲線斜率和係數 交叉驗證後的F1得分
深度爲一的模型 0.4
深度爲二的模型 0.5
深度爲三的模型 0.9
深度爲四的模型 0.2

在這裏插入圖片描述
決策樹中F1得分最高的是0.9,所以我們會使用測試集來驗證深度爲2的決策樹模型是否很好。
邏輯迴歸和決策樹的超參數個數都是1,是否有超參數個數爲多個的情況呢?答案是有的。
例:支持向量機
超參數有:
內核:可以理解爲一次線性,多次多項式
γ\gamma參數:相當於調整曲線的斜率
如下圖所示:
在這裏插入圖片描述
此時超參數就是兩個了,我們訓練模型的時候就得組合起來看。如何組合?運用網格搜索法。

  1. 網格搜索
    對於存在多個超參數的模型,我們製作一個表格列出所有可能的組合,然後選擇最佳組合。
    對於上面的支持向量機來說:列是不同的γ\gamma值,行是不同的內核值。用訓練集訓練數據,用交叉驗證集求得F1得分,取最高得分,使用測試集判斷模型好壞。
    在這裏插入圖片描述
    在sklearn中實現網格搜索(更多數據處理部分可參照上幾篇博客)
    #導入 GridSearchCV
    from sklearn.model_selection import GridSearchCV
    
    #選擇參數,使用字典,鍵 (keys) 將是參數的名稱,值 (values) 將是每個參數可能值的列表
    parameters = {'kernel':['poly', 'rbf'],'C':[0.1, 1, 10]}
    
    #創建一個評分機制 (scorer),也就是F1得分
    from sklearn.metrics import make_scorer
    from sklearn.metrics import f1_score
    scorer = make_scorer(f1_score)
    
    #使用參數 (parameter) 和評分機制 (scorer) 創建一個 GridSearch 對象。
    # 使用此對象與數據保持一致 (fit the data)
    # Create the object.
    grid_obj = GridSearchCV(clf, parameters, scoring=scorer)
    # Fit the data
    grid_fit = grid_obj.fit(X, y)
    
    #獲得最佳估算器 (estimator)
    best_clf = grid_fit.best_estimator_
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章