from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
def plot_learning_curve(model,x,y):
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2,random_state = 10)
train_errors,val_errors=,
for m in range(1,len(x_train)):
model.fit(x_train[:m],y_train[:m])
y_train_predict = model.predict(x_train[:m])
y_val_predict = model.predict(x_test)
plt.plot(np.sqrt(train_errors),'r-+',linewidth=2,label="train")
plt.plot(np.sqrt(val_errors),'b-',linewidth=3,label='val')
plt.legend(loc='upper left',fontsize=14)
plt.xlabel('traing set size',fontsize=14)
plt.ylabel('rmse',fontsize=14)
函式呼叫:
lin_reg = linearregression()
plot_learning_curve(lin_reg,x,y)
plt.axis([0,80,0,3])
plt.show()
效果展示:
觀察訓練集的表現:當訓練集只有一兩個樣本的時候,模型能夠很好的擬合他們,這也是為什麼曲線是從零開始的原因。但當加入了一些新的樣本的時候,訓練集上的擬合程度並不理想,原因有兩個:1、資料中含有噪點;2、資料根本不是線性的。因此隨著資料規模的增大,誤差也會一直增大,直到達到了高原地帶並趨於穩定,在在這之後,繼續加入新的樣本,模型的平均誤差並不會變的更好或者更差。
驗證集上的表現,當以非常少的樣本去訓練時,模型不能恰當的泛化,這也是為什麼驗證誤差一開始非常大。當訓練樣本變多的時候,模型學習的東西變多,驗證誤差開始緩慢的下降。但是一條直線不可能很好的擬合這些資料,因此最後誤差會達到乙個高原地帶並趨於穩定,最後和訓練集的曲線非常接近。
上面的曲線表現的是典型的欠擬合模型,兩條曲線都達到高原地帶並趨於穩定,並且最後兩條曲線非常接近,同時誤差值非常大。
注意:當模型在訓練集上是欠擬合時,新增更多樣本是沒用的,需要做的是使用乙個更加複雜的模型,或更好的特徵。
現在我們來看下,在上面的資料集上使用10階多項式模型擬合的效果
polynomial_regression = pipeline([
('poly_features',polynomialfeatures(degree=10,include_bias=false)),
('sgd_reg',linearregression())
])plot_learning_curve(polynomial_regression,x,y)
plt.axis([0,80,0,3])
plt.show()
效果展示:
和上幅影象存在兩個非常重要的不同點:
VIM學習曲線 a
這裡記錄下自己在學習vim過程中的一些坎坷和總結吧!後面補充 今天看到不少同學收藏,看樣子還是有很多人和我一樣的初級學習菜鳥,哈哈,這裡再次申明,文章主要內容是從鏈結的原文作者 拷貝出的,其中自己有小的修改,另外,我會參考其他文章,將常用的一些東西都加入進來,後期會慢慢更新,其中一些說的不清楚的地方...
學習曲線learning curve
學習曲線是橫座標為訓練樣本數量,橫座標為誤差。畫的有兩條曲線,一條是訓練集誤差,一條是交叉驗證的誤差。學習曲線可以反應兩種情況,一種是高偏差,一種是高方差。高方差 過擬合,擬合效果過好,但是泛化效果差,無法泛化新的資料 高誤差 欠擬合,擬合程度太差,誤差太大。反應在學習曲線上就是 高偏差 訓練集誤差...
Python KNN 學習曲線
學習曲線的目的是選擇更好的模型引數。以最近鄰演算法為例,選取最近的多少個資料點,才能達到最優。可以控制訓練集不動,調整最近的點的個數,繪製學習曲線。import matplotlib.pyplot as plt score krange range 1,21 k值取值範圍 for i in kran...