机器学习入门项目分享 - 波士顿房价预测

该分享源于Udacity机器学习进阶中的一个mini作业项目,用于入门非常合适,刨除了繁琐的部分,保留了最关键、基本的步骤,能够对机器学习基本流程有一个最清晰的认识;

项目描述

利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型,并对模型的性能和预测能力进行测试;

项目分析

数据集字段解释:

RM: 住宅平均房间数量;

LSTAT: 区域中被认为是低收入阶层的比率;

PTRATIO: 镇上学生与教师数量比例;

MEDV: 房屋的中值价格(目标特征,即我们要预测的值);

其实现在回过头来看,前三个特征应该都是挖掘后的组合特征,比如RM,通常在原始数据中会分为多个特征:一楼房间、二楼房间、厨房、卧室个数、地下室房间等等,这里应该是为了教学简单化了;

MEDV为我们要预测的值,属于回归问题,另外数据集不大(不到500个数据点),小数据集上的回归问题,现在的我初步考虑会用SVM,稍后让我们看看当时的选择;

Show Time

Step 1 导入数据

注意点:

如果数据在多个csv中(比如很多销售项目中,销售数据和店铺数据是分开两个csv的,类似数据库的两张表),这里一般要连接起来;

训练数据和测试数据连接起来,这是为了后续的数据处理的一致,否则训练模型时会有问题(比如用训练数据训练的模型,预测测试数据时报错维度不一致);

观察下数据量,数据量对于后续选择算法、可视化方法等有比较大的影响,所以一般会看一下;

pandas内存优化,这一点项目中目前没有,但是我最近的项目有用到,简单说一下,通过对特征字段的数据类型向下转换(比如int64转为int8)降低对内存的使用,这里很重要,数据量大时很容易撑爆个人电脑的内存存储;

上代码:

# 载入波士顿房屋的数据集

data = pd.read_csv('housing.csv')

prices = data['MEDV']

features = data.drop('MEDV', axis = 1)

# 完成

print "Boston housing dataset has {} data points with {} variables each.".format(*data.shape)

Step 2 分析数据

加载数据后,不要直接就急匆匆的上各种处理手段,加各种模型,先慢一点,对数据进行一个初步的了解,了解其各个特征的统计值、分布情况、与目标特征的关系,最好进行可视化,这样会看到很多意料之外的东西;

基础统计运算

统计运算用于了解某个特征的整体取值情况,它的最大最小值,平均值中位数,百分位数等等,这些都是最简单的对一个字段进行了解的手段;

上代码:

#目标:计算价值的最小值

minimum_price = np.min(prices)# prices.min()

#目标:计算价值的最大值

maximum_price = np.max(prices)# prices.max()

#目标:计算价值的平均值

mean_price = np.mean(prices)# prices.mean()

#目标:计算价值的中值

median_price = np.median(prices)# prices.median()

#目标:计算价值的标准差

std_price = np.std(prices)# prices.std()

特征观察

这里主要考虑各个特征与目标之间的关系,比如是正相关还是负相关,通常都是通过对业务的了解而来的,这里就延伸出一个点,机器学习项目通常来说,对业务越了解,越容易得到好的效果,因为所谓的特征工程其实就是理解业务、深挖业务的过程;

比如这个问题中的三个特征:

RM:房间个数明显应该是与房价正相关的;

LSTAT:低收入比例一定程度上表示着这个社区的级别,因此应该是负相关;

PTRATIO:学生/教师比例越高,说明教育资源越紧缺,也应该是负相关;

上述这三个点,同样可以通过可视化的方式来验证,事实上也应该去验证而不是只靠主观猜想,有些情况下,主观感觉与客观事实是完全相反的,这里要注意;

Step 3 数据划分

为了验证模型的好坏,通常的做法是进行cv,即交叉验证,基本思路是将数据平均划分N块,取其中N-1块训练,并对另外1块做预测,并比对预测结果与实际结果,这个过程反复N次直到每一块都作为验证数据使用过;

上代码:

# 提示: 导入train_test_split

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state=RANDOM_STATE)

print X_train.shape

print X_test.shape

print y_train.shape

print y_test.shape

Step 4 定义评价函数

这里主要是根据问题来定义,比如分类问题用的最多的是准确率(精确率、召回率也有使用,具体看业务场景中更重视什么),回归问题用RMSE(均方误差)等等,实际项目中根据业务特点经常会有需要去自定义评价函数的时候,这里就比较灵活;

Step 5 模型调优

通过GridSearch对模型参数进行网格组合搜索最优,注意这里要考虑数据量以及组合后的可能个数,避免运行时间过长哈;

上代码:

from sklearn.model_selection import KFold,GridSearchCV

from sklearn.tree import DecisionTreeRegressor

from sklearn.metrics import make_scorer

def fit_model(X, y):

""" 基于输入数据 [X,y],利于网格搜索找到最优的决策树模型"""

cross_validator = KFold()

regressor = DecisionTreeRegressor()

params = {'max_depth':[1,2,3,4,5,6,7,8,9,10]}

scoring_fnc = make_scorer(performance_metric)

grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cross_validator)

# 基于输入数据 [X,y],进行网格搜索

grid = grid.fit(X, y)

# 返回网格搜索后的最优模型

return grid.best_estimator_

可以看到当时项目中选择的是决策树模型,现在看,树模型在这种小数据集上其实是比较容易过拟合的,因此可以考虑用SVM代替,你也可以试试哈,我估计是SVM效果最好;

学习曲线

通过绘制分析学习曲线,可以对模型当前状态有一个基本了解,如下图:

可以看到,超参数max_depth为1和3时,明显训练分数过低,这说明此时模型有欠拟合的情况,而当max_depth为6和10时,明显训练分数和验证分析差距过大,说明出现了过拟合,因此我们初步可以猜测,最佳参数在3和6之间,即4,5中的一个,其他参数一样可以通过学习曲线来进行可视化分析,判断是欠拟合还是过拟合,再分别进行针对处理;

小结

通过以上的几步,可以非常简单、清晰的看到一个机器学习项目的全流程,其实再复杂的流程也是这些简单步骤的一些扩展,而更难的往往是对业务的理解,没有足够的理解很难得到好的结果,体现出来就是特征工程部分做的好坏,这里就需要各位小伙伴们奋发图强了,路漫漫啊;

项目链接

通篇浏览可以通过nbviewer来看;

项目源文件、数据集文件可以通过GitHub波士顿项目获取,欢迎Follow、Fork、Star;

最后

大家可以到我的Github上看看有没有其他需要的东西,目前主要是自己做的机器学习项目、Python各种脚本工具、数据分析挖掘项目以及Follow的大佬、Fork的项目等:https://github.com/NemoHoHaloAi

波士顿房价预测python决策树_波士顿房价预测 - 最简单入门机器学习 - Jupyter相关推荐

  1. 波士顿房价预测python决策树_机器学习·波士顿房价预测模型

    模型评估与验证 当我们的机器学习模型建立好之后,如何训练数据以获得最优的模型参数,又用什么指标来评价模型的优劣呢?本文以波士顿房价为例,说明如何训练数据以及对模型做评估,辨别模型的优劣. 第一步:导入 ...

  2. 股票价格预测 | Python实现LSTM股票价格时间序列预测

    股票价格预测 | Python实现LSTM股票价格时间序列预测 目录 股票价格预测 | Python实现LSTM股票价格时间序列预测 基本介绍 数据集 程序下载 总结 基本介绍 长短时记忆(LSTM) ...

  3. 时间序列预测 | Python实现Transformer时间序列数据预测

    时间序列预测 | Python实现Transformer时间序列数据预测 目录 时间序列预测 | Python实现Transformer时间序列数据预测 基本介绍 Transformer设计 Tran ...

  4. Python大数据综合应用 :零基础入门机器学习、深度学习算法原理与案例

    机器学习.深度学习算法原理与案例实现暨Python大数据综合应用高级研修班 一.课程简介 课程强调动手操作:内容以代码落地为主,以理论讲解为根,以公式推导为辅.共4天8节,讲解机器学习和深度学习的模型 ...

  5. 从入门到入土:Python爬虫学习|Selenium自动化模块学习|简单入门|轻松上手|自动操作浏览器进行处理|chrome|PART01

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  6. 波士顿房价预测python代码_使用Python和Numpy构建神经网络模型——波士顿房价预测案例...

    原标题:使用Python和Numpy构建神经网络模型--波士顿房价预测案例

  7. python预测随机数据_随机森林预测

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 当涉及到预测数据(时间序列或其他类型的序列)时,人们会关注基本回归.ARIMA.ARMA.GARCH,甚至 ...

  8. bp神经网络预测python代码_机器学习之多层神经网络(附Python代码和数据)

    1 引言 多层神经网络,Multiple-layers Perceptron (MLP),又被称为多层感知机,是机器学习中深度学习的典型算法.关于多层神经网络的算法原理,我们在Stata和R实现的文章 ...

  9. 零基础学习python爬虫_教你零基础如何入门Python爬虫!

    Python爬虫好学吗?看你怎么学了.如果是自学,会难一些,毕竟有难题很难找到人帮你解答,很容易半途而废.要是你找到了一家靠谱的学校,就会容易很多.不过,这里我想教你入门Python爬虫. 一:爬虫准 ...

最新文章

  1. python如何播放视频_如何用python做一个视频搜索+播放器
  2. perl unload gbk oracle 数据库
  3. Python2与Python3的区别:
  4. windows安装MongoDB进度条卡住,window安装mongo系统错误 2,系统错误5的解决办法(转载)...
  5. linux系统报错01031,在Linux环境下设置 ora-01031:insufficient privileges解决方法总结
  6. boost::filesystem模块打印文件的大小的测试程序
  7. Android Listview 性能优化
  8. Reactor模式 NIO epoll
  9. SQL:postgresql增加自增字段
  10. 微信红包封面开放平台序列号
  11. 出去计算机写保护,u盘写保护怎么去掉
  12. 数据总线、地址总线、控制总线
  13. forum.anywlan.com.php,一句话让您理解WDS和WISP的区别/多数WISP路由器的简单有效的通用设置方法...
  14. python ttk.notebook_Ttk Notebook and PNotebook
  15. 谷歌账号--手机号无法验证
  16. Java | 仓库管理系统demo
  17. 【万人独木桥】那个夏天—后高考生活该如何安排?
  18. pmx转fbx的具体步骤
  19. ThreadLocal实战之数据库执行器线程同步
  20. 科学家最初发明行列式和矩阵是为了解决什么问题

热门文章

  1. 如何将excel表格转化为QQ在线多人同时编辑表格
  2. 开发中的各种时间格式转换(一)
  3. 爬取腾讯课堂的课程评论
  4. java 获取docker ip_docker容器内部获取宿主机ip地址方法以及报错解决
  5. 显示隐藏图片html,JavaScript实现显示和隐藏图片
  6. 假期读好书——力荐《八位大学校长》
  7. Delphi TreeView树型框节点拖拽停靠、按条件开始拖拽
  8. 有限体积法(2)——二维、三维扩散方程的离散推导
  9. c# Create Excel file and save as PDF
  10. Unity3D 动态加载资源方式