机器学习实战--住房月租金预测(2)

2023-11-23 04:21

本文主要是介绍机器学习实战--住房月租金预测(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3901436-e386f67f88f8337d

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。

作者:Ahab  

个人公众号:Ahab杂货铺


前言

上次对租金预测比赛进行的是数据分析部分的处理

机器学习实战--住房月租金预测(1)

,今天继续分享这次比赛的收获。本文会讲解对特征工程的处理。话不多说,我们开始吧!


特征工程

3901436-80b29718f522643a


“数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这里的数据指的就是经过特征工程得到的数据。特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器学习模型逼近这个上限。特征工程能使得模型的性能得到提升,有时甚至在简单的模型上也能取得不错的效果。特征工程在机器学习中占有非常重要的作用,上面的思维导图包含了针对特征工程处理的所有方法。



缺失值处理


1print(all_data.isnull().sum())


使用上面的语句可以查看数据集中的缺失值

3901436-9fb0d8748cd9549f


从上面的图中可以清楚的看到各数据的缺失值。


对于缺失值是任何一个数据集都不可避免的,在数据统计过程中可能是无意的信息被遗漏,比如由于工作人员的疏忽,忘记而缺失;或者由于数据采集器等故障等原因造成的缺失,或者是有意的有些数据集在特征描述中会规定将缺失值也作为一种特征值,再或者是不存在的,有些特征属性根本就是不存在的。


缺失值的处理,我们常用的方法有:删除记录:对于样本数据量较大且缺失值不多同时正相关性不大的情况下是有效可以使用 pandas 的 dropna 来直接删除有缺失值的特征。数据填充:数据填充一般采用均值,中位数和中数,当然还有其他的方法比如热卡填补(Hot deck imputation),K最近距离邻法(K-means clustering)等。不作处理:因为一些模型本身就可以应对具有缺失值的数据,此时无需对数据进行处理,比如Xgboost,rfr等高级模型,所以我们可以暂时不作处理。

对于这次比赛缺失值的处理主要是数据的填充 。

 1cols=["renovated", "living_status","subway_distance" , "subway_station", "subway_line"]
2for col in cols:
3    kc_train[col].fillna(0, inplace=True)
4    kc_test[col].fillna(0, inplace=True)
5
6kc_train["way_rent"].fillna(2, inplace=True)
7kc_test["way_rent"].fillna(2, inplace=True)
8kc_train["area"].fillna(8, inplace=True)
9kc_train = kc_train.fillna(kc_train.mean())
10kc_test["area"].fillna(8, inplace=True)
11kc_test = kc_test.fillna(kc_test.mean())

对于装修状态,居住状态,距离,地铁站点和线路均用0填充,区均用中位数8来填充,出租方式用2填充,同时做了一个判断

1kc_train['is_living_status'] = kc_train['living_status'].apply(lambda x: 1 if x > 0 else 0)
2kc_train['is_subway'] = kc_train['subway_distance'].apply(lambda x: 1 if x > 0 else 0)
3kc_train['is_renovated'] = kc_train['renovated'].apply(lambda x: 1 if x > 0 else 0)
4kc_train['is_rent'] = kc_train['way_rent'].apply(lambda x: 1 if x < 2 else 0)
5
6kc_test['is_living_status'] = kc_test['living_status'].apply(lambda x: 1 if x > 0 else 0)
7kc_test['is_subway'] = kc_test['subway_distance'].apply(lambda x: 1 if x > 0 else 0)
8kc_test['is_renovated'] = kc_test['renovated'].apply(lambda x: 1 if x > 0 else 0)
9kc_test['is_rent'] = kc_test['way_rent'].apply(lambda x: 1 if x < 2 else 0)



异常值处理

异常值是分析师和数据科学家常用的术语,因为它需要密切注意,否则可能导致错误的估计。 简单来说,异常值是一个观察值,远远超出了样本中的整体模式。

什么会引起异常值呢?

主要有两个原因:人为错误和自然错误

如何判别异常值?

正态分布图,箱装图或者离散图以正态分布图为例:符合正态分布时,根据正态分布的定义可知,距离平均值3δ之外的概率为 P(|x-μ|>3δ) <= 0.003 ,这属于极小概率事件,在默认情况下我们可以认定,距离超过平均值3δ的样本是不存在的。 因此,当样本距离平均值大于3δ,则认定该样本为异常值。当数据不服从正态分布:当数据不服从正态分布,可以通过远离平均距离多少倍的标准差来判定,多少倍的取值需要根据经验和实际情况来决定。

异常值的处理方法常用有四种:
1.删除含有异常值的记录
2.将异常值视为缺失值,交给缺失值处理方法来处理
3.用平均值来修正
4.不处理


 1all_data = pd.concat([train, test], axis = 0, ignore_index= True)
2all_data.drop(labels = ["price"],axis = 1, inplace = True)
3fig = plt.figure(figsize=(12,5))
4ax1 = fig.add_subplot(121)
5ax2 = fig.add_subplot(122)
6g1 = sns.distplot(train['price'],hist = True,label='skewness:{:.2f}'.format(train['price'].skew()),ax = ax1)
7g1.legend()
8g1.set(xlabel = 'Price')
9g2 = sns.distplot(np.log1p(train['price']),hist = True,label='skewness:{:.2f}'.format(np.log1p(train['price']).skew()),ax=ax2)
10g2.legend()
11g2.set(xlabel = 'log(Price+1)')
12plt.show()

查看训练集的房价分布,左图是原始房价分布,右图是将房价对数化之后的。

3901436-9efd2eba68327ef9

由于房价是有偏度的,将房价对数化并且将有偏的数值特征对数化


1train['price'] = np.log1p(train['price']) 
2
3# 将有偏的数值特征对数化
4num_features_list = list(all_data.dtypes[all_data.dtypes != "object"].index)
5
6for i in num_features_list:
7    if all_data[i].dropna().skew() > 0.75:
8        all_data[i] = np.log1p(all_data[i])

根据上一篇我们筛选出的十个最相关的特征值,画出离散图,并且对离散点做处理,这里只取房屋面积举个栗子。

1var = 'sqft_living'
2data = pd.concat([train['price'], train[var]], axis=1)
3data.plot.scatter(x=var, y='price', ylim=(0,150));


3901436-5e388a928393c349

1train.drop(train[(train["sqft_living"]>0.125)&(train["price"]<20)].index,inplace=True)

这里将面积大于0.125且价格小于20的点全部删除。


对于特征工程的处理这是在自己代码中最重要的两步--缺失值和异常值的处理,将类别数值转化为虚拟变量和归一化的处理效果不是特别好所以没有贴上,数据集中的房屋朝向可以采用独热编码,感兴趣的可以试一下,我一直没搞懂看了同学的处理他的代码量太大,效果也不是特别明显,自己索性没去研究。下一次更新将针对这个问题进行模型选择。


3901436-95ad4c0c883608a4


推荐阅读:

由椰树椰汁广告想到,关于美女营销


【3分钟速读】运营到底是干啥的?


TensorFlow 2.0 Alpha 版发布啦!快来尝鲜!


公众号后台回复关键词学习

回复 免费                获取免费课程

回复 直播                获取系列直播课

回复 Python           1小时破冰入门Python

回复 人工智能         从零入门人工智能

回复 深度学习         手把手教你用Python深度学习

回复 机器学习         小白学数据挖掘与机器学习

回复 贝叶斯算法      贝叶斯与新闻分类实战

回复 数据分析师      数据分析师八大能力培养

回复 自然语言处理  自然语言处理之AI深度学习

这篇关于机器学习实战--住房月租金预测(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415321

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.