机器学习之学习曲线绘制Python-skleran

news/2024/5/19 3:20:43/文章来源:https://blog.csdn.net/qq_44386182/article/details/127161245

学习曲线作用:

学习曲线是什么?简单来说,就是用学习曲线(learning curve)来判断模型状态:过拟合还是欠拟合。

学习曲线定义:

学习曲线是根据不同训练集大小,模型在训练集和验证集上的得分变化曲线。

学习曲线通俗解释:

也就是以样本数为横坐标,训练和交叉验证集上的得分(如准确率)为纵坐标。learning curve可以帮助我们判断模型现在所处的状态:过拟合(overfiting / high variance) or 欠拟合。

模型欠拟合、过拟合、 时对应的学习曲线如下图所示:

 

 对上图的解释:

(1)左上角的图中训练集和验证集上的曲线能够收敛。在训练集合验证集上准确率相差不大,却都很差。这说明模拟对已知数据和未知都不能进行准确的预测,属于高偏差(欠拟合)。这种情况模型很可能是欠拟合。可以针对欠拟合采取对应的措施。

欠拟合措施:我们可以增加模型参数(特征),比如,构建更多的特征,减小正则项。采用更复杂的模型。此时通过增加数据量是不起作用的。(为什么?)

(2)右上角的图中模型在训练集上和验证集上的准确率差距很大。说明模型能够很好的拟合已知数据,但是泛化能力很差,属于高方差(过拟合)。模拟很可能过拟合,要采取过拟合对应的措施。

过拟合措施:我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数,即做一下feature selection,挑出较好的feature的subset来做training

(3)理想情况是找到偏差和方差都很小的情况,即收敛且误差较小。如右角的图(完美)
 

Python代码(sklearn库):

train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=[0.1,0.25,0.5,0.75,1])print(train_sizes)print(train_scores)print(test_scores)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
[ 143  359  718 1077 1437]
[[0.93006993 0.94405594 0.95104895 0.87412587 0.95804196][0.8718663  0.90529248 0.91643454 0.88022284 0.90807799][0.8718663  0.86908078 0.90807799 0.88857939 0.8816156 ][0.86258124 0.88857939 0.89415042 0.87093779 0.87743733][0.8559499  0.86986778 0.87543493 0.86499652 0.85247042]]
[[0.79722222 0.73611111 0.68888889 0.76388889 0.74444444][0.81944444 0.86111111 0.83611111 0.83055556 0.825     ][0.82777778 0.86666667 0.84722222 0.85555556 0.85      ][0.83611111 0.89444444 0.85277778 0.85277778 0.84444444][0.825      0.89444444 0.85       0.86111111 0.86944444]]

learning_curve函数中参数解释:

estimator表示我们所使用的的估计器 
X输入的feature
y : 输入的target
CV: 做训练集切割成训练集和验证集的时候的折数,cv=5就是5折交叉验证。
train_sizes: 随着训练集的增大,选择在10%,25%,50%,75%,100%的训练集大小上进行采样。比如(CV= 5)10%的意思是先在训练集上选取10%的数据进行五折交叉验证。

返回值解释:

train_sizes:为列表。对应10%,25%,50%,75%,100%的数据量。比如训练集为100,则10%的返回量为10.
train_scores:如上为numpy数组,第一行五个数据为抽取原始训练集10%的数据做的五折交叉验证的训练集指标。,第二行五个数据为抽取原始训练集25%的数据做的五折交叉验证的训练集指标。等等。
test_scores:如上为numpy数组,第一行五个数据为抽取原始训练集10%的数据做的五折交叉验证的验证集指标。,第二行五个数据为抽取原始训练集25%的数据做的五折交叉验证的验证集指标。等等。

 完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
from sklearn.model_selection import ShuffleSplit
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_digitsdef plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, n_jobs=None):'''绘制出模型的学习曲线'''plt.title(title)if ylim is not None:plt.ylim(*ylim)train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=[0.1,0.25,0.5,0.75,1])train_scores_mean = np.mean(train_scores, axis=1)train_scores_std = np.std(train_scores, axis=1)test_scores_mean = np.mean(test_scores, axis=1)test_scores_std = np.std(test_scores, axis=1)plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1,color="r", )  # 把模型准确性的平均值的上下标准差的空间里用颜色填充plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1,color="g", )  # 把模型准确性的平均值的上下标准差的空间里用颜色填充plt.plot(train_sizes, train_scores_mean, "o-", color="r", label="Training score")plt.plot(train_sizes, test_scores_mean, "o-", color="g", label="Cross-validation score")plt.legend(loc="best")return plt# 加载数据集
X, y = load_digits(return_X_y=True)
cv1 = ShuffleSplit(n_splits=5, test_size=0.2, random_state=0)  # 数据集分成5份,每份中测试集比例为0.2
estimator1 = GaussianNB()title1 = "(Naive Bayes)"
plt.subplot(121)
plot_learning_curve(estimator1, title1, X, y, ylim=(0.7, 1.01), cv=cv1, n_jobs=4)
plt.show()

 由图可得:随着样本数抽取增加模型有着过拟合向刚刚好过渡

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_18307.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机搭建Redis 远程密码可访问,并且后台运行

1、关闭系统防火墙 操作指令备注查看防火墙状态systemctl status firewalld / firewall-cmd --state暂时关闭防火墙systemctl stop firewalld永久关闭防火墙(禁用开机自启)systemctl disable firewalld下次启动,才生效暂时开启防火墙systemctl start firewalld永久开启防火墙(…

基于python+django框架+Mysql数据库的校园新生报到系统设计与实现

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于python的校园新生报到系统,整体网站系统基于B/S架构,技术上使用基于python的Django框架来实现;通过后台添加设置校园信息、录入和管理校园资讯、校园风光、学校分院信…

Linux 用户管理 文件目录指令 时间日期指令 搜索查找类 解压压缩类

目录 用户管理 添加用户: 指定/修改密码 删除用户 查询用户信息指令 切换用户 查看当前用户/登录用户 用户组 修改用户的组 用户和组相关文件 指定运行级别1 指定运行级别2 找回root密码 帮助指令 文件目录指令 文件目录类 pwd 指令 ls 指令 cd 指令 mkdir指…

Android Automotive(五) CarService

Android Automotive(五) CarService CarService是Android Automotive在系统框架层的核心服务。它类似SystemServer在服务内部管理着数十个子服务。 启动流程 CarService是由SystemServer启动的,启动流程如下。 SystemServer 启动CarServi…

【GNN从入门到精通】第一章 图的基本知识

文章目录一、图的表示1.1 什么是图?二、图的特征2.1 子图2.2 连通分量2.3 接通图2.3.1 无向图连通图2.3.2 有向连通图2.4 最短路径2.5 图直径三、图中心性3.1 度中心性3.2 特征向量中心性3.3 中介中心性3.4 连接中心性四、网页排序算法4.1 PageRank4.2 HITS4.3 例子…

游程描述的任意区域最小旋转矩形算法实现

效果 采用游程描述了多个区域,经过算法计算,找到最小包围矩形。 白色是指定的区域,黄色是该区域的最小旋转矩形。 算法原理 有时候算法不一定很高深,只要把道理点破,实现起来很简单,难的是最开始的算法构思过程。 区域最小旋转矩形的算法原理也很简单:将区域从0到90…

Dapper 在继承层次结构中处理数据

Dapper 包含一项功能,用于处理可能逐行映射到不同类型的数据。在处理使用Table Per Hierarchy存储模式的继承层次结构时,此功能特别有用,即一个表用于表示层次结构中的所有类。“鉴别器”列用于区分类型。 以下类定义表示基于抽象Contract类型的继承层次结构。还定义了三种派…

16.python实现线性单元和梯度下降-10月4日编程作业-Relu函数

目录 课堂笔记 代码实现1 运行结果1 代码实现2 评定一个学生的综合绩点 运行结果2 小结 课堂笔记 代码实现1 from cgi import print_environ from functools import reduce import numpy as np#定义感知器类 class perceptron(object):#感知器初始化函数(参数个数&…

ASP.NET Core--项目基础与搭建

文章目录项目基础与搭建创建项目ViewImports.cshtmlappsettings.json执行顺序Program.cs类startup.cs类项目基础与搭建 创建项目 ViewImports.cshtml ViewImports文件可以影响文件夹层次结构中的所有视图 ViewImports文件是我们可以编写代码并放置通用指令以引入我们的视图所需…

数据结构 - 单链表

文章目录一、单链表1.单链表的定义1.1概念介绍2.如何用代码来定义一个单链表*知识点3.单链表的插入删除未完待续...一、单链表 1.单链表的定义 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的&…

Halcon快速入门笔记3

read_image (Image, ‘surface_scratch’) invert_image (Image, ImageInverted) get_image_size (ImageInverted, Width, Height) gen_sin_bandpass (ImageBandpass, 0.4, ‘none’, ‘dc_center’, Width, Height) fft_generic (ImageInverted, ImageFFT, ‘to_freq’, -…

【JavaWeb】前置知识:CSS与JavaScript知识汇总

本文被 系统学习JavaWeb 收录,点击订阅 写在前面 大家好,我是黄小黄!经过上一篇 从Html入门JavaWeb 的学习,想必大家对标签都有了一定的认识。本文将通过案例,讲解CSS与JavaScript的基础知识,文章内容比较…

SSM+Vue个人健康管理系统 个人健康档案系统 个人健康信息管理系统Java

SSM+Vue个人健康管理系统 个人健康档案系统 个人健康信息管理系统Java💖🔥作者主页:计算机毕设老哥🔥 💖精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻Java实战项目专栏 Python实战项目专栏 安卓实战项目专栏 微信小程序实战项目专栏目录Java实战项…

【数据结构从0到1】第九篇:图

文章目录一、图的基本概念二、图的存储结构2.1 邻接矩阵2.2 邻接表三、图的遍历3.1 图的广度优先遍历3.2 图的深度优先遍历四、最小生成树4.1 Kruskal算法4.2 Prim算法五、最短路径5.1 单源最短路径--Dijkstra算法5.2 单源最短路径--Bellman-Ford算法5.3 多源最短路径--Floyd-W…

基于Java开发的五子棋游戏APP设计与实现

目录 一、项目概述 1 (一)安卓游戏发展趋势 1 (二)开发安卓游戏的意义 1 二、项目需求分析 2 (一)功能需求分析 2 (二)性能需求分析 2 (三)可行性分析 3 &…

【点云处理】点云法向量估计及其加速(1)

点云法向量是3D点云一个极其重要的几何表面特征,众多的点云处理算法都依赖精确的法向量估计,例如点云分割,点云去噪等。在自动驾驶领域,面对特殊场景我们主要依赖点云法向量进行场景分割。估计点云法向量需要得到该点的邻域内点&a…

nodejs+vue+elementui幼儿园管理系统python java php

本设计主要分为学生家长,管理员和教师三个角色,其中学生家长功能有注册登查看幼儿信息,查看缴费信息,申请请假,查看体检信息等;教师的功能有登陆系统,对自己的幼儿学生,班级&#xf…

谷粒商城 集群篇 (二) --------- K8s 集群安装

目录一、kubeadm二、前置要求三、部署步骤四、环境准备五、安装环境1. 安装 docker① 卸载 docker② 安装 Docker-CE③ 配置 docker 加速④ 启动 docker & 设置 docker 开机自启2. 添加阿里云 yum 源3. 安装 kubeadm,kubelet 和 kubectl六、部署 k8s-master1. m…

STL之string

更新string,这段时间学习了stl,发现共性的东西很多,string,vector,list等,弄懂他们的逻辑框架很重要,其实也是stl的规范,文章更新内容不管这些函数怎么用,就从大逻辑来讲…

Java项目:SSH土地信息管理系统平台

作者主页:夜未央5788 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目包含管理员与用户两种角色; 管理员角色包含以下功能: 管理员登录,用户管理,分类管理,档案管理等功能。 用户角色包含…