机器学习的练功方式(五)——模型选择及调优

文章目录

  • 5 模型选择及调优
    • 5.1 数据增强
    • 5.2 过拟合
    • 5.3 交叉验证
    • 5.4 超参数搜索——网格搜索

5 模型选择及调优

5.1 数据增强

有时候,你和你的老板说你数据不够,它是不会理你的。老板会发问:为什么你是做机器学习的要那么多数据干嘛,让机器去做不就行了。

对于这种问题有时候即使无语但你也不能正面拆穿,否则你的工作就不用干了。而为了解决数据集不足的问题,我们通常会采用数据增强

这个名词看似高大上,实际上就是把数据集经过某些变换,从而产生新的数据集。

这种方法多用于图片识别上,将图片结果左右对称变换,或反转,或偏移角度来达到拥有更多数据集的目的。

5.2 过拟合

统计学习的目的是使学到的模型不仅对已知数据而且对未知数据都能有很好的预测能力。不同的学习方法会给出不同的模型。当损失函数给定时,基于损失函数的模型的训练误差和模型的测试误差就自然成为学习方法评估的标准。注意,统计学习方法具体采用的损失函数未必是评估时使用的损失函数。当然,让两者一致是比较理想的。

训练误差的大小,对判断给定的问题是不是一个容易学习的问题是有意义的,但本质上不重要。测试误差反映了学习方法对未知的测试数据集的预测能力,是学习中的重要概念。显然,给定两种学习方法,测试误差小的方法具有更好的预测能力,是更有效的方法。

通常将学习方法对未知数据的预测能力称为泛化能力

当假设空间含有不同复杂度的模型时,就要面临模型选择的问题。我们希望选择或学习一个合适的模型。如果在假设空间中存在真模型,那么所选择的模型应该逼近真模型。具体地,所选择的模型要与真模型的参数个数相同,所选择的模型的参数向量与真模型的参数向量相近。

如果一味追求提高对训练数据的预测能力,所选模型的复杂度则往往会比真模型更高。这种现象称为过拟合。过拟合是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。可以说模型选择旨在避免过拟合并提高模型的预测能力。

也就是说,上述的话翻译成人话就是,我们不要那种能够完全贴合训练集的函数,那种函数训练出来训练集在上面跑挺牛逼,一到测试集就不行了。我们需要的是那种在训练集跑的差不多,对于测试集跑出来效果也很好的那种函数。

image-20220306172629610

现在我们有以上的数据集,我们要选择一个模型去拟合真模型,也就是M=0时图中画的曲线,那条曲线即为真模型。当然了,根据我们上面所说,我们要的是做到“差不多”即可,我们不要精度完全一样或者超过真模型。

当我们M=1,选择的是一条直线,这种模型其实是罔顾事实的做法,我们完全不考虑拟合的效果,一上来就乱套模型,这样会导致拟合数据的效果贼差。这种在古老的文献中称为“欠拟合”现象。

当M=3时,我们选择的模型已经接近数据所对应的真模型了,已经几乎拟合了,这时候的模型符合测试误差最小的学习目的了。

当M=9时,这时候就是所谓的过拟合现象了,由于参数设置过多,导致这条曲线几乎穿过了我们已知的所有的数据点。的确,他对已知数据预测很好(穿过了嘛),但是他对未知数据却预测很差(说不定下一个点不在这条线上,这就导致前面预测很准,后面误差越来越大)。

简单来说,想解决过拟合,实际上无非就是选择复杂度适当的模型,以达到使测试误差最小的学习目的。我们常用的模型选择方法:正则化交叉验证。关于正则化的学习我们在后面的学习中会接触到,我们这里要提到的是关于交叉验证

5.3 交叉验证

交叉验证(cross validation)简单来说就是将拿到的训练数据,再次分为训练集和验证集。其中验证集和测试集的功能一样,都是对训练集训练出来的模型进行评估。而交叉验证方法就是将训练集划分为训练集+测试集,测试集通常占1份,而训练集占k-1份,通过四次测试,每次更换不同的验证集来达到在有限的数据集中得出不同精度,得出4组模型结果;得出结果后取平均值作为最终结果。我们把上述的做法称为K折交叉验证。

K折交叉验证示意图如下:

image-20220306173643643

虽然K折交叉验证能够在k均值算法中起到优化K值的效果,那么如何来选取K值呢?什么时候才是最好呢?这就要进入我们的下一小节了。

5.4 超参数搜索——网格搜索

通常情况下,有很多参数时需要手动指定的(如K-近邻算法中的K值),这种叫做超参数。但是手动指定不准且计算复杂,所以我们要对模型预设几种超参数组合,每组超参数都采用交叉验证来进行评估,最后选出最优参数组合建立模型。

知道原理了就是动手写代码的时刻,我们看一下sklearn中有哪些库供我们调用。

sklearn.model_selection.GridSearchCV(estimator,param_grid = None,cv = None)

该API可以对估计器的指定参数值进行详尽搜索

  • estimator:估计器对象
  • param——grid:估计器参数,对应到knn中可以传入多个k值建立多个模型,以此评估哪个模型最好,传入时要用字典形式,如{“n_neighbors”:[1,3,5]}
  • cv:指定几折交叉验证,常用10折交叉验证

fit():输入训练数据

score():准确率

通过调用以下属性可以查看结果:

  • 最佳参数:best_params_
  • 最佳结果:best_score_
  • 最佳估计器:best_estimator_
  • 交叉验证结果:cv_results_

知道上面的原理,让我们对前一讲的KNN分类鸢尾花代码优化一下吧!

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCVdef knn_iris():"""用KNN算法对鸢尾花进行分类"""# 1 导入数据集iris = load_iris()# 2 划分数据集x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)# 3 特征工程:标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)x_test = transfer.transform(x_test)# 4 实例化KNN算法预估器estimator = KNeighborsClassifier()# 选用合适的K值来选择多个模型param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}# 加入超参数网格搜索和交叉验证estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)estimator.fit(x_train, y_train)# 5 模型评估# 方法1 直接比对真实值和预测值y_predict = estimator.predict(x_test)print("y_predict:\n", y_predict)print("直接对比真实值和预测值:\n", y_test == y_predict)# 方法2 计算准确率score = estimator.score(x_test, y_test)print("准确率为:\n", score)# 查看最佳参数print("KNN模型最佳参数:\n", estimator.best_params_)print("最佳结果:\n", estimator.best_score_)print("最佳估计器:\n", estimator.best_estimator_)print("交叉验证结果:\n", estimator.cv_results_)# 调用方法
knn_iris()

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

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

相关文章

关于内存的一些基础知识

1、free:Display amount of free and used memory in the system. free显示的数值来自/proc/meminfo(默认单位是KB)。各个项的含义分别是: 1)Mem这一行,shared:已废弃;buffers&#…

Flask 单例模式 session

一、单例模式 单例模式分为四种:基于文件的单例模式,基于类方法的单例模式,基于__new__的单例模式,基于metaclass的单例模式 1. 基于类方法的单例模式 - 不支持多线程模式 import threadingclass Singleton(object):def __init__(…

document.all

一.document.all是页面内所有元素的一个集合。例如: document.all(0)表示页面内第一个元素二.document.all可以判断浏览器是否是IE if(document.all){ alert("is IE!"); }三.也可以通过给某个元素设置id属性(idaaaa),然后…

数据处理工具(一)——Matplotlib

文章目录致谢1 Matplotlib1.1 什么是Matplotlib1.2 实现一个简单的图1.3 Matplotlib三层结构1.3.1 容器层1.3.2 辅助显示层1.3.3 图像层1.3 使用模块1.3.1 画布的设置1.3.2 添加网格辅助背景1.3.3 附加属性1.3.4 标签1.3.5 刻度1.3.6 一个图上多条线1.3.7 子区域1.4 基础图表1.…

Java解析Rss(三)

2019独角兽企业重金招聘Python工程师标准>>> package com.ninemax.application.rss;import java.net.URL; import java.text.SimpleDateFormat; import java.util.List;import com.sun.syndication.feed.synd.SyndCategory; import com.sun.syndication.feed.synd.S…

Redis服务器启动之后3个警告信息的解决方案

今天是年前最后一篇文章了,不想写太多的东西,就写一些有关Redis相关问题的解决方案。当我们启动了Redis服务器之后,会看到3个警告,如果没看到,那是很好的,但是我看到了。看到了就不能不管,所以就…

ASP .NET MVC 之Entity Framework入门教程及源码

本文主要的目的是 1. 说明Entity Framework Power Tools如何使用。 2. Entity Framework 快速门 实验环境: OS: Windows Server 2012, Windows 7 DE: VS2013 MVC 6.0Entity Framework SQL Server 2012 准备工作 基于现有数据库生成POCO数据类和数据库上下文需要借…

机器学习的练功方式(六)——朴素贝叶斯

文章目录致谢6 朴素贝叶斯6.1 概述6.2 概率论6.2.1 大数定律6.2.2 基本概念6.2.3 极大似然估计6.2.4 多项式分布6.2.4.1 伯努利分布6.2.4.2 二项分布6.2.5 朴素贝叶斯6.3 朴素贝叶斯文本分类6.3.1 一个例子6.3.2 拉普拉斯平滑系数6.3.3 算法实现6.4 贝叶斯分类器6.4.1 多项式贝…

ABAP中创建动态内表的三种方法(转载)

BAP中创建动态内表的三种方法 第一种: 如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用CREATE DATA生成,当然也可以是自定义类型。 比如要产生和数据表MARA结构一致的动态内表: DATA : DY_TABLE TYPE REF TO D…

个人简介

我叫范华万,今天22岁,来自于福建省。目前在闽江学院就学。我学的是软件工程软件服务开发专业,能从事网站设计、java工程师、ps技术、c、数据库管理。本人性格乐观、开朗,有上进心、进取心,对学习认真负责,I…

数据库杂谈(八)——查询优化

文章目录8 查询优化8.1 概述8.2 查询数和语法树8.3 代数优化8.4 物理优化8.5 连接操作优化8.5.1 嵌套循环法8.5.2 利用B树索引或哈希索引寻找匹配元组法8.5.3 散列连接法8.6 后话8 查询优化 8.1 概述 我们不管是在数据库软件如MySQL、SQLServer等,还是通过应用程序…

Android-入门学习笔记-使用 CursorLoader 加载数据

3 使用这个代码片段开始练习 也可以参考 Codepath 教程 高级内容补充: 你是否在思考ArrayAdapter’s 的 getView() 方法和CursorAdapter 的 newView() 和 bindView() 方法? 你可以查看 CursorAdapter 类的源码. getView() 方法依然存在, 但是它实际根据是否存在列表项能够被循…

逆向思维求素数

1 #include <stdio.h>2 3 int main(void)4 {5 const int len 100;6 int prime[len];7 for (int i0; i<len; i)8 prime[i] 1; // 1 标记这个序号数为素数&#xff0c;0标记为非素数9 for (int x2; x<len; x) 10 { 11 for (in…

在 Angularjs 中 ui-sref 和 $state.go 如何传递参数

1 ui-sref、$state.go 的区别 ui-sref 一般使用在 <a>...</a>&#xff1b; <a ui-sref"message-list">消息中心</a> $state.go(someState)一般使用在 controller里面&#xff1b; .controller(firstCtrl, function($scope, $state) {$state.…

机器学习的练功方式(七)——决策树

文章目录致谢7 决策树7.1 认识决策树7.2 决策树原理7.3 信息论7.3.1 信息熵7.3.1.1 熵7.3.1.2 信息7.3.1.3 信息熵7.3.2 信息增益7.4 决策树实现7.5 决策图7.6 后话致谢 信息熵是什么&#xff1f; - 知乎 (zhihu.com) 没有免费午餐定理_百度百科 (baidu.com) 7 决策树 决策树(…

[BZOJ3583]杰杰的女性朋友(矩阵快速幂)

杰杰的女性朋友 时间限制&#xff1a;10s 空间限制&#xff1a;256MB 题目描述 杰杰是魔法界的一名传奇人物。他对魔法具有深刻的洞察力&#xff0c;惊人的领悟力&#xff0c;以及令人叹为观止的创造力。自从他从事魔法竞赛以来&#xff0c;短短几年时间&#xff0c;就已经…

13.程序集篇

1.定义 程序集是.net框架应用程序生成块&#xff0c;它包含编译好的代码逻辑单元。 2.结构 程序集有描述他的程序清单、类型元数据&#xff0c;MSIL代码和资源组成。 程序集清单&#xff1a; 每一个程序集都包含描述该程序集中的各个元素彼此如何关联的数据集合。程序集清单包含…

机器学习的练功方式(八)——随机森林

文章目录致谢8 随机森林8.1 引入8.2 决策森林8.2.1 集成学习方法8.2.2 什么是随机森林8.2.3 无偏估计8.2.4 决策森林原理过程8.2.5 决策森林算法实现8.3 总结致谢 如何理解无偏估计&#xff1f;无偏估计有什么用&#xff1f;什么是无偏估计&#xff1f;_司南牧|知乎|博客|易懂教…

E20180219-hm-xa

comparison n. 比较&#xff0c;对照; [语] 比喻; 比较级; conjunction n. 连接; 连词; 联合&#xff0c;结合物; &#xff08;恒星、行星等的&#xff09; 合; [例句] assignment n. 分给&#xff0c;分配; 任务&#xff0c;工作&#xff0c;&#xff08;课外&#xff09;作…

这是我看过最精彩的回答

或许我没见过世面&#xff0c;但是这却是我看过对“怎么成为一个优秀的程序员&#xff0c;而不是一个优秀的码农&#xff1f;”最精彩的回答【全部复制粘贴】 其实我的心一直因为现在的工作【餐饮服务】而动摇&#xff0c;忽而想学网站&#xff0c;忽而c语言根基&#xff0c;忽…