机器学习实战--住房月租金预测(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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学