用学习曲线learning curve 来判别过拟合问题 - 简书
文章推薦指數: 80 %
学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,以及增大训练集 ...
用学习曲线learningcurve来判别过拟合问题本文结构:
学习曲线是什么?
怎么解读?
怎么画?
学习曲线是什么?
学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,以及增大训练集是否可以减小过拟合。
怎么解读?
当训练集和测试集的误差收敛但却很高时,为高偏差。
左上角的偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合。
我们可以增加模型参数,比如,构建更多的特征,减小正则项。
此时通过增加数据量是不起作用的。
当训练集和测试集的误差之间有大的差距时,为高方差。
当训练集的准确率比其他独立数据集上的测试结果的准确率要高时,一般都是过拟合。
右上角方差很高,训练集和验证集的准确率相差太多,应该是过拟合。
我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数。
理想情况是是找到偏差和方差都很小的情况,即收敛且误差较小。
怎么画?
在画学习曲线时,横轴为训练样本的数量,纵轴为准确率。
例如同样的问题,左图为我们用naiveBayes分类器时,效果不太好,分数大约收敛在0.85,此时增加数据对效果没有帮助。
右图为SVM(RBFkernel),训练集的准确率很高,验证集的也随着数据量增加而增加,不过因为训练集的还是高于验证集的,有点过拟合,所以还是需要增加数据量,这时增加数据会对效果有帮助。
上图的代码如下:
模型这里用GaussianNB和SVC做比较,
模型选择方法中需要用到learning_curve和交叉验证方法ShuffleSplit。
importnumpyasnp
importmatplotlib.pyplotasplt
fromsklearn.naive_bayesimportGaussianNB
fromsklearn.svmimportSVC
fromsklearn.datasetsimportload_digits
fromsklearn.model_selectionimportlearning_curve
fromsklearn.model_selectionimportShuffleSplit
首先定义画出学习曲线的方法,
核心就是调用了sklearn.model_selection的learning_curve,
学习曲线返回的是train_sizes,train_scores,test_scores,
画训练集的曲线时,横轴为train_sizes,纵轴为train_scores_mean,
画测试集的曲线时,横轴为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)
~~~
在调用plot_learning_curve时,首先定义交叉验证cv和学习模型estimator。
这里交叉验证用的是ShuffleSplit,它首先将样例打散,并随机取20%的数据作为测试集,这样取出100次,最后返回的是train_index,test_index,就知道哪些数据是train,哪些数据是test。
estimator用的是GaussianNB,对应左图:
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的时候,对应右图:
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)
资料:
http://scikit-learn.org/stable/modules/learning_curve.html#learning-curve
http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html#sphx-glr-auto-examples-model-selection-plot-learning-curve-py
推荐阅读历史技术博文链接汇总
http://www.jianshu.com/p/28f02bb59fe5
也许可以找到你想要的
推荐阅读更多精彩内容【转】机器学习模型评价1(EvaluatingMachineLearningModels)博客上看到一篇优秀的翻译文章。
文章地址:http://blog.csdn.net/heyongluoyao8/ar..._CelesteHuang_阅读4,620评论0赞24谷歌开发者机器学习词汇表:纵览机器学习基本词汇与概念谷歌开发者机器学习词汇表:纵览机器学习基本词汇与概念姓名:钟航转载自:http://mp.weixin.qq....XavierZHH阅读1,688评论0赞7机器学习术语表https://developers.google.com/machine-learning/crash-cour...iOSDevLog阅读2,200评论1赞1125/70早生孩子多读书D064六月,对于学子们来说是最紧张的一个月份,高考、中考、各年级期末考。
无可否认的,这个月也是天下父母最焦虑的一个月。
...木鱼78阅读221评论1赞1自嘲(其二)落笔未起张狂愁,诗成却生清高忧。
方寸纵横天下意,一壶浊酒笑千秋。
逆棠阅读271评论0赞15#老李谈销售#千字文08没有无缘无故的爱也没有无缘无故的恨前几天去给一家企业培训,跟企业的培训经理吕老师一见如故,两个人越聊越开心。
课间休息的时候,不由得问他多大年纪?吕老...辰溪行者阅读41评论0赞0你是否还在灯火阑珊处等待那个蓦然回首的人?《每一生都为你》歌手:陈洁仪专辑:麻醉作词:欧志深...塔米33阅读328评论0赞2抽奖18赞19赞赞赏更多好文
延伸文章資訊
- 1机器学习之学习曲线learning curve和过拟合、欠拟合
一、学习曲线学习曲线是什么?学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否 ...
- 2學習曲線(learning curve)來判斷模型狀態:過擬合欠擬合 - 台部落
學習曲線(learning curve)來判斷模型狀態:過擬合欠擬合學習曲線是什麼學習曲線是不同訓練集大小,模型在訓練集和驗證集上的得分變化曲線。
- 3使用学习曲线和验证曲线调试算法· Python机器学习 - ljalphabeta
他们就是学习曲线(learning curve)和验证曲线(validation curve)。学习曲线可以判断学习算法是否过拟合或者欠拟合。 使用学习曲线判别偏差和方差问题. 如果一个模型相对...
- 4Learning Model : 學習曲線診斷模型的偏差和方差,並優化模型
假設讀者熟悉scikit-learn 和相關的機器學習理論。 ... plt.title('Learning curves for a linear regression model', fon...
- 5Learning Curve 与偏差方差(判断欠过拟合) - Vancuicide
学习曲线就是通过画出不同训练集大小时训练集和验证集的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,是否可以通过增加 ...