确定交叉验证的针对不同训练集大小的训练和测试分数。

一种用来判断训练模型的一种方法,通过观察绘制出来的学习曲线图,我们可以比较直观的了解到我们的模型处于一个什么样的状态,如:过拟合(overfitting)或欠拟合(underfitting)。

交叉验证生成器将整个数据集拆分为训练和测试数据中的k次。 具有不同大小的训练集的子集将用于训练估计器,并为每个训练子集大小和测试集计算分数。 之后,对于每个训练子集大小,将对所有k次运行的得分进行平均。

sklearn.model_selection.learning_curve(estimator, X, y, *, groups=None, train_sizes=array([0.1, 0.33, 0.55, 0.78, 1.0]), cv=None, scoring=None, exploit_incremental_learning=False, n_jobs=None, pre_dispatch='all', verbose=0, shuffle=False, random_state=None, error_score=nan, return_times=False, fit_params=None)

参数
estimator:实现“ fit”和“ predict”方法的对象类型
每次验证都会克隆的该类型的对象。

X:数组类,形状(n_samples,n_features)
训练向量,其中n_samples是样本数,n_features是特征数。

y:数组类,形状(n_samples)或(n_samples,n_features),可选
相对于X的目标进行分类或回归;无监督学习无。

groups:数组类,形状为(n_samples,),可选
将数据集拆分为训练/测试集时使用的样本的标签分组。仅用于连接交叉验证实例组(例如GroupKFold)。

train_sizes:数组类,形状(n_ticks),dtype float或int
训练示例的相对或绝对数量,将用于生成学习曲线。如果dtype为float,则视为训练集最大尺寸的一部分(由所选的验证方法确定),即,它必须在(0,1]之内,否则将被解释为绝对大小注意,为了进行分类,样本的数量通常必须足够大,以包含每个类中的至少一个样本(默认值:np.linspace(0.1,1.0,5))

cv:int,交叉验证生成器或可迭代的,可选的
确定交叉验证拆分策略。cv的可能输入是:

●None,要使用默认的三折交叉验证(v0.22版本中将改为五折)
●整数,用于指定(分层)KFold中的折叠数,
●CV splitter
●可迭代的集(训练,测试)拆分为索引数组。
对于整数/无输入,如果估计器是分类器,y是二进制或多类,则使用StratifiedKFold。在所有其他情况下,都使用KFold。

scoring:字符串,可调用或无,可选,默认:None
字符串(参阅model evaluation documentation)或带有签名scorer(estimator, X, y)的计分器可调用对象/函数。

exploit_incremental_learning:布尔值,可选,默认值:False
如果估算器支持增量学习,此参数将用于加快拟合不同训练集大小的速度。

n_jobs:int或None,可选(默认=None)
要并行运行的作业数。None表示1。 -1表示使用所有处理器。有关更多详细信息,请参见词汇表。

pre_dispatch:整数或字符串,可选
并行执行的预调度作业数(默认为全部)。该选项可以减少分配的内存。该字符串可以是“ 2 * n_jobs”之类的表达式。

verbose:整数,可选
控制详细程度:越高,消息越多。

shuffle:布尔值,可选
是否在基于``train_sizes’'为前缀之前对训练数据进行洗牌。

random_state:int,RandomState实例或无,可选(默认=None)
如果为int,则random_state是随机数生成器使用的种子;否则为false。如果是RandomState实例,则random_state是随机数生成器;如果为None,则随机数生成器是np.random使用的RandomState实例。在shuffle为True时使用。

error_score:‘raise’ | ‘raise-deprecating’ 或数字
如果估算器拟合中出现错误,则分配给分数的值。如果设置为“ raise”,则会引发错误。如果设置为“raise-deprecating”,则会在出现错误之前打印FutureWarning。如果给出数值,则引发FitFailedWarning。此参数不会影响重新安装步骤,这将始终引发错误。默认值为“不赞成使用”,但从0.22版开始,它将更改为np.nan。

返回值
train_sizes_abs:数组,形状(n_unique_ticks,),dtype int
已用于生成学习曲线的训练示例数。 请注意,ticks的数量可能少于n_ticks,因为重复的条目将被删除。

train_scores:数组,形状(n_ticks,n_cv_folds)
训练集得分。

test_scores:数组,形状(n_ticks,n_cv_folds)
测试集得分。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_digits
from sklearn.model_selection import learning_curve #画学习曲线的类
from sklearn.model_selection import ShuffleSplit #设定交叉验证模式的类
from time import time
import datetimedef plot_learning_curve(estimator,title, X, y, ax, #选择子图ylim=None, #设置纵坐标的取值范围cv=None, #交叉验证n_jobs=None #设定索要使用的线程):train_sizes, train_scores, test_scores = learning_curve(estimator, X, y,cv=cv,n_jobs=n_jobs)   #train_sizes 每次分训练集和测试集建模之后,训练集上的样本数量#train_scores 训练集上的分数ax.set_title(title)if ylim is not None:ax.set_ylim(*ylim)ax.set_xlabel("Training examples")ax.set_ylabel("Score")ax.grid() #显示网格作为背景,不是必须ax.plot(train_sizes, np.mean(train_scores, axis=1), 'o-', color="r",label="Training score")ax.plot(train_sizes, np.mean(test_scores, axis=1), 'o-', color="g",label="Test score")ax.legend(loc="best")return ax
digits = load_digits()
X, y = digits.data, digits.target
X.shape #(1797, 64)
X #是一个稀疏矩阵title = ["Naive Bayes","DecisionTree","SVM, RBF kernel","RandomForest","Logistic"]
model = [GaussianNB(),DTC(),SVC(gamma=0.001),RFC(n_estimators=50),LR(C=.1,solver="lbfgs")]
cv = ShuffleSplit(n_splits=50, test_size=0.2, random_state=0) #n_splits把数据分为多少份,20% * 50 份的数据会被作为测试集fig, axes = plt.subplots(1,5,figsize=(30,6))
for ind, title_, estimator in zip(range(len(title)),title,model):times = time()plot_learning_curve(estimator, title_, X, y,ax=axes[ind], ylim = [0.7, 1.05],n_jobs=4, cv=cv)print("{}:{}".format(title_,datetime.datetime.fromtimestamp(time()-times).strftime("%M:%S:%f")))
plt.show()


三个模型表现出的状态非常有意思。

我们首先返回的结果是各个算法的运行时间。可以看到,决策树和贝叶斯不相伯仲(如果你没有发现这个结果,那么可以多运行几次,你会发现贝叶斯和决策树的运行时间逐渐变得差不多)。决策树之所以能够运行非常快速是因为sklearn中的分类树在选择特征时有所”偷懒”,没有计算全部特征的信息熵而是随机选择了一部分特征来进行计算,因此速度快可以理解,但我们知道决策树的运算效率随着样本量逐渐增大会越来越慢,但朴素贝叶斯却可以在很少的样本上获得不错的结果,因此我们可以预料,随着样本量的逐渐增大贝叶斯会逐渐变得比决策树更快。朴素贝叶斯计算速度远远胜过SVM,随机森林这样复杂的模型,逻辑回归的运行受到最大迭代次数的强烈影响和输入数据的影响(逻辑回归一般在线性数据上运行都比较快,但在这里应该是受到了稀疏矩阵的影响)。因此在运算时间上,朴素贝叶斯还是十分有优势的。

紧接着,我们来看一下每个算法在训练集上的拟合。手写数字数据集是一个较为简单的数据集,决策树,森林,SVC和逻辑回归都成功拟合了100%的准确率,但贝叶斯的最高训练准确率都没有超过95%,这也应证了我们最开始说的,朴素贝叶斯的分类效果其实不如其他分类器,贝叶斯天生学习能力比较弱。并且我们注意到,随着训练样本量的逐渐增大,其他模型的训练拟合都保持在100%的水平,但贝叶斯的训练准确率却逐渐下降,这证明样本量越大,贝叶斯需要学习的东西越多,对训练集的拟合程度也越来越差。反而比较少量的样本可以让贝叶斯有较高的训练准确率。

再来看看过拟合问题。首先一眼看到,所有模型在样本量很少的时候都是出于过拟合状态的(训练集上表现好,测试集上表现糟糕),但随着样本的逐渐增多,过拟合问题都逐渐消失了,不过每个模型的处理手段不同。比较强大的分类器们,比如SVM,随机森林和逻辑回归,是依靠快速升高模型在测试集上的表现来减轻过拟合问题。相对的,决策树虽然也是通过提高模型在测试集上的表现来减轻过拟合,但随着训练样本的增加,模型在测试集上的表现善生却非常缓慢。朴素贝叶斯独树一帜,是依赖训练集上的准确率下降,测试集上的准确率上升来逐渐解决过拟合问题。

接下来,看看每个算法在测试集上的拟合结果,即泛化误差的大小。随着训练样本数量的上升,所有模型的测试表现都上升了,但贝叶斯和决策树在测试集上的表现远远不如SVM,随机森林和逻辑回归。SVM在训练数据量增大到1500个样本左右的时候,测试集上的表现已经非常接近100%,而随机森林和逻辑回归的表现也在95%以上,而决策树和朴素贝叶斯还徘徊在85%左右。但这两个模型所面临的情况十分不同:决策树虽然测试结果不高,但是却依然具有潜力,因为它的过拟合现象非常严重,我们可以通过减枝来让决策树的测试结果逼近训练结果。然而贝叶斯的过拟合现象在训练样本达到1500左右的时候已经几乎不存在了,训练集上的分数和测试集上的分数非常接近,只有在非常少的时候测试集上的分数才能够比训练集上的结果更高,所以我们基本可以判断,85%左右就是贝叶斯在这个数据集上的极限了。可以预测到,如果我们进行调参,那决策树最后应该可以达到90%左右的预测准确率,但贝叶斯却几乎没有潜力了。

在这个对比之下,我们可以看出:贝叶斯是速度很快,但分类效果一般,并且初次训练之后的结果就很接近算法极限的算法,几乎没有调参的余地。也就是说,如果我们追求对概率的预测,并且希望越准确越好,那我们应该先选择逻辑回归。如果数据十分复杂,或者是稀疏矩阵,那我们坚定地使用贝叶斯。如果我们分类的目标不是要追求对概率的预测,那我们完全可以先试试看高斯朴素贝叶斯的效果(反正它运算很快速,还不需要太多的样本),如果效果很不错,我们就很幸运地得到了一个表现优秀又快速的模型。如果我们没有得到比较好的结果,那我们完全可以选择再更换成更加复杂的模型。

学习曲线learning_curve相关推荐

  1. sklearn中的学习曲线learning_curve函数

    learning_curve学习曲线 运行原理 学习曲线. 确定交叉验证的针对不同训练集大小的训练和测试分数. 交叉验证生成器将整个数据集拆分为训练和测试数据中的k次. 具有不同大小的训练集的子集将用 ...

  2. sklearn API 文档 - 0.18 中文翻译

    为什么80%的码农都做不了架构师?>>>    所有函数和类的确切API,由docstrings给出.API会为所有功能提供预期类型和允许的功能,以及可用于算法的所有参数. 原文链接 ...

  3. sklearn API 文档

    所有函数和类的确切API,由docstrings给出.API会为所有功能提供预期类型和允许的功能,以及可用于算法的所有参数. 原文链接 : http://scikit-learn.org/stable ...

  4. 偏差与方差,欠拟合与过拟合

    机器学习的核心在于使用学习算法建立模型,对已建立模型的质量的评价方法和指标不少,本文以准确率(也称为精度)或判定系数(Coefficient of Determination)作为性能指标对模型的偏差 ...

  5. scikit-learn学习笔记-bili莫烦

    bilibili莫烦scikit-learn视频学习笔记 1.使用KNN对iris数据分类 from sklearn import datasets from sklearn.model_select ...

  6. 阿里天池--工业蒸汽预测

    赛题描述: 经脱敏后的锅炉传感器采集的数据(采集频率是分钟级别),根据锅炉的工况,预测产生的蒸汽量. 数据说明: 数据分成训练数据(train.txt)和测试数据(test.txt),其中字段 V0- ...

  7. (六十四)朴素贝叶斯算法

    贝努利朴素贝叶斯 朴素贝叶斯算法会把数据集中的各个特征看作完全独立的,而不考虑特征之间的相关关系.贝努利朴素贝叶斯(Bernoulli Naive Bayes)这种方法比较适合于服从贝努利分布的数据集 ...

  8. sklearn应用总结

    1.导入工具包 2.加载数据 3.数据预处理 4.选择算法训练数据 5.测试数据 #写入csv test.to_csv('test.csv',index=False) 数据标准化sklearn的pre ...

  9. python sklearn.learning_curve 什么是学习曲线?

    学习曲线显示了对于不同数量的训练样本的估计器的验证和训练评分.它可以帮助我们发现从增加更多的训 练数据中能获益多少,以及估计是否受方差误差或偏差误差的影响更大.如果验证分数和训练分数都收敛到一个相对于 ...

最新文章

  1. 对四方继保实施嵌入式Linux开发培训
  2. JavaScript实现页面滚动到div区域div以动画方式出现
  3. Solr router 路由介绍
  4. 【Python】jieba库的使用
  5. DBA突破35岁难题的三种策略
  6. 【专栏精选】实战:动态配置图片
  7. sql server使用维护计划定时备份完整数据库、差异数据库
  8. 教老年人计算机心得体会,老年人教育工作心得体会
  9. 博文视点官方blog正式开张~~~~~~~~~
  10. 找到弹窗广告所在的程序文件位置
  11. C++的O2、O3到底是个什么鬼
  12. VMware16创建虚拟机:无法创建新虚拟机,不具备执行此操作的权限
  13. 2011计算机一级a,2011河北省大学生计算机一级A卷操作步骤
  14. 苹果打字怎么换行_苹果手机回车键是哪个
  15. html制作电影宣传效果,宣传片制作有什么技巧可提高效果
  16. 自动驾驶领域常见英文缩写及其中文含义(不断完善中)
  17. uniapp 点击动画_uni-app 点击元素左右抖动效果
  18. 数学界的扫地僧们(转载)
  19. 【论文笔记】Generative Adversarial Frontal View to Bird View Synthesis - 论文阅读笔记
  20. java eclipse sbt_无法安装sbt-eclipse插件

热门文章

  1. MySQL 是怎样运行的:从根儿上理解 MySQL
  2. java开发的简单新闻系统
  3. RAD Studio 10.4.1新的基于Chromium的Microsoft Edge浏览器的TEdgeBrowser控件用法
  4. Quarkus 实战二:开发REST ful 服务实现简单的curd功能
  5. 在C++中,函数名前的const和函数名后的const的区别
  6. springcloud集成Elasticsearch实现全文搜索的功能
  7. 文件结构操作readdir
  8. 从莉莉丝游戏的战略布局与设计角度,探究《剑与远征》的火爆原因
  9. android背景图加蒙版,Android实现蒙板效果
  10. 假设某袋子中装有3个红球,5个白球,6个黑球,现从该袋子中任意取出8个球,下面程序的功能是输出这8个球中至少有一个白球的所有方案。找出其中错误并改正之。