关键问题是:假如模型效果不好,应该如何改善?答案可能有以下几种。用更复杂 / 更灵活的模型。

用更简单 / 更确定的模型。

采集更多的训练样本。

为每个样本采集更多的特征。

问题的答案往往与直觉相悖。换一种更复杂的模型有时可能产生更差的结果,增加更多的训练样本也未必能改善性能!改善模型能力的高低,是区分机器学习实践者成功与否的标志。

01/偏差与方差的均衡

“最优模型”的问题基本可以看成是找出偏差与方差平衡点的问题。

下图显示的是对同一数据集拟合的两种回归模型。

显然,这两个模型拟合得都不是很好,但它们的问题却是不一样的。

左边的模型希望从数据中找到一条直线。但由于数据本质上比直线要复杂,直线永远不可能很好地描述这份数据。这样的模型被认为是对数据欠拟合;也就是说,模型没有足够的灵活性来适应数据的所有特征。另一种说法就是模型具有高偏差。

右边的模型希望用高阶多项式拟合数据。虽然这个模型有足够的灵活性可以近乎完美地适应数据的所有特征,但与其说它是十分准确地描述了训练数据,不如说它是过多地学习了数据的噪音,而不是数据的本质属性。这样的模型被认为是对数据过拟合,也就是模型过于灵活,在适应数据所有特征的同时,也适应了随机误差。另一种说法就是模型具有高方差。

现在再换个角度,如果用两个模型分别预测 y 轴的数据,看看是什么效果。在下图中,浅红色的点是被预测数据集遗漏的点。

这个分数是 R 2,也称为判定系数

(https://en.wikipedia.org/wiki/Coefficient_of_determination),用来衡量模型与目标值均值的对比结果。R 2 = 1 表示模型与数据完全吻合,R 2 = 0 表示模型不比简单取均值好,R 2 为负表示模型性能很

差。从这两个模型的得分可以得出两条一般性的结论。

对于高偏差模型,模型在验证集的表现与在训练集的表现类似。

对于高方差模型,模型在验证集的表现远远不如在训练集的表现。

如果我们有能力不断调整模型的复杂度,那么我们可能希望训练得分和验证得分如下图所示。

下图通常被称为验证曲线,具有以下特征。训练得分肯定高于验证得分。一般情况下,模型拟合自己接触过的数据,比拟合没接触过的数据效果要好。

使用复杂度较低的模型(高偏差)时,训练数据往往欠拟合,说明模型对训练数据和新数据都缺乏预测能力。

而使用复杂度较高的模型(高方差)时,训练数据往往过拟合,说明模型对训练数据预测能力很强,但是对新数据的预测能力很差。

当使用复杂度适中的模型时,验证曲线得分最高。说明在该模型复杂度条件下,偏差与方差达到均衡状态。

02/Scikit-Learn验证曲线

下面来看一个例子,用交叉检验计算一个模型的验证曲线。这里用多项式回归模型,它是线性回归模型的一般形式,其多项式的次数是一个可调参数。例如,多项式次数为 1 其实就是将数据拟合成一条直线。若模型有参数 a 和 b,则模型为:

多项式次数为 3,则是将数据拟合成一条三次曲线。若模型有参数a、b、c、d,则模型为:

推而广之,就可以得到任意次数的多项式。在 Scikit-Learn 中,可以用一个带多项式预处理器的简单线性回归模型实现。我们将用一个管道命令来组合这两种操作:from sklearn.preprocessing import PolynomialFeatures

from sklearn.linear_model import LinearRegression

from sklearn.pipeline import make_pipeline

def PolynomialRegression(degree=2, **kwargs):

return make_pipeline(PolynomialFeatures(degree),

LinearRegression(**kwargs))

现在来创造一些数据给模型拟合:import numpy as np

def make_data(N, err=1.0, rseed=1):

rng = np.random.RandomState(rseed)

X = rng.rand(N, 1) ** 2

y = 10 - 1. / (X.ravel() + 0.1)

if err > 0:

y += err * rng.randn(N)

return X, y

X, y = make_data(40)

通过数据可视化,将不同次数的多项式拟合曲线画出来%matplotlib inline

import matplotlib.pyplot as plt

import seaborn; seaborn.set()

X_test = np.linspace(-0.1, 1.1, 500)[:, None]

plt.scatter(X.ravel(), y, color='black')

axis = plt.axis()

for degree in [1, 3, 5]:

y_test = PolynomialRegression(degree).fit(X, y).predict(X_test)

plt.plot(X_test.ravel(), y_test, label='degree={0}'.format(degree))

plt.xlim(-0.1, 1.0)

plt.ylim(-2, 12)

plt.legend(loc='best');

例子中控制模型复杂度的关键是多项式的次数,它只要是非负整数就可以。那么问题来了:究竟多项式的次数是多少,才能在偏差(欠拟合)与方差(过拟合)间达到平衡?

我们可以通过可视化验证曲线来回答这个问题——利用 Scikit-Learn 的validation_curve 函数就可以非常简单地实现。只要提供模型、数据、参数名称和验证范围信息,函数就会自动计算验证范围内的训练得分和验证得分。from sklearn.model_selection import validation_curve

degree = np.arange(0,21)

train_score, val_score = validation_curve(PolynomialRegression(),#模型

X, y,#数据

'polynomialfeatures__degree',

degree,#验证范围

cv=7)#验证次数

plt.plot(degree, np.median(train_score,1), color='blue', label='training score')

plt.plot(degree, np.median(val_score,1), color='red', label='validation score')

plt.legend(loc='best')

plt.ylim(0,1)

plt.xlabel('degree')

plt.ylabel('score');

这幅图可以准确显示我们想要的信息:训练得分总是比验证得分高;训练得分随着模型复杂度的提升而单调递增;验证得分增长到最高点后由于过拟合而开始骤降。

从验证曲线中可以看出,偏差与方差均衡性最好的是三次多项式。我们可以计算结果,并将模型画在原始数据上。plt.scatter(X.ravel(), y)

lim = plt.axis()

y_test = PolynomialRegression(3).fit(X, y).predict(X_test)

plt.plot(X_test.ravel(), y_test);

plt.axis(lim);

虽然寻找最优模型并不需要我们计算训练得分,但是检查训练得分与验证得分之间的关系可以让我们对模型的性能有更加直观的认识。

均值方差模型python_Python机器学习之“选择最优模型”相关推荐

  1. python分类算法评估模型_Python机器学习(sklearn)——分类模型评估与调参总结(下)...

    21.集成方法有随机森林(random forest)和梯度提升树(gradient boosted decision tree)GBDT 随机森林中树的随机化方法有两种: (1)通过选择用于构造树的 ...

  2. 支持向量机回归python_python 机器学习之支持向量机非线性回归SVR模型

    本文介绍了python 支持向量机非线性回归SVR模型,废话不多说,具体如下: import numpy as np import matplotlib.pyplot as plt from skle ...

  3. 机器学习之sklearn-KNN近邻算法分类小案例(乳腺癌预测最优模型)

    (案例):用sklearn包实现knn分类小案例,通过交叉验证网格搜索获取最优参数模型,进行参数评估. 导包: from sklearn.datasets import load_breast_can ...

  4. 格兰因果模型可以分析哪些东西_结构方程模型(SEM)和分段结构方程模型

    结构方程模型(SEM)简介自然或社会现象是复杂的,但在研究中经常将其简化为简单的模型,类似y~x这样的形式.当然并不是说这种简单模型有什么问题,只是有些情况下y实际上并非x的直接作用结果,y通常受到许 ...

  5. 《机器学习》 —— 第二章:模型评估与选择 学习笔记

    2.1 经验误差与过拟合 把分类错误的样本数占样本总数的比例称为"错误率"(error rate),即如果在m个样本中有a个样本分类错误,则错误率E=a/m:相应的,1-a/m称为 ...

  6. 机器学习_周志华_西瓜书_学习笔记_第二章--模型的评估与选择

    2 模型的评估与选择 2.1 误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error).定义: 在训练集上的误差称为训练误差(training error)或经验 ...

  7. 机器学习总结之第二章模型评估与选择

    [第2章 模型评估与选择] [一.知识点归纳] 一.经验误差与过拟合 [分类]:对是离散值的结果进行预测. [回归]:对是连续值的结果进行预测. 分类和回归属于监督学习. [错误率]:分类错误的样本数 ...

  8. Stanford机器学习笔记-6. 学习模型的评估和选择

    6. 学习模型的评估与选择 Content 6. 学习模型的评估与选择 6.1 如何调试学习算法 6.2 评估假设函数(Evaluating a hypothesis) 6.3 模型选择与训练/验证/ ...

  9. R︱mlr包挑选最适机器学习模型+变量评估与选择(案例详解)

    一.R语言的mlr packages选择最适机器学习模型 install.packages("mlr")之后就可以看到R里面有哪些机器学习算法.在哪个包里面. a<-list ...

最新文章

  1. ffmpeg解码视频存为BMP文件
  2. Navicat Premium 12全系列
  3. 根据DNS的A记录负载均衡web服务请求
  4. BZOJ 1003: [ZJOI2006]物流运输trans
  5. 桑文锋对话菲利普·科特勒:数字化是营销的未来
  6. idea破解,Maven配置web步骤
  7. 上传文件的input问题以及FormData特性
  8. centos7 iptables 端口转发 保存_iptables 防火墙
  9. Bean的scope属性
  10. dll可以在linux下使用吗_Linux下安装和使用杀毒软件AntiVir
  11. h5移动端局部放大效果
  12. ROS学习笔记一(ROS的catkin工作空间)
  13. 数据挖掘:模型选择——SVM
  14. java中a 和 a_Java中的a++和++a的区别 | 学步园
  15. java.util.concurrent.locks.LockSupport
  16. 高等数学 · 希腊符号
  17. 阿里云国际版云服务器Linux和Windows操作系统的链路测试工具-Unirech
  18. ros在哪里添加虚拟服务器,ros路由 虚拟服务器设置
  19. 开发一种提供医学药学常用公式图片的文档编辑器插件
  20. android七牛多张图片上传

热门文章

  1. 为什么真空中光速是恒定的?
  2. 网络安全加固的必要性
  3. VMware ESXi支持配置最大值
  4. TOM邮箱收件人、抄送人、密送人、群发单显有什么区别
  5. 基于python的学生信息管理系统文献综述_学生信息管理系统的文献综述
  6. C++ string乱码可能解决方案
  7. 修改win7的登录界面背景与关机背景
  8. 罗杨美慧 20190919-2 功能测试
  9. php计算股票均线,均线怎么算?均线的计算方法详解
  10. 记录一次服务器被植入挖矿脚本事件