当前位置: 首页 > 编程日记 > 正文

波士顿房价预测学习项目笔记

机器学习入门项目

作为机器学习的入门项目,了解到这个一个监督学习类型的回归问题模型。项目中需要根据已有的数据,构建一个合理的模型对未来的房价可以做出预测。

Udacity机器学习课程针对初学者做了精心地设计,这里来看项目是如何组织的,也示例我们从以下步骤分解问题:

  1. 分析数据: 从宏观了解数据集的特征
  2. 先决知识准备: 了解模型衡量标准、数据分割等基本技术
  3. 模型分析: 通过可视化的方法,来引导初学者来分析模型的特性。
  4. 实现和评估模型:
    1. 实现模型: 首先引入网格搜索和交叉验证的方法,并根据提示实现预测模型,并对模型进行训练并作出预测。
    2. 评估模型: 对模型的健壮性、实用性等进行分析评估。

分析数据

分析数据,对数据有一个总体的了解。项目中分成了主要几个步骤:

  1. 预处理: 项目中的数据是经过针对性的预处理:比如排除异常数据、删除不必要的数据项(简化)
  2. 加载: 通过pandas加载数据
  3. 统计: 并通过numpy做基本的统计运算:最大值、最小值、平均值、中位值、方差等,把玩数据,对数据有一个总体的了解。
  4. 观察: 观察或者通过工具观察从单维度来了解一下各特征值对预测值的影响。

先决知识准备

定义衡量标准

作为建模的重要步骤,需要一个衡量标准,就像工程或者软件项目立项之后就要考虑验收标准。

  • 对于回归模型,项目中建议使用“决定系数”(R^2)来量化模型的好坏。
    • sklearn带有的r2_score可以为我们所用。

数据准备

需要做预测,那么数据集如何使用呢,有限的数据并不是一股脑用于模型学习的,至少对于监督学习不是这样。项目中引入了训练集和测试集的概念,这是训练模型的重要步骤。

  • 数据分割与重排:
    • 数据集被分为训练集和测试集。同样sklearn也提供了现成的函数train_test_split,当然作为一个通用函数,有一些参数可配,具体可以查询sklearn官方文档。

模型分析

模型分析在项目中是封装好的,意在让初学者以可视化的方式感知模型的拟合趋势。项目引入了两个评分工具:

  • 学习曲线
  • 复杂度曲线

以下是对这两种曲线的初步理解:

  • 学习曲线: 描述交叉验证时,模型随着训练集大小的变化时训练分数和测试分数的变化曲线,用以表达模型随着训练集大小的变化趋势。
  • 复杂度曲线: 项目中的复杂度曲线是基于sklearn的验证曲线来做的,或者就翻译为“复杂度曲线”?用于描述模型训练分数和测试分数随指定的参数的变化而变化的情况。

项目通过这两组曲线引导大家对模型对这个数据集有了一些总体的认识: 1, 模型在训练集达到大概300时就趋于稳定,收敛到合理水平,说明模型是有效的,2, 从复杂度曲线可以看出,对于所使用的DecisionTreeRegressor在参数max_depth=3时模型效果达到最佳。而深度不足3时,训练分数和测试分数都较低,超过3之后,测试分数开始降低,有过拟合趋势,所以max_depth=3模型效果最佳。

实现和评估模型

网格搜索与交叉验证

项目引入了网格搜索和交叉验证的方法,因为项目中即将使用。

  1. 网格搜索:这是一种寻找算法参数最优值的解的方法,目的是寻找最优的算法参数来拟合当前的数据集。通常就是通过遍历参数的可能参数值(给定范围)的方式实现,具体实现方式为:通过尝试每一个可能的参数(组合),再根据评分算法对每个参数(组合)评分,再返回分数最好的来实现。最终是通过获得最优的算法参数来优化学习算法。
  2. 交叉验证:是通过操作训练集数据的方式来优化训练效果,具体做法为把训练集进一步划分更小的训练集和验证集,然后算法通过多轮训练+验证的方式做优化,从而在欠拟合和过拟合之间寻找一种平衡,达到选择更好的优化算法模型的目标。常见的交叉验证方法还可以分为:简单交叉验证,ShuffleSplitK折交叉验证法等。

在实际应用中,常常是把网格搜索和交叉验证组合使用,这也是为什么sklearn会直接给出了GridSearchCV算法,它的简化版本是网格搜索,同时提供cv的可选支持。

模型实现

至此,项目给出了模型实现的核心函数fit_model的框架,并有初学者来填充算法,具体来看,模型的实现过程就是这样:

  1. 准备训练集,测试集:train_test_split提供了实现
  2. 创建网格搜索对象:依次准备好所需的参数。
    1. 创建回归器(这里是DecisionTreeRegressor实例)
    2. 准备参数字典:也就是网格搜索的范围
    3. 创建评分函数:创建满足条件的评分函数,底层实现为r2_score函数,但需要通过sklearn.metrics.make_scorer处理
    4. 创建交叉验证器:项目中使用了ShuffleSplit
  3. 模型fit数据,得到最优模型
  4. 应用模型进行预测:准备测试数据,调用predict函数

这样,一个模型的完整过程大约完成,其中得到的最优模型还可以输出过程中得到的最优参数(model.get_params()['max_depth'])。

模型评估

项目设计在应用模型predict之后,考虑到模型的局限性等因素,设置了模型评估的环节。这告诉我们,一个模型的完成是否对现实有指导意义还需要仔细的评估,这应该作为模型研究的必要环节。

附:我的练习项目结果

转载于:https://www.cnblogs.com/1xin/p/6689880.html

相关文章:

LINQ之路19:LINQ to XML之X-DOM更新、和Value属性交互

本篇包含两部分内容:X-DOM更新一节中我们会详细讨论LINQ to XML的更新方式,包括Value的更新、子节点和属性的更新、通过Parent节点实现更新; 和Value属性交互一节会详细讨论XElement和XAttribute的Value属性。如果一个元素只有单个XText子节点…

明朝是中国历史上最有骨气的王朝?【ZZ】

linked from http://www.guoxue.com/article/list.asp?id6095明朝是中国历史上最有骨气的王朝?作者: (国学网2006-5-12发布) 有人对明朝极尽污蔑之能事,好象明朝是最不中用的朝代。其实,只要细心比较&am…

马哥第七次作业

系统的INPUT和OUTPUT默认策略为DROP,请完成以下关于iptables的题目;1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文…

Strategy_Pattern

以下代码是“策略模式”的第四个例子:

JAVA-基础(Class对象及反射)

JAVA-基础(Class对象及反射) 1.(1)什么是class对象? 首先,java有两种对象,第一种是实例对象,第二种是Class对象,每一个类运行的类型信息就是用Class对象表示的&#xff0…

当年学生的一件事,心情很难过

当年学生的一件事,心情很难过 今天同一个以前的学生聊天,搞得心情很难过。那年是刚毕业,带了几个学生的毕业论文,其中有一个,只是第一次见过一面,最后答辩前见一两天以及答谢见过一面。他从来不同我联系&am…

while循环中,break,continue,return的差别

break 结束循环,跳出循环体;continue 结束本次循环。进行下次循环;return 跳出循环体所在的方法,相当于跳出循环体。

Strategy_Level2

以下代码是“策略模式”的第五个例子:

自制绘图之坐标轴

写代码之前得先了解坐标轴的一些属性,坐标轴有范围,每隔多少显示一条数值信息。然而间隔信息有时并不确定,一旦设置不准确,图形会乱掉。最好的方法是使用另一个参数:分隔符总数。这样可以利用坐标范围计算出间隔。 首先…

DotNET(C#) Socket基本编程 (1)

Socket基本编程 服务端: using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; Thread mythread ; Socket socket; // 清理所有正在使用的资源。 protected override void Dispose( bool disposing ) { try {    socket.Clos…

CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)

参考学习大神博客: http://blog.csdn.net/feilusia/article/details/51083953 : http://blog.csdn.net/xiaoleiacmer/article/details/41723583 1、TI 的 CC2540跑了一个 OSAL (Operating System Abstraction Layer) 心得:大概 就是 一个循…

Strategy_Level3

以下代码是“策略模式”的第六个例子:

SDK开发日积月累(二)

WM_NOTIFY消息和WM_COMMAND消息在一个对话框中,子控件可以有两种方式与父对话框通信。1.向父对话框发送WM_COMMAND消息,但这种消息传递的信息量比较少。2.向父对话框发送WM_NOTIFY消息,信息量比较大。idCtrl (int) wParam; pnmh (LPNMHDR) …

关于IP地址的分类

我们说过因特网是把全世界的无数个网络连接起来的一个庞大的网间网,每个网络中的计算机通过其自身的IP地址而被唯一标识的,据此我们也可以设想,在INTERNET上这个庞大的网间网中,每个网络也有自己的标识符。这与我们日常生活中的电…

Visual Studio UML Activity Diagram(1)

数理系LSGO软件技术团队能够存活下来,并形成战斗力的根本原因,归结为我们的价值观。我们“只问收获,不问耕耘”,对知识是贪婪的,我们会把所学的知识放到场景中去应用,我们一定要做出成品。我们强调“要构建…

VMware 克隆Linux后找不到eth0

VMware 克隆Linux,ifconfig 不出现eth0解决方案:1)删除 /etc/udev/rules.d/70-persistent-net.rules/rm -rf /etc/udev/rules.d/70-persistent-net.rules2)重启init 6 3)ifconfig 查看转载于:https://blog.51cto.com/ictedu/1917185

笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任何节点的键值大于等于该节点左子树中的所…

定义自定义的异常

首先我们建立自己的异常类CustomException,它要继承自ApplicationException类(这是一个在发生非致命的应用程序错误时抛出的通用异常,它又继承于更为通用的Exception类),将其用作为应用程序定义的任何自定义异常的基类…

python3 的 round 函数的 练习

python3 的 round 函数感觉很别扭,其运算结果与习惯不相符。特记录下来: 代码 python 3的 round 函数 是“四舍六入五成双”的https://www.zhihu.com/question/20128906print(python 3的 round 函数:四舍六入五成双)print(\nround(-3.5) , …

Visual Studio UML Activity Diagram(2)

昨天的图文介绍了Visual Studio UML Activity Diagram中所涉及的对象,今天图文我们来介绍这些对象的属性部分并给出UML关于Activity Diagram的元模型类图。通常情况下,我们在做一套软件系统的时候,对甲方业务流程并不熟悉,如果直接…

Go 语言中手动内存管理

2019独角兽企业重金招聘Python工程师标准>>> Go 语言是自带GC的, 相对C语言等的手动内存管理省事很多, 弊端便是会消耗更多的内存, 以及在GC时导致整个程序的停顿. 在某些特殊场合, 如果能够可选地手动进行内存管理, 效果会好不少. Go 目前的 GC 实现比较简单(mark-…

依赖倒转原则(Dependency Inversion Principle,DIP)

前面两篇图文介绍了“开闭原则”和“里氏替换原则”。开发出对扩展开放,对修改封闭的系统是程序员的目标,而今天所介绍的“依赖倒转原则”正是实现这一目标的途径之一,而“里氏替换原则”为这一途径提供了保证。大家或许发现,我写…

细说浏览器特性检测(2)-通用事件检测

在上一篇中介绍了jQuery1.4版本新增的几个浏览器特性检测方案和具体的目的,本文将以事件为中心,介绍一个较为完整、通用的事件检测方案。 事件检测,即检测某一事件在不同的浏览器中是否存在(可用),这在编写…

robot简单功能测试脚本设计(例子)

以学生管理系统的添加一个学生信息为例子页面对象:editbox(姓名),button(添加)数据要求:1 姓名不能为空2 姓名不能重复程序结构1 点button,弹出对话框“姓名不能为空”2 输入姓名,点…

里氏替换原则(Liskov Substitution Principle,LSP)

昨天图文介绍了软件设计的一个基本原则“开闭原则”,而“开闭原则”的核心就是通过抽象把需求变化进行隔离,这种想法可以通过“里氏替换原则”进行保证。理解“里氏替换原则”也是理解面向对象中“运行时多态”的关键。希望大家仔细体会。

在IIS7里配置 ISAPI,运行dll程序,总提示下载dll

在IIS7里配置 ISAPI,运行dll程序,总提示下载dll,只需要把对应站点应用程序池里面的高级设置里的启用32位应用程序,设为“true"即可。

MySQL数据库高可用集群搭建-PXC集群部署

Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法。集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上。 PXC原理描述: 分布式系统的CAP理论: C:一致…

搭建Jupyter学习环境

python notebook是一个基于浏览器的python数据分析工具,使用起来非常方便,具有极强的交互方式和富文本的展示效果。jupyter是它的升级版,它的安装也非常方便,一般Anaconda安装包中会自带。安装好以后直接输入jupyter notebook便可…

[转贴]2006十大经典语句

1. 骑白马的不一定是王子,他可能是唐僧; 2. 带翅膀的也不一定是天使,他可能是鸟人。 3. 站的更高,尿的更远。 4. 穿别人的鞋,走自己的路,让他们找去吧, 5. 我不是随便的人。我随便起来不是人 6.…

开放-封闭原则(The Open-Closed Principle,OCP)

自己设计的软件系统“易于维护”、“扩展性好”、“可重用”、“具有灵活性”,这是每位程序员所追求的目标。“开闭原则”为我们指明了方向,即我们所设计的软件尽量满足“开闭原则–对扩展开放,对修改关闭”,这样就能降低需求不断…