轉(zhuǎn)自 :http://blog.csdn.net/aliceyangxi1987/article/details/73598857
學(xué)習(xí)曲線(xiàn)是什么?
學(xué)習(xí)曲線(xiàn)就是通過(guò)畫(huà)出不同訓(xùn)練集大小時(shí)訓(xùn)練集和交叉驗(yàn)證的準(zhǔn)確率,可以看到模型在新數(shù)據(jù)上的表現(xiàn)两曼,進(jìn)而來(lái)判斷模型是否方差偏高或偏差過(guò)高蛙吏,以及增大訓(xùn)練集是否可以減小過(guò)擬合座哩。
當(dāng)訓(xùn)練集和測(cè)試集的誤差收斂但卻很高時(shí)盐欺,為高偏差螟炫。
左上角的偏差很高波附,訓(xùn)練集和驗(yàn)證集的準(zhǔn)確率都很低,很可能是欠擬合昼钻。
我們可以增加模型參數(shù)掸屡,比如,構(gòu)建更多的特征然评,減小正則項(xiàng)仅财。
此時(shí)通過(guò)增加數(shù)據(jù)量是不起作用的。
當(dāng)訓(xùn)練集和測(cè)試集的誤差之間有大的差距時(shí)碗淌,為高方差盏求。
當(dāng)訓(xùn)練集的準(zhǔn)確率比其他獨(dú)立數(shù)據(jù)集上的測(cè)試結(jié)果的準(zhǔn)確率要高時(shí),一般都是過(guò)擬合亿眠。
右上角方差很高碎罚,訓(xùn)練集和驗(yàn)證集的準(zhǔn)確率相差太多,應(yīng)該是過(guò)擬合纳像。
我們可以增大訓(xùn)練集荆烈,降低模型復(fù)雜度,增大正則項(xiàng)竟趾,或者通過(guò)特征選擇減少特征數(shù)憔购。
理想情況是是找到偏差和方差都很小的情況,即收斂且誤差較小潭兽。
在畫(huà)學(xué)習(xí)曲線(xiàn)時(shí),橫軸為訓(xùn)練樣本的數(shù)量山卦,縱軸為準(zhǔn)確率鞋邑。
例如同樣的問(wèn)題诵次,左圖為我們用naive Bayes分類(lèi)器時(shí),效果不太好枚碗,分?jǐn)?shù)大約收斂在 0.85逾一,此時(shí)增加數(shù)據(jù)對(duì)效果沒(méi)有幫助。
右圖為SVM(RBF kernel)肮雨,訓(xùn)練集的準(zhǔn)確率很高遵堵,驗(yàn)證集的也隨著數(shù)據(jù)量增加而增加,不過(guò)因?yàn)橛?xùn)練集的還是高于驗(yàn)證集的怨规,有點(diǎn)過(guò)擬合陌宿,所以還是需要增加數(shù)據(jù)量,這時(shí)增加數(shù)據(jù)會(huì)對(duì)效果有幫助波丰。
模型這里用 GaussianNB 和 SVC 做比較壳坪,
模型選擇方法中需要用到 learning_curve 和交叉驗(yàn)證方法 ShuffleSplit。
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.naive_bayesimportGaussianNBfromsklearn.svmimportSVCfromsklearn.datasetsimportload_digitsfromsklearn.model_selectionimportlearning_curvefromsklearn.model_selectionimportShuffleSplit
首先定義畫(huà)出學(xué)習(xí)曲線(xiàn)的方法掰烟,
核心就是調(diào)用了 sklearn.model_selection 的 learning_curve爽蝴,
學(xué)習(xí)曲線(xiàn)返回的是 train_sizes, train_scores, test_scores,
畫(huà)訓(xùn)練集的曲線(xiàn)時(shí)纫骑,橫軸為 train_sizes, 縱軸為 train_scores_mean蝎亚,
畫(huà)測(cè)試集的曲線(xiàn)時(shí),橫軸為 train_sizes, 縱軸為 test_scores_mean:
defplot_learning_curve(estimator, title, X, y, ylim=None, cv=None,
? ? ? ? ? ? ? ? ? ? ? ? n_jobs=1, train_sizes=np.linspace(.1,1.0,5)):~~~? ? train_sizes, train_scores, test_scores = learning_curve(? ? ? ? estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)? ? train_scores_mean = np.mean(train_scores, axis=1)? ? test_scores_mean = np.mean(test_scores, axis=1)? ? ? ~~~
在調(diào)用 plot_learning_curve 時(shí)先馆,首先定義交叉驗(yàn)證 cv 和學(xué)習(xí)模型 estimator发框。
這里交叉驗(yàn)證用的是 ShuffleSplit, 它首先將樣例打散磨隘,并隨機(jī)取 20% 的數(shù)據(jù)作為測(cè)試集缤底,這樣取出 100 次,最后返回的是 train_index, test_index番捂,就知道哪些數(shù)據(jù)是 train个唧,哪些數(shù)據(jù)是 test。
estimator 用的是 GaussianNB设预,對(duì)應(yīng)左圖:
cv = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0)estimator = GaussianNB()
plot_learning_curve(estimator, title, X, y, ylim=(0.7, 1.01), cv=cv, n_jobs=4)
再看 estimator 是 SVC 的時(shí)候徙歼,對(duì)應(yīng)右圖:
cv = ShuffleSplit(n_splits=10, test_size=0.2, random_state=0)estimator = SVC(gamma=0.001)
plot_learning_curve(estimator, title, X, y, (0.7, 1.01), cv=cv, n_jobs=4)
分類(lèi):?Machine Learning