百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

波士顿房价预测案例

bigegpt 2024-08-06 11:54 3 浏览

导入相关库

%matplotlib inline
import numpy as np
#pandas读取.csv文件
import pandas as pd
from sklearn.datasets import load_boston
#train_test_split函数用于数据集划分
from sklearn.cross_validation import train_test_split

查看数据集


#load_boston函数加载数据集
boston=load_boston
#输出对数据集的描述
print(boston.DESCR)
#X是boston数据集的特征,y是对应房价
X=boston.data
y=boston.target

数据集划分

#将数据集划分成75%的训练集和25%的测试集,random_state控制随机性
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=33,test_size=0.25)
#查看数据集的shape
print("Train dataset's shape is :",X_train.shape)
print("Test dataset's shape is :",X_test.shape)

数据预处理

#分析预测值的差异。预测房价之间差距较大,因此先对特征以及目标值进行标准化处理
#输出预测值的最大值、最小值和平均值
print("The maximum target value is :",np.max(boston.target))
print("The minimum target value is :",np.min(boston.target))
print("The mean target value is :",np.mean(boston.target))
#导入数据标准化模块
from sklearn.preprocessing import StandardScaler
#对数据集标准化处理。标准化处理对象,使用该对象的fit_transform函数
ss_X=StandardScaler
ss_y=StandardScaler
#使用fit_transform函数对特征、预测值标准化处理。在python 3中,由于y_train是一个np.array([……])的(1×N列)对象,要转化成(N×1)列的np.array对像,使用reshape(-1,1)函数,第一个-1表示可为任意行,第二个1表示1列。
X_train=ss_X.fit_transform(X_train)
X_test=ss_X.transform(X_test)
y_train = ss_y.fit_transform(y_train.reshape(-1, 1))
y_test = ss_y.transform(y_test.reshape(-1,1))

建立模型

#导入线性回归模型
from sklearn.linear_model import LinearRegression
#使用默认配置的初始化线性回归LinearRegression建立简单的线性回归模型
lr=LinearRegression
lr.fit(X_train,y_train)
#做预测
lr_y_predict=lr.predict(X_test)
#模型评估:使用LinearRegression模型自带的评估模块,并输出评估结果
print("lr_score:",lr.score(X_test,y_test))
#从sklearn.metrics中导入R-square,MSE,MAE,使用R-square,MSE(平均绝对误差),MAE(均方误差)评估LinearRegression回归性能
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
#计算r2_score
print("r2_score:",r2_score(y_test,lr_y_predict))
#计算平均绝对误差,使用inverse_transform函数是将归一化后的预测值再次转回原来的目标预测值
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict)))
#计算均方误差
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict)))

输出结果:

lr_score: 0.6763403831

r2_score: 0.6763403831

MSE: 25.0969856921

MAE: 3.5261239964

#使用默认配置的初始化线性回归SGDRegressor
from sklearn.linear_model import SGDRegressor
sgdr=SGDRegressor(max_iter=5)
#拟合模型,y_train.ravel将N×1的2维np.array对象转成1维的np.array对象
sgdr.fit(X_train,y_train.ravel)
sgdr_y_predict=sgdr.predict(X_test)
#使用LinearRegression模型自带的评估模块,并输出评估结果
print("sgdr_score:",sgdr.score(X_test,y_test))
print("r2_score:",r2_score(y_test,sgdr_y_predict))
print("r2_score:",r2_score(ss_y.inverse_transform(y_test),ss_y.inverse_transform(sgdr_y_predict)))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(sgdr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(sgdr_y_predict)))

输出结果:

sgdr_score: 0.657641746361

r2_score: 0.657641746361

r2_score: 0.657641746361

MSE: 26.5469021914

MAE: 3.50598660941

#使用sklearn.svm中的支持向量回归
from sklearn.svm import SVR
#使用线性核函数
linear_svr=SVR(kernel='linear')
linear_svr.fit(X_train,y_train.ravel)
linear_svr_y_predict=linear_svr.predict(X_test)
print("linear_svm_score:",linear_svr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,linear_svr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(linear_svr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(linear_svr_y_predict)))

输出结果:

linear_svm_score: 0.65171709743

r2_score: 0.65171709743

MSE: 27.0063071393

MAE: 3.42667291687

#使用多项式核函数
poly_svr=SVR(kernel='poly')
poly_svr.fit(X_train,y_train.ravel)
poly_svr_y_predict=poly_svr.predict(X_test)
print("linear_svm_score:",poly_svr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,poly_svr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(poly_svr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(poly_svr_y_predict)))

输出结果:

poly_svm_score: 0.404454058003

r2_score: 0.404454058003

MSE: 46.179403314

MAE: 3.75205926674

使用径向基核函数
rbf_svr=SVR(kernel='rbf')
rbf_svr.fit(X_train,y_train.ravel)
rbf_svr_y_predict=rbf_svr.predict(X_test)
print("linear_svm_score:",rbf_svr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,rbf_svr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(rbf_svr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(rbf_svr_y_predict)))

输出结果:

rbf_svm_score: 0.756406891227

r2_score: 0.756406891227

MSE: 18.8885250008

MAE: 2.60756329798

#k近邻回归模型
#从sklearn.neighbors导入KNeighborRegressor
from sklearn.neighbors import KNeighborsRegressor
#初始化K近邻回归器,并且调整配置,使得预测的方式为平均回归:weights='uniform'
uni_knr = KNeighborsRegressor(weights='uniform')
uni_knr.fit(X_train, y_train.ravel)
uni_knr_y_predict = uni_knr.predict(X_test)
print("uni_knr_score:",uni_knr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,uni_knr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(uni_knr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(uni_knr_y_predict)))

输出结果:

uni_knr_score: 0.690345456461

r2_score: 0.690345456461

MSE: 24.0110141732

MAE: 2.96803149606

#初始化K近邻回归器,并且调整配置,使得预测的方式为根据距离加权回归:weights='distance'
dis_knr = KNeighborsRegressor(weights='distance')
dis_knr.fit(X_train, y_train.ravel)
dis_knr_y_predict = dis_knr.predict(X_test)
print("dis_knr_score:",dis_knr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,dis_knr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(dis_knr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(dis_knr_y_predict)))

输出结果:

dis_knr_score: 0.719758997016

r2_score: 0.719758997016

MSE: 21.7302501609

MAE: 2.80505687851

# 建立决策树回归,从sklearn.tree中导入DecisionTreeRegressor
from sklearn.tree import DecisionTreeRegressor
# 使用默认配置初始化的DecisionTreeRegressor
dtr = DecisionTreeRegressor
dtr.fit(X_train, y_train.ravel)
dtr_y_predict = dtr.predict(X_test)
print("dtr_score:",dtr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,dtr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(dtr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(dtr_y_predict)))

输出结果:

dtr_score: 0.724186586586

r2_score: 0.724186586586

MSE: 21.3869291339

MAE: 2.90866141732

#建立随机森林回归(RFR)、极端随机森林(ETRT)回归和梯度提升回归树(GBRT)
# 从sklearn.ensemble中导入RandomForestRegressor、ExtraTreesRegressor以及GradientBoostingRegressor
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, GradientBoostingRegressor
# 使用RandomForestRegressor训练模型,并对测试数据做出预测,结果存储在变量rfr_y_predict中
rfr = RandomForestRegressor
rfr.fit(X_train, y_train.ravel)
rfr_y_predict = rfr.predict(X_test)
print("rfr_score:",rfr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,rfr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(rfr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(rfr_y_predict)))

输出结果:

rfr_score: 0.809357176431

r2_score: 0.809357176431

MSE: 14.7826913386

MAE: 2.45228346457

# 使用默认配置的ExtraTreesRegressor训练模型
etr = ExtraTreesRegressor
etr.fit(X_train, y_train.ravel)
etr_y_predict = etr.predict(X_test)
print("etr_score:",etr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,etr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(etr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(etr_y_predict)))

输出结果:

etr_score: 0.788650201156

r2_score: 0.788650201156

MSE: 16.3883370079

MAE: 2.47952755906

# 使用GradientBoostingRegressor(GBRT)训练模型
gbr = GradientBoostingRegressor
gbr.fit(X_train, y_train.ravel)
gbr_y_predict = gbr.predict(X_test)
print("gbr_score:",gbr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,gbr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(gbr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(gbr_y_predict)))

输出结果:

gbr_score: 0.840064661194

r2_score: 0.840064661194

MSE: 12.4015932173

MAE: 2.28207298939

#使用默认配置的AdaBoostRegressor训练模型
from sklearn.ensemble import AdaBoostRegressor
abr = AdaBoostRegressor
abr.fit(X_train,y_train.ravel)
abr_y_predict = abr.predict(X_test)
print("abr_score:",abr.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,abr_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(abr_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(abr_y_predict)))

输出结果:

abr_score: 0.783785004026

r2_score: 0.783785004026

MSE: 16.7655906917

MAE: 2.89216618687

#使用默认配置的XGBRegressor训练模型
from xgboost import XGBRegressor
xgb = XGBRegressor
xgb.fit(X_train,y_train.ravel)
xgb_y_predict = xgb.predict(X_test)
print("xgbr_score:",xgb.score(X_test,y_test.ravel))
print("r2_score:",r2_score(y_test,xgb_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(xgb_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(xgb_y_predict)))

输出结果:

xgbr_score: 0.843513197537

r2_score: 0.843513197537

MSE: 12.1341891225

MAE: 2.29020682132

#建立lightgbm模型
import lightgbm as lgb
params = {
'num_leaves': 6,
'objective': 'regression',
'min_data_in_leaf': 16,
'learning_rate': 0.04,
'feature_fraction': 0.97,
'bagging_fraction': 0.97,
'bagging_freq': 1,
'metric': 'l2',
'num_threads': 1
}
dtrain = lgb.Dataset(X_train, label=y_train.ravel)
#训练模型
lgb_ = lgb.train(params,dtrain,1000)
#做预测
lgb_y_predict = lgb_.predict(X_test)
print("r2_score:",r2_score(y_test,lgb_y_predict))
print("MSE:",mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lgb_y_predict)))
print("MAE:",mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lgb_y_predict)))

输出结果:

r2_score: 0.845939419188

MSE: 11.9460568773

MAE: 2.1404921479

特征重要性

#特征重要性
dtrimp = dtr.feature_importances_
rfrimp = rfr.feature_importances_
etrimp = etr.feature_importances_
gbrimp = gbr.feature_importances_
abrimp = abr.feature_importances_
xgbimp = xgb.feature_importances_
#建立特征字典
d = {'Decision Tree':dtrimp, 'Random Forest':rfrimp, 'Gradient Boost':gbrimp,'Ada boost':abrimp, 'Extra Tree':etrimp,'Xgb boost':xgbimp}
#将字典写入DataFrame,便于后面写成.csv格式
features = pd.DataFrame(data = d)
# 查特征看前几行
features.head
#为DataFrame新增两列“mean”和“names”
features['mean'] = features.mean(axis= 1)
features['names'] = boston.feature_names
#将Dataframe转化成csv文件!
features.to_csv("features_2.csv")

总结

  1. GBTR、Lightgbm、RFR、XGBR的表现最好。

  2. 本文模型几乎都使用默认配置,没有进行超参数调优;可进行交叉验证选择模型参数。

  3. 怎么将np.array格式的数组写成csv文件格式:先写成字典,再弄成DataFrame格式,最后使用to_csv函数;以及如何为csv文件新增列。

  4. 思考为什么集成模型表现最好?

  5. from sklearn.cross_validation import train_test_split
    from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
    from sklearn.preprocessing import StandardScaler
    from sklearn.linear_model import LinearRegression
    from sklearn.linear_model import SGDRegressor
    from sklearn.svm import SVR
    from sklearn.neighbors import KNeighborsRegressor
    from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, GradientBoostingRegressor
    from sklearn.ensemble import AdaBoostRegressor
    from xgboost import XGBRegressor
    import lightgbm as lgb

相关推荐

Linux 系统启动完整流程

一、启动系统流程简介如上图,简述系统启动的大概流程:1:硬件引导UEFi或BIOS初始化,运行POST开机自检2:grub2引导阶段系统固件会从MBR中读取启动加载器,然后将控制权交给启动加载器GRU...

超专业解析!10分钟带你搞懂Linux中直接I/O原理

我们先看一张图:这张图大体上描述了Linux系统上,应用程序对磁盘上的文件进行读写时,从上到下经历了哪些事情。这篇文章就以这张图为基础,介绍Linux在I/O上做了哪些事情。文件系统什么是...

linux入门系列12--磁盘管理之分区、格式化与挂载

前面系列文章讲解了VI编辑器、常用命令、防火墙及网络服务管理,本篇将讲解磁盘管理相关知识。本文将会介绍大量的Linux命令,其中有一部分在“linux入门系列5--新手必会的linux命令”一文中已经...

Linux环境下如何设置多个交叉编译工具链?

常见的Linux操作系统都可以通过包管理器安装交叉编译工具链,比如Ubuntu环境下使用如下命令安装gcc交叉编译器:sudoapt-getinstallgcc-arm-linux-gnueab...

可算是有文章,把Linux零拷贝技术讲透彻了

阅读本文大概需要6.0分钟。作者:卡巴拉的树链接:https://dwz.cn/BaQWWtmh本文探讨Linux中主要的几种零拷贝技术以及零拷贝技术适用的场景。为了迅速建立起零拷贝的概念...

linux软链接的创建、删除和更新

大家都知道,有的时候,我们为了省下空间,都会使用链接的方式来进行引用操作。同样的,在系统级别也有。在Windows系列中,我们称其为快捷方式,在Linux中我们称其为链接(基本上都差不多了,其中可能...

Linux 中最容易被黑客动手脚的关键目录

在Linux系统中,黑客攻击后常会针对关键目录和文件进行修改以实现持久化、提权或隐藏恶意活动。本文介绍下黑客最常修改的目录及其手法。一、/etc目录关键文件有:/etc/passwd和/et...

linux之间传文件命令之Rsync傻瓜式教程

1.前言linux之间传文件命令用什么命令?本文介绍一种最常用,也是功能强大的文件同步和传输工具Rsync,本文提供详细傻瓜式教程。在本教程中,我们将通过实际使用案例和最常见的rsync选项的详细说...

Linux下删除目录符号链接的方法

技术背景在Linux系统中,符号链接(symlink)是一种特殊的文件,它指向另一个文件或目录。有时候,我们可能需要删除符号链接,但保留其指向的目标目录。然而,在删除符号链接时可能会遇到一些问题,例如...

阿里云国际站注册教程:aa云服务器怎么远程链接?

在全球化的今天,互联网带给我们无以计数的便利,而云服务器则是其中的重要基础设施之一。这篇文章将围绕阿里云国际站注册、aa云服务器如何远程链接,以及服务器安全防护如Ddos防火墙、网站应用防护waf防火...

Linux 5.16 网络子系统大范围升级 多个新适配器驱动加入

Linux在数据中心中占主导地位,因此每个内核升级周期的网络子系统变化仍然相当活跃。Linux5.16也不例外,周一最新与网络相关的更新加入了大量的驱动和新规范的支持。一个较新硬件的驱动是Realt...

搭建局域网文件共享服务(Samba),手机电脑都能看喜欢的影视剧

作为一名影视爱好者,为了方便地观看自己喜欢的影视作品,在家里搞一个专门用来存放电影的服务器是有必要的。蚁哥选则用一台Ubuntu系统的电脑做为服务器,共享影音文件,其他同一个局域网内的电脑或手机可以...

分享一个实用脚本—centos7系统巡检

概述这周闲得慌,就根据需求写了差不多20个脚本(部分是之前分享过的做了一些改进),今天主要分享一个给平时运维人员用的centos7系统巡检的脚本,或者排查问题检查系统情况也可以用..实用脚本#!/bi...

Linux 中创建符号链接的方法

技术背景在Linux系统里,符号链接(SymbolicLink),也被叫做软链接(SoftLink),是一种特殊的文件,它指向另一个文件或者目录。符号链接为文件和目录的管理带来了极大的便利,比...

一文掌握 Linux 符号链接

符号链接(SymbolicLink),通常被称为“软链接”,是Linux文件系统中一种强大而灵活的工具。它允许用户创建指向文件或目录的“快捷方式”,不仅简化了文件管理,还在系统配置、软件开发和日...