我們運用手裏有的數據,選擇機器學習方法,建造好了模型,除了評估指標外,我們還可以判斷模型的是否錯誤:
有兩種常見的錯誤類型:
- 欠擬合和過擬合
- 欠擬合,模型過於簡單,擬合的不夠好,經常發生錯誤(高偏差)。
相當於一個學生沒有認真學習,很多題都沒做對。 - 過擬合,模型過於複雜。傾向於記住了訓練集數據(高方差),而不是學習數據的特點。
相當於一個學生把所有書本背下來了,會學過的知識,新題就不會了。
-
模型複雜度圖表
根據前面學的知識,我們把數據分爲訓練集和測試集兩部分,我們通過模型可以得出:訓練集的錯誤數量和測試集的錯誤數量。我們使用不同的模型把這些錯誤都標記出來,如下圖模型複雜度圖表所示:
從模型複雜度圖表上我們可以看出左側是一個欠擬合模型,具有較高的訓練誤差和測試誤差。右邊是過擬合模型,它具有較低的訓練誤差和較高的測試誤差。中間的模型剛剛好,它具有相對較低的訓練誤差和測試誤差。這就是我們應該選擇的模型。
我們雖然通過模型複雜度圖表選擇了最佳模型,但是我們犯了一個致命錯誤,就是使用了測試集。除了最後一步,任何時候我們都不應該使用測試集。 -
交叉驗證
爲了達到以上相同的效果並且不動用測試集,我們把訓練集再劃分,分爲:訓練集和交叉驗證集。測試集照樣不動它。
我們更爲一般話的模型複雜度圖表爲:
我們力求在誤差和學習能力之間找到一個最佳位置。 -
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個點,然後分爲訓練集和交叉驗證集,得到訓練集的錯誤數和驗證集的錯誤數。
我們第二次取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,是否有超參數個數爲多個的情況呢?答案是有的。
例:支持向量機
超參數有:
內核:可以理解爲一次線性,多次多項式
參數:相當於調整曲線的斜率
如下圖所示:
此時超參數就是兩個了,我們訓練模型的時候就得組合起來看。如何組合?運用網格搜索法。
- 網格搜索
對於存在多個超參數的模型,我們製作一個表格列出所有可能的組合,然後選擇最佳組合。
對於上面的支持向量機來說:列是不同的值,行是不同的內核值。用訓練集訓練數據,用交叉驗證集求得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_