Learning Curve 与偏差方差(判断欠过拟合) - Vancuicide
文章推薦指數: 80 %
学习曲线就是通过画出不同训练集大小时训练集和验证集的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,是否可以通过增加 ...
首页
新闻
博问
专区
闪存
班级
我的博客
我的园子
账号设置
简洁模式...
退出登录
注册
登录
Vancuicide
LearningCurve与偏差方差(判断欠过拟合)
之前有一篇文章介绍了什么是偏差(bias)与方差(variance),这篇文章介绍一下如何使用学习曲线来判断模型是否处于欠拟合或过拟合。
什么是学习曲线?
学习曲线就是通过画出不同训练集大小时训练集和验证集的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,是否可以通过增加数据集来减少过拟合、是否可以通过增加特征、减少正则项来降低偏差。
怎么解读?
当训练集和测试集的误差收敛但却很高时,为高偏差。
例如左上,偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合。
我们可以增加模型参数,比如,构建更多的特征,减少正则项。
此时通过增加数据量是不起作用的。
当训练集和测试集的误差之间有大的差距时,为高方差。
当训练集的准确率比其他独立数据集上的测试结果的准确率要高时,一般都是过拟合。
例如右上,方差很高,训练集和验证集的准确率相差太多,应该是过拟合。
我们可以增大数据集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数。
理想情况是找到偏差和方差都很小的情况,即收敛且误差较小。
怎么画?
在画学习曲线时,横轴为训练样本的数量,纵轴为准确率。
左图为朴素贝叶斯(NativeBayes)分类器,分数大概收敛在0.85,此时增加数据集对提升结果没有帮助。
右图为支持向量机(SVMRBF-kernel),训练集的准确率很高,验证集的准确率也随着数据量增加而增加,不过因为训练集还是高于验证集的,处于过拟合状态,所以增加数据集还是对提升结果有帮助的。
代码实现
模型选择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,就知道哪些数据是训练集,哪些是测试集。
当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)
posted@
2018-09-1810:36
Vancuicide
阅读(1183)
评论(0)
编辑
收藏
举报
刷新评论刷新页面返回顶部
Copyright©2022Vancuicide
Poweredby.NET6onKubernetes
延伸文章資訊
- 1學習曲線Learning Curve - w3c學習教程
學習曲線Learning Curve,學習曲線是什麼? 學習曲線learning curve 來判斷模型狀態過擬合欠擬合學習曲線是不同訓練集大小,模型在訓練集和驗證集上的 ...
- 2Learning Model : 學習曲線診斷模型的偏差和方差,並優化模型
假設讀者熟悉scikit-learn 和相關的機器學習理論。 ... plt.title('Learning curves for a linear regression model', fon...
- 304. 鐵達尼預測內幕:避免過度學習的方法
圖一:模型為high bias 的情況,所繪製出來的learning curve。可以看到無論training set size 如何增加,validation error curve (藍紫色...
- 4Learning Curve 与偏差方差(判断欠过拟合) - Vancuicide
学习曲线就是通过画出不同训练集大小时训练集和验证集的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,是否可以通过增加 ...
- 5机器学习之学习曲线learning curve和过拟合、欠拟合
一、学习曲线学习曲线是什么?学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否 ...