PyTorch深度学习实战 | 基于多层感知机模型和随机森林模型的某地房价预测

news2024/10/6 14:26:52

简介: 在现实生活中,除了分类问题外,也存在很多需要预测出具体值的回归问题,例如年龄预测、房价预测、股价预测等。相比分类问题而言,回归问题输出类型为一个连续值,如下表所示为两者的区别。在本文中,将完成房价预测这一回归问题。

■ 分类问题与回归问题区别

对于一个回归问题,从简单到复杂,可以采取的模型有多层感知机、SVR、回归森林算法等,下面将介绍如何使用这些算法完成这一任务。

01、使用MLP实现房价预测


首先是载入需要的各种包以及数据集,与前面使用树模型等不同的地方在于,使用多层感知机模型需要对数据集的X和y都根据最大最小值进行归一化处理。下图所示程序使用了线性归一化的方法,即

这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定,实际使用中可以用经验常量值来替代max和min。

sklearn库中提供了归一化的接口,如代码清单1所示为加载数据集并进行归一化处理的代码实现。

代码清单1 加载数据集并进行预处理操作

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error
 
# 加载数据集并进行归一化预处理
def loadDataSet():
    boston_dataset = load_boston()
    X = boston_dataset.data
    y = boston_dataset.target
    y = y.reshape(-1, 1)
    # 将数据划分为训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
 
    # 分别初始化对特征和目标值的标准化器
    ss_X, ss_y = preprocessing.MinMaxScaler(), preprocessing.MinMaxScaler()
 
    # 分别对训练和测试数据的特征以及目标值进行标准化处理
    X_train, y_train = ss_X.fit_transform(X_train), ss_y.fit_transform(y_train)
    X_test, y_test = ss_X.transform(X_test), ss_y.transform(y_test)
    y_train, y_test = y_train.reshape(-1, ), y_test.reshape(-1, )
 
    return X_train, X_test, y_train, y_test

在预处理过数据集后,构建MLP模型,并设置模型的超参数,并在训练集上训练模型。

代码清单2 训练多层感知机模型

def trainMLP(X_train, y_train):
    model_mlp = MLPRegressor(
        hidden_layer_sizes=(20, 1), activation='logistic', solver='adam', alpha=0.0001, batch_size='auto',
        learning_rate='constant', learning_rate_init=0.001, power_t=0.5, max_iter=5000, shuffle=True,
        random_state=1, tol=0.0001, verbose=False, warm_start=False, momentum=0.9, nesterovs_momentum=True,
        early_stopping=False, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
    model_mlp.fit(X_train, y_train)
    return model_mlp

如代码清单2所示,该模型的超参数较多,最重要的几个超参数为hidden_layer_sizes(隐藏层神经元个数,在本次实验当中隐藏层分别为5和1),activations(激活函数,可以选择relu、logistic、tanh等),solver(优化方法,即sgd、adam等),以及与优化方法相关的learning_rate(学习率),momentum(动量)等,设置完模型参数后,使用fit函数完成训练过程。

代码清单3 测试模型效果

def test(model, X_test, y_test):
    y_pre = model.predict(X_test)
    print("The mean root mean square error of MLP-Model is {}".format(mean_squared_error(y_test, y_pre)**0.5))
    print("The mean squared error of MLP-Model is {}".format(mean_squared_error(y_test, y_pre)))
    print("The mean absolute error of MLP-Model is {}".format(mean_absolute_error(y_test, y_pre)))

训练完成后在测试集上验证模型的效果,如代码清单3所示,不同于分类模型有准确率召回率等指标,回归模型验证模型效果通常采用MSE,MAE、RMSE等。

  • MSE(Mean Squared Error)叫做均方误差

  • MAE(Mean Absolute Error)为平均绝对误差,是绝对误差的平均值,能更好地反映预测值误差的实际情况

  • RMSE(Root Mean Square Error)为均方根误差,是用来衡量观测值同真值之间的偏差

以上三项指标的值越小,则表示在测试集上预测的结果与真实结果之间的偏差越小,模型拟合效果越好。

如代码清单4所示,在主函数中依次调用上述函数,完成导入数据集、训练、预测的全过程。

代码清单4 构建main函数

if __name__ == '__main__':
    X_train, X_test, y_train, y_test = loadDataSet()
    # 训练MLP模型
    model = trainMLP(X_train, y_train)
    test(model, X_test, y_test)

最终可得输出如下图1所示。

图1 MLP模型预测效果

改变实验中的超参数,例如隐藏层的神经元个数,可以得到不同的模型以及这些模型在测试集上的得分。如表2所示,当神经元个数为10时,三项指标均获得了最小值,因此可以固定神经元个数为10,再调整其他参数,例如激活函数、优化方法等。

【小技巧】在难以确定参数时,可以将模型在训练集和测试集的误差都打印出来,当训练集误差远远大于测试集误差时,可能会存在过拟合的问题,应当减少参数数目,即神经元的个数。当训练集的误差与测试集误差都很大时,存在欠拟合的问题,应当增加神经元的个数。

表2 不同神经元个数的预测结果

02、使用随机森林模型实现房价预测


如代码清单5、代码清单6所示,导入与随机森林回归模型有关的包,并新增使用随机森林训练模型的函数,修改主函数,其他部分保持不变。

代码清单5 使用随机森林模型进行训练

def trainRF(X_train, y_train):
    model_rf = RandomForestRegressor(n_estimators=10000)
    model_rf.fit(X_train, y_train)
    return model_rf

代码清单6 修改main函数内容

if __name__ == '__main__':
    X_train, X_test, y_train, y_test = loadDataSet()
    # 训练RF模型
    model = trainRF(X_train, y_train)
    test(model, X_test, y_test)

最终得到如图2所示为命令行输出结果。

图2 随机森林模型预测结果

下面调节n_estimators的数目,并记录相应的评价指标大小。如表3所示为一个随机森林中决策数目发生变化时评价指标的变化。可以发现,随着决策树数目的上升,各项指标都变得更优,一般而言,一个森林中决策树的个数越多,模型预测的准确率越高,但相应的会消耗更多的计算资源,因此在实际应用当中应当权衡效率与正确性这两点。

表3 随机森林不同决策树数目预测结果

03、文末赠书

这是一本讲述如何用NLP技术进行文本内容理解的著作,也是一本系统讲解NLP算法的著作,是作者在NLP和内容理解领域多年经验的总结。

本书结合内容理解的实际业务场景,系统全面、循序渐进地讲解了各种NLP算法以及如何用这些算法高效地解决内容理解方面的难题,主要包括如下几个方面的内容:

(1)文本特征表示

文本特征表示是NLP的基石,也是内容理解的基础环节,本书详细讲解了离散型表示方法和分布型表示方法等特征表示方法及其应用场景,还讲解了词向量的评判标准。

(2)内容重复理解

详细讲解了标题重复、段落重复、文章重复的识别方法和去重算法。

(3)内容通顺度识别及纠正

详细讲解了内容通顺度的识别方法以及纠正不通顺内容的各种算法。

(4)内容质量

详细讲解了多种内容质量相关的算法,以及如何搭建高质量的知识问答体系的流程。

(5)标签体系构建

详细讲解了针对内容理解的标签体系的建设流程和方法,以及相关的多种算法。

(6)文本摘要生成

详细讲解了抽取式文本摘要和生成式文本摘要两种流行的文本摘要生成方法,以及文本摘要的常用数据集和文本摘要评价方法。

(7)文本纠错

详细讲解了文本纠错的传统方法、深度学习方法、工业界解决方案,以及常用的文本纠错工具的安装和使用。

作者简介


李明琦

资深AI技术专家,现就职于BAT,担任高级算法工程师。长期致力于机器学习、深度学习、NLP等技术在实际业务场景中的落地,在内容理解方面有丰富的经验,主导的内容质量项目曾获得最佳项目奖。

先后发表人工智能相关的学术论文2篇,申请人工智能领域的发明专利5项。在GitHub上贡献了大量内容质量、问答系统、NLP等方面的代码,在CSDN撰写了一些与算法、机器学习、内容理解相关的文章,深受欢迎。

谷雪

现为葡萄牙米尼奥大学博士生,涉及的研究领域为神经架构搜索、自然语言处理、情感分析,博士期间着力于细粒度情感原因提取。先后发表过学术论文2篇,其中一篇是神经架构搜索的综述,另一篇是基于进化策略的神经架构演化方法。在开源平台GitHub上贡献了大量深度学习、机器学习代码,在CSDN上分享了服务器配置、数据分析、图像去噪、情感分析等方向的多篇文章。

孟子尧

在人工智能技术领域有非常深厚的积累,擅长机器学习和深度学习,尤其是深度学习中的图像分类和自然语言处理等技术。热衷于开源的应用和推广,在Github和CSDN上贡献了许多代码和文章。曾在《计算机研究与发展》上发表过1篇人工智能相关论文。

参与方式:评论区置顶评论红包手气王自动获得技术图书《基于NLP的内容理解》1本!

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

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

相关文章

打造高效自动化测试流程:Jenkins+Allure+Pytest环境搭建和实战

引言 自动化测试已经成为软件开发中不可或缺的一部分。而在自动化测试中,Jenkins、Allure和Pytest这三个工具的组合可以说是非常流行和实用的。 Jenkins作为持续集成工具,可以充分利用其丰富的插件体系来搭建自动化测试环境; Allure则为我们…

怎么把jpg转换成pdf格式?实用又简单的方法来了

在工作和学习中,我们常常需要发送一些重要的图片给别人,这些图片可能包含学习资料或者重要的文件内容。但是发送多个JPG图片既不方便又不直观,所以我们需要将它们转换成PDF格式,以便于发送和查看。如果你不知道如何进行JPG到PDF的…

UI学习路线图2023完整版(适合自学)

作为数字时代中不可或缺的职业之一,UI设计师在今天和未来都有着广阔的职业前景。UI设计师有高需求行业、薪资高、职位晋升空间大、多样化的工作机会、职业发展空间大等许多优势,也有很多小伙伴想自学UI设计,但是不知道自己怎么学,…

服务器节点之间 如何实现自动化文件同步?

大数据、云计算、物联网的发展,使得企业能够拥有的数据急剧增加。面对快速变化和增长的庞大数据,如何高效地管理、利用数据对于企业来说至关重要。 但是,数据传输模式单一、自动化程度低、传输效率低下等难题,阻碍着企业对其数字…

TensorFlow 1.x 深度学习秘籍:6~10

原文:TensorFlow 1.x Deep Learning Cookbook 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如…

高级UI之Android事件分发机制原理及源码分析

前言 在 Android 中,事件分发机制是一块很重要的知识点, 掌握这个机制能帮你在平时的开发中解决掉很多的 View 事件冲突问题,这个问题也是面试中问的比较多的一个问题了,本篇就来总结下这个知识点。 事件分发原因 Android 中页…

RK3399平台开发系列讲解(外设篇)Camera OV13850配置过程

🚀返回专栏总目录 文章目录 一、DTS 配置二、驱动说明三、配置原理四、cam_board.xml沉淀、分享、成长,让自己和他人都能有所收获!😄 📢我们以 OV13850/OV5640 摄像头为例,讲解在该开发板上的配置过程。 一、DTS 配置 isp0: isp@ff910000 {…status = "okay&quo…

R-CNN(Region with CNN feature)

目录 1. 介绍 2. R-CNN 2.1 SS(Selective Search) 算法 生成候选框 2.2 CNN 提取特征 2.3 SVM 分类 非极大值抑制 2.4 回归器微调候选框 3. R-CNN 的缺点 1. 介绍 目标识别的发展历史如图 2. R-CNN RCNN 是两阶段目标检测的鼻祖,类似于深度学习开山之作Al…

第03章_流程控制语句

第03章_流程控制语句 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 本章专题与脉络 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模…

算法记录 | Day32 贪心算法

122.买卖股票的最佳时机II 贪心算法 思路: 把利润分解为每天为单位的维度,而不是从0天到第3天整体去考虑! 那么根据prices可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。 如图:…

PyCharm+PyQt5+pyinstaller打包labelImg.exe

0 开头 labelImg是一款标注软件,作为一个开源项目,它的源码可以在github上找到。官方仓库地址为: https://github.com/heartexlabs/labelImg 小白安装时的最新版本编译出来的界面长这样: 之前在小白的博客里,也教过…

Spring学习5

一、代理模式 代理模式就是AOP的底层! 1.代理模式的分类 静态代理动态代理2.静态代理 角色分析: 抽象角色:一般使用接口或者抽象类来解决真实角色:被代理的角色代理角色:代理真实角色后,一般会做一些附属操…

走进小程序【七】微信小程序【常见问题总结】

文章目录🌟前言🌟小程序登录🌟unionid 和 openid🌟关键Api🌟登录流程设计🌟利用现有登录体系🌟利用OpenId 创建用户体系🌟利用 Unionid 创建用户体系🌟授权获取用户信息流…

JVM内存模型详解

JVM内存模型和Java内存模型都是面试的热点问题,名字看感觉都差不多,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关mikechen。 什么是JVM JVM是Java Virtual …

【教学类-30-04】10以内减法题不重复(一页两份)(包括6以内、7以内、8以内、9以内、10以内减法题 只抽取25个)

作品展示 ——10以内不重复减法题 需求: 1、制作10以内减法题 材料准备: Word模板 代码展示: 6、7、8、9、10以内减法一页两份(10以内减法一页两份(6以内、7以内、8以内、9以内、10以内不重复减法题) 时间…

文件访问被拒绝?5个解决方法!

案例:文件访问被拒绝 【朋友们,想问问大家的电脑有遇到过文件访问被拒绝的情况吗?真的太头疼了,大家都是怎么解决的呢?】 在日常使用电脑和操作文件时,有时我们可能会遇到文件访问被拒绝的情况。这可能会…

Scala框架Akka学习

Scala框架Akka 文章目录Scala框架AkkaAkka概述Akka特点Akka与Scala.actors.Actor的关系Akka模型介绍Actor模型的优点Akka模型的核心概念如何创建Actor添加依赖在Akka中,Actor负责通信,在Actor中有一些重要的生命周期方法**akka的架构原理**创建Actor的步…

Charles二次开发-接口解密

1,使用背景 最近工作中对公司接口进行抓包,发现接口路径和返回都是经过加密的,对于查看接口路径及接口返回结果带来了不便,于是想到了对Charles进行小改造,在Charles上增加一个按钮对加密的请求、响应结果解密&#x…

[学习笔记]计算机图形学(一)

计算机图形学学习笔记(一) 什么是计算机图形学 计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。 什么是好的画面? 从技术层面简单的评判标准:直接看画面…

Android实现RecyclerView分组显示功能完整示例(自定义组头和Item布局)

实现效果截图&#xff1a; 首先&#xff0c;我们需要为RecyclerView添加一个分组的概念&#xff0c;我们可以创建一个Group类来表示分组&#xff0c;包括分组名称和分组中的数据项列表。代码如下&#xff1a; public class Group {private String name;private List<Item&g…