什么是過擬合和欠擬合
什么是過擬合和欠擬合,我們來看一下下圖:
在圖中,第一張圖是欠擬合,第二張圖擬合剛好鹅髓,第三張圖是過擬合;
- 欠擬合就是模型在訓(xùn)練樣本或者驗(yàn)證數(shù)據(jù)集以及測試數(shù)據(jù)集中都表現(xiàn)很差京景;模型的學(xué)習(xí)能力較弱窿冯,而數(shù)據(jù)復(fù)雜度較高的情況出現(xiàn),此時模型由于學(xué)習(xí)能力不足确徙,無法學(xué)習(xí)到數(shù)據(jù)集中的“一般規(guī)律”醒串,因而導(dǎo)致泛化能力弱,
- 過擬合就是模型在訓(xùn)練樣本中表現(xiàn)得過于優(yōu)越鄙皇,而在驗(yàn)證數(shù)據(jù)集以及測試數(shù)據(jù)集中表現(xiàn)很差芜赌;
欠擬合常見解決方法有:
- 增加新特征,可以考慮加入進(jìn)特征組合伴逸、高次特征缠沈,來增大假設(shè)空間;
- 添加多項(xiàng)式特征错蝴,這個在機(jī)器學(xué)習(xí)算法里面用的很普遍洲愤,例如將線性模型通過添加二次項(xiàng)或者三次項(xiàng)使模型泛化能力更強(qiáng);
- 減少正則化參數(shù)顷锰,正則化的目的是用來防止過擬合的柬赐,但是模型出現(xiàn)了欠擬合,則需要減少正則化參數(shù)官紫;
- 使用非線性模型肛宋,比如核SVM 、決策樹束世、深度學(xué)習(xí)等模型酝陈;
- 調(diào)整模型的容量(capacity),通俗地毁涉,模型的容量是指其擬合各種函數(shù)的能力沉帮;
- 容量低的模型可能很難擬合訓(xùn)練集;使用集成學(xué)習(xí)方法薪丁,如Bagging ,將多個弱學(xué)習(xí)器Bagging。
過擬合常見解決方法有:
- 在神經(jīng)網(wǎng)絡(luò)模型中馅精,可使用權(quán)值衰減的方法严嗜,即每次迭代過程中以某個小因子降低每個權(quán)值。
- 選取合適的停止訓(xùn)練標(biāo)準(zhǔn)洲敢,使對機(jī)器的訓(xùn)練在合適的程度漫玄;
- 保留驗(yàn)證數(shù)據(jù)集,對訓(xùn)練成果進(jìn)行驗(yàn)證;
- 獲取額外數(shù)據(jù)進(jìn)行交叉驗(yàn)證睦优;
- 正則化渗常,即在進(jìn)行目標(biāo)函數(shù)或代價函數(shù)優(yōu)化時,在目標(biāo)函數(shù)或代價函數(shù)后面加上一個正則項(xiàng)汗盘,一般有L1正則與L2正則等皱碘。
通過學(xué)習(xí)曲線檢測過擬合與欠擬合
下面我們通過一個例子來進(jìn)行驗(yàn)證,我準(zhǔn)備來一組數(shù)據(jù)集
隐孽,如下:
其中y=1.0就是我們需要模型正確劃分的數(shù)據(jù)癌椿,首先我們來畫出y=1.0,y=-1.0的散點(diǎn)圖來查看數(shù)據(jù)的分布情況菱阵;代碼如下:
data = pd.read_csv('data.csv')
# 刷選y=1很y=-1的數(shù)據(jù)
data_0 = data[data['y'] == -1.0]
data_1 = data[data['y'] == 1]
# 繪制散點(diǎn)圖
plt.scatter(np.array(data_0['x1']),np.array(data_0['x2']),color='r')
plt.scatter(np.array(data_1['x1']),np.array(data_1['x2']))
plt.show()
運(yùn)行代碼踢俄,圖表如下:
通過查看數(shù)據(jù)集的分布,這里我們將使用三個模型來訓(xùn)練這個數(shù)據(jù)集晴及。
- 決策樹模型都办,
- 邏輯回歸模型
- 支持向量機(jī)模型
其中一個模型會過擬合,一個欠擬合虑稼,還有一個正常琳钉。首先,我們將編寫代碼為每個模型繪制學(xué)習(xí)曲線动雹,最后我們將查看這些學(xué)習(xí)曲線槽卫,判斷每個模型對應(yīng)哪個曲線。
首先胰蝠,請記住三個模型的學(xué)習(xí)曲線外觀大概如下所示:
learning_curve
首先我們將使用函數(shù) learning_curve:
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))
不需要擔(dān)心該函數(shù)的所有參數(shù)(你可以在此處了解詳情)歼培,這里,我們將解釋主要參數(shù):
-
estimator
茸塞,是我們針對數(shù)據(jù)使用的實(shí)際分類器躲庄,例如LogisticRegression()
或GradientBoostingClassifier()
。 -
X
和y
是我們的數(shù)據(jù)钾虐,分別表示特征和標(biāo)簽噪窘。 -
train_sizes
是用來在曲線上繪制每個點(diǎn)的數(shù)據(jù)大小。 -
train_scores
是針對每組數(shù)據(jù)進(jìn)行訓(xùn)練后的算法訓(xùn)練得分效扫。 -
test_scores
是針對每組數(shù)據(jù)進(jìn)行訓(xùn)練后的算法測試得分倔监。
兩個注意事項(xiàng):
訓(xùn)練和測試得分是一個包含 3 個值的列表,這是因?yàn)楹瘮?shù)使用了 3 折交叉驗(yàn)證菌仁。
非常重要:可以看出浩习,我們使用訓(xùn)練和測試誤差來定義我們的曲線,而這個函數(shù)使用訓(xùn)練和測試得分來定義曲線济丘。二者是相反的谱秽,因此誤差越高洽蛀,得分就越低。因此疟赊,當(dāng)你看到曲線時郊供,你需要自己在腦中將它顛倒過來,以便與上面的曲線對比近哟。
定義函數(shù)
了解了learning_curve的參數(shù)后驮审,我們來定義一個函數(shù)(draw_learning_curves),該函數(shù)根據(jù)不同模型畫出相應(yīng)訓(xùn)練得分跟交叉驗(yàn)證得分的圖表椅挣;代碼如下:
def draw_learning_curves(X, y, estimator, num_trainings, title):
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
plt.grid()
plt.title(title + " Learning Curves")
plt.xlabel("Training examples")
plt.ylabel("Score")
plt.plot(train_scores_mean, 'o-', color="g",
label="Training score")
plt.plot(test_scores_mean, 'o-', color="y",
label="Cross-validation score")
plt.legend(loc="best")
plt.show()
定義模型分類器
定好好函數(shù)后头岔,我們定義三個模型(決策樹模型,邏輯回歸模型,支持向量機(jī)模型)的分類器,然后調(diào)用上面的函數(shù)畫圖鼠证;代碼如下:
### Logistic Regression
estimator1 = LogisticRegression()
### Decision Tree
estimator2 = GradientBoostingClassifier()
### Support Vector Machine
estimator3 = SVC(kernel='rbf', gamma=1000)
all_estimators = [estimator1, estimator2, estimator3]
all_title = ['Logistic Regression', 'Decision Tree', 'Support Vector Machine']
for estimator, title in list(zip(all_estimators, all_title)):
utils.draw_learning_curves(X2, y2, estimator, 6, title)
運(yùn)行代碼后峡竣,可以得出三個模型的得分圖表:
我們得出了圖表,那根據(jù)上述模型曲線量九,你覺得哪個模型欠擬合适掰,哪個過擬合,哪個正好荠列?
我們可以根據(jù)這些曲線得出結(jié)論:
- 邏輯回歸模型的訓(xùn)練和測試得分很低类浪。
- 決策樹模型的訓(xùn)練和測試得分很高。
-
支持向量機(jī)模型的訓(xùn)練得分很高肌似,測試得分很低费就。
由此可以判斷,邏輯回歸模型欠擬合川队,支持向量機(jī)模型過擬合力细,決策樹正常。
同樣固额,我們可以翻轉(zhuǎn)這些曲線(因?yàn)樗鼈儨y量的是得分眠蚂,而原始曲線測量的是錯誤),并將它們與下面的三條曲線對比斗躏,可以看出它們與我們之前看到的三條曲線很像逝慧。(注意:我們需要翻轉(zhuǎn)曲線并不意味著錯誤是 1 減去得分。只是表示模型越來越好的話啄糙,錯誤會降低笛臣,得分會升高。)
現(xiàn)在我們應(yīng)該檢測在實(shí)際模型中是否這樣隧饼。當(dāng)我們繪制每個模型的界限曲線時沈堡,結(jié)果如下所示:
當(dāng)我們查看上述模型時,第一個模型欠擬合桑李,第二個正常踱蛀,第三個過擬合,這種現(xiàn)象合理嗎贵白?合理吧率拒?我們看到數(shù)據(jù)由圓圈或方框正確地劃分出來。我們的模型按以下形式劃分?jǐn)?shù)據(jù):
- 邏輯回歸模型使用一條直線禁荒,這太簡單了猬膨。在訓(xùn)練集上的效果不太好,因此欠擬合呛伴。
- 決策樹模型使用一個方形勃痴,擬合的很好,并能夠泛化热康。因此沛申,該模型效果很好。
- 支持向量機(jī)模型實(shí)際上在每個點(diǎn)周圍都畫了一個小圓圈姐军。它實(shí)際上是在記住訓(xùn)練集铁材,無法泛化。因此 過擬合奕锌。
上面步驟就是通過學(xué)習(xí)曲線檢測過擬合與欠擬合的過程著觉,通過學(xué)習(xí)曲線檢測模型是否過擬合與欠擬合可以更好讓你選擇模型進(jìn)行訓(xùn)練,大家可以自己嘗試一下惊暴。