模型评估:模型状态评估

模型状态

过拟合和欠拟合

过拟合:在训练集上的准确率较高,而在测试集上的准确率较低

欠拟合:在训练集和测试集上的准确率均较低

学习曲线(Learning Curves)

1)概念概述

学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,以及增大训练集是否可以减小过拟合。

先明确两个概念:

偏差:指的是分类器对训练集和测试集的准确率与基准分类器的准确率有比较大的差距,是分类器与其他分类器的比较

方差:指的是分类器对训练集的准确率和测试集的准确率有比较大的差距,是分类器自身的比较

当训练集和测试集的准确率收敛且都收敛到较低准确率时,与基准分类器(红线表示)相比为高偏差。

左上角表示分类器的偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合。

我们可以增加模型参数,比如,构建更多的特征,减小正则项。

此时通过增加数据量是不起作用的。

训练集和测试集的准确率与基准分类器有差不多的准确率,说明偏差较低,但在测试集和训练集的准确率差距较大,为高方差。

当训练集的准确率比其他独立数据集上的测试结果的准确率要高时,一般都是过拟合。

右上角方差很高,训练集和验证集的准确率相差太多,应该是过拟合。

我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数。

理想情况是是找到偏差和方差都很小的情况,即收敛且误差较小。

2)学习曲线的绘制:高偏差和高方差

import numpy as np

import matplotlib.pyplot as plt

from sklearn.naive_bayes import GaussianNB

from sklearn.svm import SVC

from sklearn.datasets import load_digits

from sklearn.model_selection import learning_curve

from sklearn.model_selection import ShuffleSplit

def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)):

plt.figure()

plt.title(title)

if ylim is not None:

plt.ylim(*ylim)

plt.xlabel("Training examples")

plt.ylabel("Score")

#对于朴素贝叶斯,shape(train_sizes)=(1,5),shape(train_scores)=(5,100),shape(test_scores)=(5,100)

#对于支持向量机,shape(train_sizes)=(1,5),shape(train_scores)=(5,10),shape(test_scores)=(5,10)

train_sizes, train_scores, test_scores = learning_curve( estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)

#颜色填充,宽度是2倍的标准差

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.grid()

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

digits = load_digits()

X, y = digits.data, digits.target

#高偏差示例:朴素贝叶斯

title = "Learning Curves (Naive Bayes)"

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)

#高方差示例:SVM

title = "Learning Curves (SVM, RBF kernel, $\gamma=0.001$)"

#定义交叉验证

cv = ShuffleSplit(n_splits=15, 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)

plt.show()

原文地址:https://www.cnblogs.com/yongfuxue/p/10095401.html

时间: 2024-10-08 01:54:19

模型评估:模型状态评估的相关文章

图像配准建立仿射变换模型并用RANSAC算法评估

当初选方向时就因为从小几何就不好.缺乏空间想像能力才没有选择摄影测量方向而是选择了GIS.昨天同学找我帮他做图像匹配,这我哪里懂啊,无奈我是一个别人有求于我,总是不好意思开口拒绝的人.于是乎就看着他给的一章节内容开始写程序了,今天总算给他完成了.做的比较简单,中间也遇到了不少问题,尤其是计算量大的问题,由于老师给的数据是粗配准过的数据, RANSAC算法评估时就简化了下. 理论内容: 第5章 图像配准建立几何变换模型 特征点建立匹配关系之后,下一步就是求解图像之间的变换关系.仿射变换能够很好的表

信用评分怎么算出来的?偷偷给你一份客户信用等级简易评估模型.......

信用评分怎么算出来的?偷偷给你一份客户信用等级简易评估模型....... 2016-06-20 信用知识公益平台 对于像葵花君这样的菜鸟而言,心中始终萦绕着一个硕大的问号 信用等级到底是怎么评估出来的? 难道是夜观星象么? 今天偷偷给你一份客户信用等级简易评估模型....... 客户的信用等级简易评估办法,就是依据一系列实测指标,经评估打分综合划分出客户的信用等级. 为计算方便采用满分为10分制,根据对征信资料的审查核实,对每一项指标打分后综合计算平均值,最后再加权计算综合得分. 一 .主体资格

scikit-learn 中常用的评估模型

一,scikit-learn中常用的评估模型 1.评估分类模型: ? 2.评估回归模型: ? 二.常见模型评估解析: ?对于二分类问题,可将样例根据其真实类别和分类器预测类别划分为:(T,F表示预测的正确与错误性,P,N表示预测的正类和负类) ?真正例(TruePositive,TP):真实类别为正例,预测类别为正例. ?假正例(FalsePositive,FP):真实类别为负例,预测类别为正例. ?假负例(FalseNegative,FN):真实类别为正例,预测类别为负例. ?真负例(True

【火炉炼AI】机器学习006-用决策树回归器构建房价评估模型

[火炉炼AI]机器学习006-用决策树回归器构建房价评估模型 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 最近几十年,房价一直是中国老百姓心中永远的痛,有人说,中国房价就像女人的无肩带文胸,一半人在疑惑:是什么支撑了它?另一半人在等待:什么时候掉下去? 而女人,永不可能让它掉下来.就算快掉下来了,提一提还是又上去了..... 虽然我们不能预测中国房价什么时候崩盘,但是却可以用机器学

R_Studio(cart算法决策树)对book3.csv数据用测试集进行测试并评估模型

对book3.csv数据集,实现如下功能: (1)创建训练集.测试集 (2)用rpart包创建关于类别的cart算法的决策树 (3)用测试集进行测试,并评估模型 book3.csv数据集 setwd('D:\\data') list.files() dat=read.csv(file="book3.csv",header=TRUE) #变量重命名,并通过x1~x11对class属性进行预测 colnames(dat)<-c("x1","x2"

他山之石:软件调试排错阶段的可靠性评估模型

在硬 件可靠性 理 论 中 , 典 型 的失效 率 又( t ) 函 数是 一条 形 似“ 浴 盆” 的曲线 . 浴 盆 曲线 由三 段 构成 : 早 期故 障期 . 偶 然故 障期 . 耗损 故 障期 . 这种 曲线描 述 了事物 生命期 的 整个过 程 , 而 且具 有普遍 性 . 对 软件来 说 , 在调 试排错 阶 段 , 故 障易 被发现 , 也 易于 纠正 , 而且 在纠 正 中引 人新 故 障的概率 较小 , 因此 , 在 此 阶段 , 软件 失效率 是递 减 的 ; 当软件 中存

Java线程模型、线程状态 - 线程(1)

1. 概述 众所周知,线程 - Thread 是比进程 - Progress 更轻量级的调度单位.简单来说,引入线程带来的好处是: 可以把一个进程 的资源分配和执行调度分开,各个线程 既可以共享进程 资源(内存地址.文件I/O等),又可以独立调度. 线程实现方式: 主流的操作系统都实现了线程 ,而编程语言一般会提供关于线程 的统一API操作.那么,编程语言如何去调用系统线程 呢?这方面主要有3种方式: 使用内核线程 - Kernel Thread. 一对一线程模型 ,这个最重要,下面详细讲. 使

TensorFlow 图像分类模型 inception_resnet_v2 模型导出、冻结与使用

1. 背景 作为一名深度学习萌新,项目突然需要使用图像分类模型去作分类,因此找到了TensorFlow的模型库,使用它的框架进行训练和后续的操作,项目地址:https://github.com/tensorflow/models/tree/master/research/slim. 在使用真正的数据集之前,我首先使用的是它提供的flowers的数据集,用的模型是inception_resnet_v2,因为top-5 Accuracy比较高嘛. 然后我安装flowers的目录结构,将我的数据按照类

网络编程之IO模型——IO模型比较分析

网络编程之IO模型--IO模型比较分析 IO模型比较分析 到目前为止,已经将四个IO Model都介绍完了.现在回过头来回答最初的那几个问题:blocking和non-blocking的区别在哪,synchronous IO和asynchronous IO的区别在哪. 先回答最简单的这个:blocking vs non-blocking.前面的介绍中其实已经很明确的说明了这两者的区别.调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kerne

多路复用I/O模型poll() 模型 代码实现

多路复用I/O模型poll() 模型 代码实现 poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式. 不同的是poll()没有描述符数目的限制. 是通过struct pollfd结构体,对每个描述符进行轮询的 struct pollfd fdarray { int fd;    /*文件描述符*/ short events; /*表示等待的事件*/ short revents;/*表示返回事件即实际发生的事件*/ }; data.h #ifndef DATA_H #d