过拟合

过拟合相当于一个人只会读书,却不知如何利用知识进行变通。
相当于他把考试题目背得滚瓜烂熟,但一旦环境稍微有些变化,就死得很惨。

从图形上看,类似下图的最右图:

从数学公式上来看,这个曲线应该是阶数太高的函数,因为一般任意的曲线都能由高阶函数来拟合,它拟合得太好了,因此丧失了泛化的能力。

用Learning curve 检视过拟合

首先加载digits数据集,其包含的是手写体的数字,从0到9:

# 加载数据
digits = load_digits()
X = digits.data
y = digits.target

然后用SVC(支持向量机)对手写体数字进行分类,当然,这里要介绍的核心函数是learning_curve,先上代码看看:

# 导入支持向量机
from sklearn.svm import SVC
model = SVC(gamma=0.001)train_sizes, train_loss, test_loss = learning_curve(model, X, y, cv=10, scoring='neg_mean_squared_error', train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
# 平均每一轮所得到的平均方差(共5轮,分别为样本10%、25%、50%、75%、100%)
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)

在learning_curve中设置了十一法的数据,同时在打分时使用了neg_mean_squared_error方式,也就是方差值,因此这个最后的得分值是负数;train_sizes指定了5轮检视学习曲线(10%, 25%, 50%, 75%, 100%):

最后,我们把根据每轮的训练集大小对于最终得分的影响程度画个图,相当于做题数量的多少跟最终考试成绩的关系图:

# 可视化图形
import matplotlib.pyplot as plt
plt.plot(train_sizes, train_loss_mean, label="Train")
plt.plot(train_sizes, test_loss_mean, label="Test")
plt.legend()
plt.show()

显示图形为:

看起来随着做题数量的增加,考试成绩越来越好了(损失函数的值越来越小了),并且考试成绩在慢慢逼近平常的训练成绩。

完整的代码如下:

from sklearn.datasets import load_digits# 加载数据
digits = load_digits()
X = digits.data
y = digits.target# 加载学习曲线模块
from sklearn.model_selection import learning_curve
import numpy as np# 导入支持向量机
from sklearn.svm import SVC
model = SVC(gamma=0.001)train_sizes, train_loss, test_loss = learning_curve(model, X, y, cv=10, scoring='neg_mean_squared_error', train_sizes=[0.1, 0.25, 0.5, 0.75, 1])
# 平均每一轮所得到的平均方差(共5轮,分别为样本10%、25%、50%、75%、100%)
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)# 可视化图形
import matplotlib.pyplot as plt
plt.plot(train_sizes, train_loss_mean, label="Train")
plt.plot(train_sizes, test_loss_mean, label="Test")
plt.legend()
plt.show()

如果我们把上面代码中SVC参数的gamma值设置为0.1,显示出的图形为:

在上面的图形中,我们会发现再增加训练集的数据并没有使测试集的损失值下降,相当于一个人按照他的学习方式做训练题已经够多了,你做更多的训练题都无法提高你的考试成绩了,这时可能需要考虑的是稍微改变一下你的学习方法说不定就能提高考试成绩呢。
这也说明了,在某些情况下题海战术不一定奏效了。

在机器学习中表示为所学到的模型可能太复杂了,产生了过拟合(过拟合表现为训练集的损失函数在下降,但测试集的损失函数不降反升),不具备泛化能力,例如下图中绿色曲线就是一个过拟合的表现:

相应的损失函数曲线显示如下所示:

因此如果我们想要查看是否有过拟合,可以通过learning_curve函数来进行并以可视化的方式来查看结果。

转载于:https://www.cnblogs.com/dreampursuer/p/7979129.html

sklearn交叉验证2-【老鱼学sklearn】相关推荐

  1. sklearn 交叉验证与参数寻优

    3.3. Model evaluation: quantifying the quality of predictions - scikit-learn 0.19.2 documentation sk ...

  2. Sklearn——交叉验证(Cross Validation)

    文章目录 1.前言 2.非交叉验证实验 3.交叉验证实验 4.准确率与平方误差 4.1.准确率实验 4.2.均方误差实验 5.Learning curve 检查过拟合 5.1.加载必要模块 5.2.加 ...

  3. python机器学习库sklearn——交叉验证(K折、留一、留p、随机)

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 学习预测函数的参数,并在相 ...

  4. 机器学习- Sklearn (交叉验证和Pipeline)

    前面一节咱们已经介绍了决策树的原理已经在sklearn中的应用.那么这里还有两个数据处理和sklearn应用中的小知识点咱们还没有讲,但是在实践中却会经常要用到的,那就是交叉验证cross_valid ...

  5. 机器学习笔记——sklearn 交叉验证(Cross-validation)

    sklearn cross validation:https://scikit-learn.org/stable/modules/cross_validation.html 交叉验证(Cross Va ...

  6. 分类器的sklearn交叉验证之我的理解

    sklearn的交叉验证是机器学习中重要的一步,主要用来评估模型的误差,但是其中理解起来还是有点困难,尤其是cv的设置,如果过大就会报错. 网上有关于交叉验证的基础知识点,我就不介绍了,我主要从实践中 ...

  7. python搭建numpy_python开发环境搭建及numpy基本属性-【老鱼学numpy】

    目的 本节我们将介绍如何搭建python的开发环境以及numpy的基本属性,这样可以检验我们的numpy是否安装正确了. python开发环境的搭建 工欲善其事必先利其器,我用得比较顺手的是Intel ...

  8. numpy的索引-【老鱼学numpy】

    简单的索引值 import numpy as np a = np.arange(3, 15).reshape(3, 4) print("a=") print(a)print(&qu ...

  9. numpy的array合并-【老鱼学numpy】

    概述 本节主要讲述如何把两个数组按照行或列进行合并. 按行进行上下合并 例如: import numpy as np a = np.array([1, 1, 1]) b = np.array([2, ...

  10. tensorflow RNN循环神经网络 (分类例子)-【老鱼学tensorflow】

    之前我们学习过用CNN(卷积神经网络)来识别手写字,在CNN中是把图片看成了二维矩阵,然后在二维矩阵中堆叠高度值来进行识别. 而在RNN中增添了时间的维度,因为我们会发现有些图片或者语言或语音等会在时 ...

最新文章

  1. ASP.NET Core 模型验证的一个小小坑
  2. 使用core data
  3. maven install (window 7)
  4. Java编程基础阶段笔记 day 07 面向对象编程(上)
  5. C#语言使用多态(接口与override) ——帮您剔除对面向对象多态性的疑惑
  6. MATLAB提取矩阵中的一部分
  7. 【MySQL】MySQL EXPLAIN用法和结果
  8. Java类加载器 以及类加载器的委托模型
  9. mysql意外关闭xampp_错误:MySQL意外关闭xampp 3.2.4
  10. Linux内存监控日记,Linux 内存监控
  11. Oracle PL/SQL游标的学习
  12. 手机射频工程师培训大纲
  13. 自动化运维工具ansible安装及使用
  14. LM74700-Q1
  15. xlsxwriter去掉网格线_python 中 xlsxwriter 模块的使用
  16. Java泛型_自定义泛型类
  17. 个人网站、公众号申请微信个人支付接口
  18. 如何成为稀缺性人才?
  19. python伪原创工具开发_现在有哪些好用的伪原创工具?
  20. uni-app返回上一层页面后数据刷新重置解决办法,uni-app页面不刷新,强制刷新页面方法!

热门文章

  1. 怒:排序这样的最基本功能都错了,你们竟然不感到羞耻?不反思工作?
  2. CENTOS上编译FreeSwitch
  3. 本博客排名从37533到984的各种数据记录
  4. windows单实例的办法
  5. 藩国进贡,朝庭厚赐,吃亏了吗?
  6. 结构体中的map尽量使用指针,否则不要使用memset
  7. 买的是ARM指令集授权,不是已设计好的CPU核?
  8. python实例方法不可以用类调用_为什么python静态/类方法不可调用?
  9. 士林变频器面板如何调速度_必读干货丨西威变频器DRIVE OVERLOAD故障处理
  10. c++ primer plus 复合类型之数组