基于RandomForestRegressor的波士顿房价回归预测

RandomForestRegressor中文叫做随机森林回归模型,是一种常用的集成模型。

2018年8月27日笔记
sklearn官方英文用户使用指南:https://sklearn.org/user_guide.html
sklearn翻译中文用户使用指南:http://sklearn.apachecn.org/cn/0.19.0/user_guide.html
本文使用的数据集是波士顿房价数据集,可以使用sklearn,datasets库中的load_boston方法直接获取数据。

0.打开jupyter notebook

不知道怎么打开jupyter notebook的朋友请查看我的入门指南文章:https://www.jianshu.com/p/bb0812a70246

1.准备数据

阅读此篇文章的基础是已经阅读了作者的上一篇文章《基于LinearRegression的波士顿房价预测》。
文章链接:https://www.jianshu.com/p/f828eae005a1
加载数据集中的预测目标值。

from sklearn.datasets import load_boston

y = load_boston().target

如果阅读过上一篇文章,读者应该知道特征提取后的数据处理主要是对数据进行分箱,从而产生新的字段。
将数据处理的过程封装成函数,代码如下:

def dataProcessing(df):
    field_cut = {
    'CRIM' : [0,10,20, 100],
    'ZN' : [-1, 5, 18, 20, 40, 80, 86, 100], 
    'INDUS' : [-1, 7, 15, 23, 40],
    'NOX' : [0, 0.51, 0.6, 0.7, 0.8, 1],
    'RM' : [0, 4, 5, 6, 7, 8, 9],
    'AGE' : [0, 60, 80, 100],
    'DIS' : [0, 2, 6, 14],
    'RAD' : [0, 5, 10, 25],
    'TAX' : [0, 200, 400, 500, 800],
    'PTRATIO' : [0, 14, 20, 23],
    'B' : [0, 100, 350, 450],
    'LSTAT' : [0, 5, 10, 20, 40]
    }
    df = df[load_boston().feature_names].copy()
    cut_df = pd.DataFrame()
    for field in field_cut.keys():
        cut_series = pd.cut(df[field], field_cut[field], right=True)
        onehot_df = pd.get_dummies(cut_series, prefix=field)
        cut_df = pd.concat([cut_df, onehot_df], axis=1)
    new_df = pd.concat([df, cut_df], axis=1)
    return new_df

调用函数dataProcessing形成新的特征矩阵,代码如下:

import pandas as pd

df = pd.DataFrame(load_boston().data, columns=load_boston().feature_names)
new_df = dataProcessing(df)
print(new_df.columns)
new_df.head()

上面一段代码的运行结果如下图所示:


提取特征后的特征矩阵.png

将特征处理后的特征矩阵赋值给变量X,代码如下:

X = new_df.values

2.清除异常值

波士顿房价预测是kaggle网站上2016年的比赛。
网上有资料显示有部分预测目标异常值为50,所以我们删除具有此异常值的样本。
代码如下:

X = new_df.values
y = load_boston().target
print(X.shape)
X = X[y!=50]
y = y[y!=50]
print(X.shape)

上面一段代码的运行结果如下图所示:


image.png

从上图中可以看出,特征矩阵X的行数由506变成了490。

3.决策树回归模型

使用决策树回归模型做回归预测,并使用交叉验证查看模型得分。
调用sklearn.tree库的DecisionTreeRegressor方法实例化模型对象。
调用sklearn.model_selection库的KFold方法实例化交叉验证对象。
调用sklearn.model_selection库的cross_val_score方法做交叉验证。
cross_val_score方法需要4个参数,第1个参数是模型对象,第2个参数是特征矩阵X,第3个参数是预测目标值y,第4个关键字参数cv可以为整数或者交叉验证对象,此处因为样本数只有506个,所以得指定交叉验证对象,而且实例化交叉验证对象的时候,必须设置关键字参数shuffle=True,如果不进行设置,会发生严重的错误,读者可以自己尝试一下。
从官方文档查看cross_val_score方法如何使用的链接:http://sklearn.apachecn.org/cn/0.19.0/modules/generated/sklearn.model_selection.cross_val_score.html#sklearn.model_selection.cross_val_score
调用决策树回归模型的代码如下:

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

randomForest_model = RandomForestRegressor()
kf = KFold(n_splits=5, shuffle=True)
score_ndarray = cross_val_score(randomForest_model, X, y, cv=kf)
print(score_ndarray)
print(score_ndarray.mean())

上面一段代码的运行结果如下:

[0.72204027 0.74381333 0.78099897 0.74281036 0.71886066]
0.741704717235011

4.随机森林回归模型

使用随机森林回归模型做回归预测,并使用交叉验证查看模型得分。
调用sklearn.ensemble库的RandonForestRegressor方法实例化模型对象。
调用sklearn.model_selection库的KFold方法实例化交叉验证对象。
调用sklearn.model_selection库的cross_val_score方法做交叉验证。
随机森林回归模型的代码如下:

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

randomForest_model = RandomForestRegressor()
kf = KFold(n_splits=5, shuffle=True)
score_ndarray = cross_val_score(randomForest_model, X, y, cv=kf)
print(score_ndarray)
print(score_ndarray.mean())

上面一段代码的运行结果如下:

[0.86489282 0.8010495 0.85862078 0.85851694 0.86895527]
0.8504070609409359

5.结论

随机森林是多个决策树融合的集成模型,按照常理肯定会比单个决策树效果好。
使用随机森林回归模型可以取得较好的回归效果,比使用单个决策树回归模型提升了11%左右的准确率。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容