机器学习入门实战——波士顿房价预测(简单预测)_波斯顿房价预测怎么导入本地数据集-程序员宅基地

技术标签: python  笔记  数据分析  机器学习  


前言

波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的“Hello World”。利用机器学习方法完成波士顿房价的预测。理解机器学习解决简单实际问题的基本步骤和方法。


一、实验步骤及运行结果

1.数据分析

①.分析各个影响房价的特征信息

import numpy as np
from sklearn.datasets import load_boston  # 导入数据集
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator

boston = load_boston()
x = boston['data']  # 影响房价的特征信息
y = boston['target']  # 房价
name = boston['feature_names']

for i in range(13):
    plt.figure(figsize=(10, 7))
    plt.grid()
    plt.scatter(x[:, i], y, s=5)  # 横纵坐标和点的大小
    plt.title(name[i])
    print(name[i], np.corrcoef(x[:i]), y)
plt.show() 

运行结果:
犯罪率:高房价的房屋大都集中在低犯罪率地区。
在这里插入图片描述
住宅用地比例:与房价无明显的线性关系。
在这里插入图片描述

城镇中非商业用地的所占比例:与房价无明显的线性关系,只能说在某一区间内房价呈现一定特征。
在这里插入图片描述

是否处于查尔斯河边(1表示在河边,0表示不在河边):是否在查尔斯河边影响房价也不明显。
在这里插入图片描述

一氧化氮浓度: 一氧化氮浓度与房价的关系呈现极其微弱的线性关系,一氧化氮低于0.5的情况下,房价绝大部分高于15。
在这里插入图片描述

每栋住宅的房间数:与房价之间具有较强的线性关系。
在这里插入图片描述

1940年以前建成的业主自住单位的占比:对房价的影响较小。
在这里插入图片描述

距离5个波士顿就业中心的平均距离:平均距离较小的情况下,房价对应也较低。
在这里插入图片描述

距离高速公路的便利指数:房价高于30的房产,近乎都集中在距离高速公路的便利指数低的地区。
在这里插入图片描述

每一万美元的不动产税率:与房价的线性相关度较小。
在这里插入图片描述

城镇中学生教师比例:对房价的影响较小,呈微弱的线性关系。
在这里插入图片描述

黑人比例:黑人比例对波士顿房价的影响尤其是往后的影响越趋于更小。
在这里插入图片描述

低收入阶层占比:与房价具有较强的线性关系,是影响房价的重要因素。
在这里插入图片描述

②.对房价的分析

import numpy as np
from sklearn.datasets import load_boston  # 导入数据集
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator

boston = load_boston()
x = boston['data']  # 影响房价的特征信息
y = boston['target']  # 房价

plt.figure(figsize=(20, 15))
y_major_locator = MultipleLocator(5)  # 把y轴的刻度间隔设置为10,并存在变量里
ax = plt.gca()  # ax为两条坐标轴的实例
ax.yaxis.set_major_locator(y_major_locator)  # 把y轴的主刻度设置为5的倍数
plt.ylim(0, 51)
plt.grid()
for i in range(len(y)):
    plt.scatter(i, y[i], s=20)

plt.show()

运行结果:
在这里插入图片描述
经分析,将房价大于等于46的数据视为异常数据,在划分训练集和测试集之前先把这些数据从数据集中除去。

2.数据处理

经上述分析,去除房价中大于等于46的数据,对于房价的影响信息,只保留NOX,RM,AGE,DIS,LSTAT, INDUS, PTRATIO几个特征信息,将剩下的特征信息均除去。

3.建模测试并运行

import numpy as np
import numpy as np
from skimage.metrics import mean_squared_error
from sklearn import linear_model
from sklearn.linear_model import LinearRegression  # 导入线性模型
from sklearn.datasets import load_boston  # 导入数据集
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split  # 导入数据集划分模块
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt2

boston = load_boston()
x = boston['data']  # 影响房价的特征信息数据
y = boston['target']  # 房价
name = boston['feature_names']

# 数据处理
unsF = []  # 次要特征下标
for i in range(len(name)):
    if name[i] == 'RM' or name[i] == 'PTRATIO' or name[i] == 'LSTAT' or name[i] == 'AGE' or name[i] == 'NOX' or name[i] == 'DIS' or name[i] == 'INDUS':
        continue
    unsF.append(i)
x = np.delete(x, unsF, axis=1)  # 删除次要特征


unsT = []  # 房价异常值下标
for i in range(len(y)):
    if y[i] > 46:
        unsT.append(i)
x = np.delete(x, unsT, axis=0)  # 删除样本异常值数据
y = np.delete(y, unsT, axis=0)  # 删除异常房价

# 将数据进行拆分,一份用于训练,一份用于测试和验证
# 测试集大小为30%,防止过拟合
# 这里的random_state就是为了保证程序每次运行都分割一样的训练集和测试集。
# 否则,同样的算法模型在不同的训练集和测试集上的效果不一样。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)

# 线性回归模型
lf = LinearRegression()
lf.fit(x_train, y_train)  # 训练数据,学习模型参数
y_predict = lf.predict(x_test)  # 预测

# 岭回归模型
# rr = linear_model.Ridge()  # 模型岭回归
# rr.fit(x_train, y_train)  # 训练模型
# y_predict = rr.predict(x_test)  # 预测


# lasso模型
# lassr = linear_model.Lasso(alpha=.0001)
# lassr.fit(x_train, y_train)
# y_predict = lassr.predict(x_test)

# 与验证值作比较
error = mean_squared_error(y_test, y_predict).round(5)  # 平方差
score = r2_score(y_test, y_predict).round(5)  # 相关系数

# 绘制真实值和预测值的对比图
fig = plt.figure(figsize=(13, 7))
plt.rcParams['font.family'] = "sans-serif"
plt.rcParams['font.sans-serif'] = "SimHei"
plt.rcParams['axes.unicode_minus'] = False  # 绘图
plt.plot(range(y_test.shape[0]), y_test, color='red', linewidth=1, linestyle='-')
plt.plot(range(y_test.shape[0]), y_predict, color='blue', linewidth=1, linestyle='dashdot')
plt.legend(['真实值', '预测值'])
plt.title("190512213", fontsize=20)
error = "标准差d=" + str(error)+"\n"+"相关指数R^2="+str(score)
plt.xlabel(error, size=18, color="green")
plt.grid()
plt.show()

plt2.rcParams['font.family'] = "sans-serif"
plt2.rcParams['font.sans-serif'] = "SimHei"
plt2.title('190512213', fontsize=24)
xx = np.arange(0, 40)
yy = xx
plt2.xlabel('* truth *', fontsize=14)
plt2.ylabel('* predict *', fontsize=14)
plt2.plot(xx, yy)
plt2.scatter(y_test, y_predict, color='red')
plt2.grid()
plt2.show()

运行结果:
线性回归:
在这里插入图片描述

在这里插入图片描述

岭回归:
在这里插入图片描述

在这里插入图片描述

Lasso模型:

在这里插入图片描述

在这里插入图片描述

二、实验结果分析

1.由本次实验结果与真实值的对比图可知,无论使用哪种模型预测,预测效果都不是很理想,主要原因仍是数据分析及处理过程中出现了问题。在预测时,应该对数据进行进一步的分析和处理,如对应区间内数据的变化,对极端数据的处理等等。
2.实验采用了相关系数和平方差两种手段去评判预测结果的好坏。相关系数越接近1说明选用的模型回归的效果越好,预测的结果也就越优,在实际解决问题时,应该测试多个模型选用最优的模型进行预测。
3.除了实验中选择的三种模型,还可以进一步利用支持向量机的核函数,SVR中的三种模型进行预测,支持向量机是目前最常用效果最好的分类器之一,但是其消耗的空间和时间代价太大,所以需要结合实际情况使用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Mr_Clutch/article/details/112446383

智能推荐

稀疏编码的数学基础与理论分析-程序员宅基地

文章浏览阅读290次,点赞8次,收藏10次。1.背景介绍稀疏编码是一种用于处理稀疏数据的编码技术,其主要应用于信息传输、存储和处理等领域。稀疏数据是指数据中大部分元素为零或近似于零的数据,例如文本、图像、音频、视频等。稀疏编码的核心思想是将稀疏数据表示为非零元素和它们对应的位置信息,从而减少存储空间和计算复杂度。稀疏编码的研究起源于1990年代,随着大数据时代的到来,稀疏编码技术的应用范围和影响力不断扩大。目前,稀疏编码已经成为计算...

EasyGBS国标流媒体服务器GB28181国标方案安装使用文档-程序员宅基地

文章浏览阅读217次。EasyGBS - GB28181 国标方案安装使用文档下载安装包下载,正式使用需商业授权, 功能一致在线演示在线API架构图EasySIPCMSSIP 中心信令服务, 单节点, 自带一个 Redis Server, 随 EasySIPCMS 自启动, 不需要手动运行EasySIPSMSSIP 流媒体服务, 根..._easygbs-windows-2.6.0-23042316使用文档

【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链_原生jackson 反序列化链子-程序员宅基地

文章浏览阅读1.2k次,点赞27次,收藏7次。2023巅峰极客 BabyURL之前AliyunCTF Bypassit I这题考查了这样一条链子:其实就是Jackson的原生反序列化利用今天复现的这题也是大同小异,一起来整一下。_原生jackson 反序列化链子

一文搞懂SpringCloud,详解干货,做好笔记_spring cloud-程序员宅基地

文章浏览阅读734次,点赞9次,收藏7次。微服务架构简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除])这么多小服务,他们之间如何通讯?这么多小服务,客户端怎么访问他们?(网关)这么多小服务,一旦出现问题了,应该如何自处理?(容错)这么多小服务,一旦出现问题了,应该如何排错?(链路追踪)对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。_spring cloud

Js实现图片点击切换与轮播-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏20次。Js实现图片点击切换与轮播图片点击切换<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/ja..._点击图片进行轮播图切换

tensorflow-gpu版本安装教程(过程详细)_tensorflow gpu版本安装-程序员宅基地

文章浏览阅读10w+次,点赞245次,收藏1.5k次。在开始安装前,如果你的电脑装过tensorflow,请先把他们卸载干净,包括依赖的包(tensorflow-estimator、tensorboard、tensorflow、keras-applications、keras-preprocessing),不然后续安装了tensorflow-gpu可能会出现找不到cuda的问题。cuda、cudnn。..._tensorflow gpu版本安装

随便推点

物联网时代 权限滥用漏洞的攻击及防御-程序员宅基地

文章浏览阅读243次。0x00 简介权限滥用漏洞一般归类于逻辑问题,是指服务端功能开放过多或权限限制不严格,导致攻击者可以通过直接或间接调用的方式达到攻击效果。随着物联网时代的到来,这种漏洞已经屡见不鲜,各种漏洞组合利用也是千奇百怪、五花八门,这里总结漏洞是为了更好地应对和预防,如有不妥之处还请业内人士多多指教。0x01 背景2014年4月,在比特币飞涨的时代某网站曾经..._使用物联网漏洞的使用者

Visual Odometry and Depth Calculation--Epipolar Geometry--Direct Method--PnP_normalized plane coordinates-程序员宅基地

文章浏览阅读786次。A. Epipolar geometry and triangulationThe epipolar geometry mainly adopts the feature point method, such as SIFT, SURF and ORB, etc. to obtain the feature points corresponding to two frames of images. As shown in Figure 1, let the first image be ​ and th_normalized plane coordinates

开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先抽取关系)_语义角色增强的关系抽取-程序员宅基地

文章浏览阅读708次,点赞2次,收藏3次。开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先关系再实体)一.第二代开放信息抽取系统背景​ 第一代开放信息抽取系统(Open Information Extraction, OIE, learning-based, 自学习, 先抽取实体)通常抽取大量冗余信息,为了消除这些冗余信息,诞生了第二代开放信息抽取系统。二.第二代开放信息抽取系统历史第二代开放信息抽取系统着眼于解决第一代系统的三大问题: 大量非信息性提取(即省略关键信息的提取)、_语义角色增强的关系抽取

10个顶尖响应式HTML5网页_html欢迎页面-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏51次。快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间。不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源。鉴于网站模板的灵活性和强大的功能,现在广大设计师和开发者对html5网站的实际需求日益增长。为了造福大众,Mockplus的小伙伴整理了2018年最..._html欢迎页面

计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...-程序员宅基地

文章浏览阅读282次。原标题:2018全国计算机等级考试调整,一、二级都增加了考试科目全国计算机等级考试将于9月15-17日举行。在备考的最后冲刺阶段,小编为大家整理了今年新公布的全国计算机等级考试调整方案,希望对备考的小伙伴有所帮助,快随小编往下看吧!从2018年3月开始,全国计算机等级考试实施2018版考试大纲,并按新体系开考各个考试级别。具体调整内容如下:一、考试级别及科目1.一级新增“网络安全素质教育”科目(代..._计算机二级增报科目什么意思

conan简单使用_apt install conan-程序员宅基地

文章浏览阅读240次。conan简单使用。_apt install conan