使用學(xué)習(xí)曲線(learning_curve)檢測過擬合和欠擬合

什么是過擬合欠擬合

什么是過擬合和欠擬合,我們來看一下下圖:


線性模型

在圖中,第一張圖是欠擬合,第二張圖擬合剛好鹅髓,第三張圖是過擬合;

  • 欠擬合就是模型在訓(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()
  • Xy 是我們的數(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)行代碼后峡竣,可以得出三個模型的得分圖表:


Logistic Regression

Decision Tree

Support Vector Machine

我們得出了圖表,那根據(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)練,大家可以自己嘗試一下惊暴。

我的git項(xiàng)目鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饼丘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辽话,更是在濱河造成了極大的恐慌肄鸽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屡穗,死亡現(xiàn)場離奇詭異贴捡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)村砂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門烂斋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人础废,你說我怎么就攤上這事汛骂。” “怎么了评腺?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵帘瞭,是天一觀的道長。 經(jīng)常有香客問我蒿讥,道長蝶念,這世上最難降的妖魔是什么抛腕? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮媒殉,結(jié)果婚禮上担敌,老公的妹妹穿的比我還像新娘。我一直安慰自己廷蓉,他們只是感情好全封,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桃犬,像睡著了一般刹悴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攒暇,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天土匀,我揣著相機(jī)與錄音,去河邊找鬼形用。 笑死恒削,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尾序。 我是一名探鬼主播钓丰,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼每币!你這毒婦竟也來了携丁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兰怠,失蹤者是張志新(化名)和其女友劉穎梦鉴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揭保,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肥橙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秸侣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片存筏。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖味榛,靈堂內(nèi)的尸體忽然破棺而出椭坚,到底是詐尸還是另有隱情,我是刑警寧澤搏色,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布善茎,位于F島的核電站,受9級特大地震影響频轿,放射性物質(zhì)發(fā)生泄漏垂涯。R本人自食惡果不足惜烁焙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耕赘。 院中可真熱鬧考阱,春花似錦、人聲如沸鞠苟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽当娱。三九已至,卻和暖如春考榨,著一層夾襖步出監(jiān)牢的瞬間跨细,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工河质, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冀惭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓掀鹅,卻偏偏與公主長得像散休,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乐尊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355