過擬合與欠擬合

2021-10-01 16:39:35 字數 1585 閱讀 6234

過擬合與欠擬合

欠擬合:個人理解就是由於資料少、正則化太厲害、模型複雜度太簡單等原因,導致模型沒有學習到足夠的規律,準確率與模型可達到的準確率差距較大。但是模型在訓練集和測試集的曲線趨勢是正常收斂的。

解決方法為有:

增加特徵,尋找與標籤相關性較大的特徵,在保證特徵沒有共線性的前提下,增加特徵的數量;

減少正則化,正則化目的是在犧牲訓練集上部分準確率的前提下,使得模型的泛化能力增強。在模型未過擬合前,可以適當降低正則化的程度,提高準確率;

增加模型複雜度或選擇更複雜的模型。比如非線性分類問題,如果選擇了簡單的線性分類器,準確率較低,如果選擇神經網路等非線性演算法,則會有較好的擬合效果。

過擬合:個人理解就是模型複雜度過高、特徵過多問題、缺乏正則化等原因,導致模型在訓練集學習到了太多的只有訓練集特有的規律,使得模型在訓練集準確率超高,但在測試集上**不準確的現象,模型的泛化能力變差。

解決方法

最終目的就是要弱化模型學到的訓練集裡的特有規律。

增加正則化,正則化可以弱化訓練集裡的特有規律,使得模型泛化能力提高,但在訓練集的準確率稍有降低。

增加訓練樣本數量,使得樣本集盡量是完備的,可以代表當前的業務嘗盡。

減少特徵,在盡量保證剩餘特徵含有更多資訊的前提下,減少特徵的數量,可以適當提高模型的泛化能力,比如使用pca降維。

考慮是否可以更換為更簡單的演算法來建模。(這個方法最後使用,畢竟更換演算法相當於更換了思路)

使用sklearn的learning_curve為例,模型使用嶺回歸。learning_curve可以選擇使用多少個訓練資料計算在驗證集的評價分數score。

x_train,y_train為訓練樣本,使用者可以用自己已有的資料來實驗

reg = linear_model.ridge(alpha=0)

#trainsize如果使用小數的話,數值在(0,1),表示訓練集的樣本比例。如果是整數的的話(1,len(x_train)),表示訓練樣本數,不建議用訓練樣本數,比較麻煩。

trainsize = np.linspace(0.001,0.999,20)

train_sizes, train_scores, valid_scores = learning_curve(reg, x_train, y_train, train_sizes=trainsize, cv=4)

#由於cv=4,每一組資料都有4個結果,這裡使用結果的均值

train_std=train_scores.mean(axis=1)

test_std=valid_scores.mean(axis=1)

#畫圖fig,axes = plt.subplots(1,1)

axes.plot(train_sizes,train_std,color=『red』)

axes.plot(train_sizes,test_std,color=『blue』)

plt.show()

這裡**是使用sklearn的learning_curve函式,另一篇文章是手動編寫的使用mse來繪製學習曲線

欠擬合與過擬合

在用機器學習搭建模型時,經常會碰到這樣一種情況,你的模型演算法在樣本資料中匹配的非常完美。但用新資料測試,發現模型結果和實際差距非常大。那麼恭喜你!你掉進了機器學習中常見的乙個大坑 過擬合。什麼是過擬合呢?機器學習本質上是通過建立資料模型,使其和現有資料相吻合,從而找到資料中內在的規律。如下面三張圖...

欠擬合與過擬合

一 1.欠擬合 訓練集上表現很差 這種情況在測試集上也不會好 高偏差 bias 解決辦法 選擇更複雜的網路 有正則項就減小正則項引數等。2.過擬合 訓練集上表現很好,但測試集上表現很差,高方差 variance 解決辦法 採用更多資料 如果有正則化就增加正則化引數,沒有就加上正則化 dropout等...

欠擬合與過擬合

機器學習中的泛化,泛化即是,模型學習到的概念在它處於學習的過程中時模型沒有遇見過的樣本時候的表現。在機器學習領域中,當我們討論乙個機器學習模型學習和泛化的好壞時,我們通常使用術語 過擬合和欠擬合。我們知道模型訓練和測試的時候有兩套資料,訓練集和測試集。在對訓練資料進行擬合時,需要照顧到每個點,而其中...