機器學習 如何判斷和解決過擬合和欠擬合

2021-09-22 12:38:19 字數 3881 閱讀 7777

1.利用學習曲線判斷

2.誤差 = 偏差(精確率) + 方差(穩定性)

3.下圖中虛線為訓練集,實線為測試集

功能:判別過擬合和欠擬合

學習曲線learning curve:評估樣本量和指標的關係

驗證曲線validation curve:評估引數和指標的關係

'''import pandas as pd

from sklearn.preprocessing import labelencoder

from sklearn.cross_validation import train_test_split

from sklearn.preprocessing import standardscaler

from sklearn.linear_model import logisticregression

from sklearn.pipeline import pipeline

import matplotlib.pyplot as plt

from sklearn.learning_curve import learning_curve

import numpy as np

from sklearn.learning_curve import validation_curve

#匯入資料

df = pd.read_csv(

'',header=

none

)x=df.loc[:,

2:].values

y=df.loc[:,

1].values

le=labelencoder(

)y=le.fit_transform(y)

#類標整數化

print

(le.transform(

['m'

,'b'])

)#劃分訓練集合測試集

x_train,x_test,y_train,y_test = train_test_split (x,y,test_size=

0.20

,random_state=1)

#標準化、模型訓練串聯

pipe_lr=pipeline([(

'scl'

,standardscaler())

,('clf'

,logisticregression(random_state=

1,penalty=

'l2'))

])#case1:學習曲線

#構建學習曲線評估器,train_sizes:控制用於生成學習曲線的樣本的絕對或相對數量

train_sizes,train_scores,test_scores=learning_curve(estimator=pipe_lr,x=x_train,y=y_train,train_sizes=np.linspace(

0.1,

1.0,10)

,cv=

10,n_jobs=1)

#統計結果

train_mean= np.mean(train_scores,axis=1)

train_std = np.std(train_scores,axis=1)

test_mean =np.mean(test_scores,axis=1)

test_std=np.std(test_scores,axis=1)

#繪製效果

plt.plot(train_sizes,train_mean,color=

'blue'

,marker=

'o',markersize=

5,label=

'training accuracy'

)plt.fill_between(train_sizes,train_mean+train_std,train_mean-train_std,alpha=

0.15

,color=

'blue'

)plt.plot(train_sizes,test_mean,color=

'green'

,linestyle=

'--'

,marker=

's',markersize=

5,label=

'test accuracy'

)plt.fill_between(train_sizes,test_mean+test_std,test_mean-test_std,alpha=

0.15

,color=

'green'

)plt.grid(

)plt.xlabel(

'number of training samples'

)plt.ylabel(

'accuracy'

)plt.legend(loc=

'lower right'

)plt.ylim(

[0.8

,1.0])

plt.show(

)#case2:驗證曲線

param_range=

[0.001

,0.01

,0.1

,1.0

,10.0

,100.0

]#10折,驗證正則化引數c

train_scores,test_scores =validation_curve(estimator=pipe_lr,x=x_train,y=y_train,param_name=

'clf__c'

,param_range=param_range,cv=10)

#統計結果

train_mean= np.mean(train_scores,axis=1)

train_std = np.std(train_scores,axis=1)

test_mean =np.mean(test_scores,axis=1)

test_std=np.std(test_scores,axis=1)

plt.plot(param_range,train_mean,color=

'blue'

,marker=

'o',markersize=

5,label=

'training accuracy'

)plt.fill_between(param_range,train_mean+train_std,train_mean-train_std,alpha=

0.15

,color=

'blue'

)plt.plot(param_range,test_mean,color=

'green'

,linestyle=

'--'

,marker=

's',markersize=

5,label=

'test accuracy'

)plt.fill_between(param_range,test_mean+test_std,test_mean-test_std,alpha=

0.15

,color=

'green'

)plt.grid(

)plt.xscale(

'log'

)plt.xlabel(

'parameter c'

)plt.ylabel(

'accuracy'

)plt.legend(loc=

'lower right'

)plt.ylim(

[0.8

,1.0])

plt.show(

)

機器學習之擬合和過擬合問題

過擬合 當某個模型過度的學習訓練資料中的細節和噪音,以至於模型在新的資料上表現很差,我們稱過擬合發生了,通俗點就是 模型在訓練集中測試的準確度遠遠高於在測試集中的準確度。過擬合問題通常發生在變數特徵過多的時候。這種情況下訓練出的方程總是能很好的擬合訓練資料,也就是說,我們的代價函式可能非常接近於0或...

深度學習和機器學習中過擬合的判定 原因和解決方法

目錄 一 過擬合的表現以及判定 1 模型過擬合的表現 2 模型過擬合的判定 二 過擬合的原因 三 過擬合的解決方案 1 模型層面 2 資料層面 3 訓練層面 4 其他 最近在做nlp相關任務的時候,訓練神經網路模型的過程中,遇到過模型過擬合的情況,到底怎麼解決過擬合,來提高模型的效能,不是特別的清晰...

欠擬合和過擬合定義和解決辦法

定義 過擬合 乙個假定在訓練集資料上能夠獲得比其他假設更好的擬合,但在測試集上卻不能很好的擬合資料,此時認為這個假設出現過擬合的現象 模型過於複雜 欠擬和 假定在訓練集上不能獲得更好的擬合並且在測試集上也不能很好的擬合資料此時認為這個假設出現欠擬合的現象 模型過於簡單 解決辦法 欠擬合原因以及解決辦...