波士顿房价预测(线性回归、岭回归、决策树)

波士顿房价预测

要求:

1.载入此项目所需要的库,载入波士顿房屋的数据集
2.数据集1:3比例分割为 测试集:训练集
3.定义线性回归模型,进行训练、预测
4.图形化预测结果显示(部分数据显示)
5.输出模型参数、评价模型(MSE RMSE)
6(选做不计分)使用最优决策树预测。
提示:
使用sklearn 中datasets 和linear_model和metrics。
使用sklearn.model_selection 中 train_test_split。
导入的数据集: datasets.load_boston()。
linear_model.LinearRegression fit和predict方法等。
学有余力的同学可以建立最优决策树,并比较MSE RMSE,选做时建议使用 KFold DecisionTreeRegressor make_scorer GridSearchCV grid.fit grid.best_estimator_等

程序

载入库

import numpy as np
import pandas
import math
from matplotlib import pyplot
from sklearn.datasets import load_boston  # 数据
from sklearn.preprocessing import StandardScaler  # 标准化
from  sklearn.linear_model import LinearRegression # 正规方程求解的线性回归
from sklearn.model_selection import train_test_split # 训练集 特征值拆分
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error

载入数据集

data = load_boston()
# 获取特征值
feature = data['data']  # 特征值
target = data['target'] #目标值
feature_names = data['feature_names']  # 特征值的列名

数据集1:3比例分割为 测试集:训练集

# 拆分数据集  -- 拆分成训练集与测试集,特征值与目标值
#feature,target,test_size=0.25 特征值 、目标值、测试集占比 1:3
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.25) # 种子随机
#分析回归目标值的差异
print("The max target value is ",np.max(data.target))
print("The min target value is ",np.min(data.target))
print("The averge target value is ",np.mean(data.target))

```python
# 进行归一化---目标值是具体的房价,特征值是各个特征,将其转化到一个小范围区间
# 目标值不需要归一化, 特征值需要归一化
stand = StandardScaler()#标准化操作
x_train  = stand.fit_transform(x_train)#计算训练数据的均值和方差,基于计算出来的均值和方差来转换训练数据,从而把数据转换成标准的正态分布
x_test  = stand.fit_transform(x_test)

定义线性回归模型,训练、预测

# 线性回归

# 进行构建模型 -- 线性模型
lr = LinearRegression()
# 训练数据
lr.fit(x_train,y_train)
# 使用测试数据进行回归预测
y_predict = lr.predict(x_test)
# 训练数据的预测值
y_train_predict=lr.predict(x_train)

## 计算准确率
#score = lr.score(x_test,y_test)
#print('线性回归模型的准确率:'+r'R^2=%f' % (score))
## 线性回归的系数
#print('线性回归的系数为:\n w = %s \n b = %s' % (lr.coef_, lr.intercept_))

图形化显示预测结果

# 画布
pyplot.figure()
# 默认不支持中文,需要配置RC 参数
pyplot.rcParams['font.sans-serif'] = 'SimHei'
# 设置字体之后不支持负号,需要去设置RC参数更改编码
pyplot.rcParams['axes.unicode_minus'] = False
# 绘图
# 折线图
x = numpy.arange(0,len(y_predict))
pyplot.plot(x,y_test,marker='*')
pyplot.plot(x,y_predict,marker='.' )
# 增加标题
pyplot.title('房价预测与真实值的走势')
# 增加横轴,纵轴名称
pyplot.xlabel('x')
pyplot.ylabel('房价')
# 图例
pyplot.legend(['真实值','预测值'])
# 画图
pyplot.show()

输出模型参数、评价模型(MSE、RMSE)

# 计算MSE(平均方差)
MSE = mean_squared_error(y_train, y_train_predict)
# 计算RMSE(均方根误差)
RMSE = math.sqrt(MSE)
print('MSE = %.4f'% (MSE))
print('RMSE = %.f' % RMSE)

决策树

from sklearn.tree import DecisionTreeRegressor
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
 
# 准备数据集
boston = load_boston()
 
# 获取特征集和房价
features = boston.data
prices = boston.target
 
# 随机抽取25% 的数据作为测试集,其余为训练集
train_features, test_features, train_price, test_price = train_test_split(features, prices, test_size=0.25)
 
# 创建CART回归树
dtr = DecisionTreeRegressor()
 
# 拟合构造CART回归树
dtr.fit(train_features, train_price)
 
# 预测测试集中的房价
predict_price = dtr.predict(test_features)
 
# 测试集的结果评价
print('回归树准确率:', dtr.score(test_features, test_price)) 
print('回归树r2_score:', r2_score(test_price, predict_price)) 
print('回归树二乘偏差均值:', mean_squared_error(test_price, predict_price))
print('回归树绝对值偏差均值:', mean_absolute_error(test_price, predict_price)) 

输出模型参数、评价模型(MSE、RMSE)

from sklearn.tree import export_graphviz
import graphviz
# dtr 为决策树对象
dot_data = export_graphviz(dtr)
graph = graphviz.Source(dot_data)
# 生成 Source.gv.pdf 文件,并打开
graph.view()
import matplotlib.pyplot as plt
import numpy as np
 
# mode 是我们训练出的模型,即决策树对象
# data 是原始数据集
n_features = boston.data.shape[1]
plt.barh(range(n_features), dtr.feature_importances_, align='center')
plt.yticks(np.arange(n_features), boston.feature_names)
plt.xlabel("Feature importance")
plt.ylabel("Feature")
plt.savefig('weight.jpg',dpi=500)
plt.show()
#保留RM`LSTAT`PTRATIO`DIS四个参数
# 载入此项目所需要的库
import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit
# 让结果在notebook中显示
%matplotlib inline

# 载入波士顿房屋的数据集
data = pd.read_csv('house.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
    
# 完成
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
# 随机抽取25% 的数据作为测试集,其余为训练集
train_features, test_features, train_price, test_price = train_test_split(features, prices, test_size=0.25)
 
# 创建CART回归树
dtr = DecisionTreeRegressor()
 
# 拟合构造CART回归树
dtr.fit(train_features, train_price)
 
# 预测测试集中的房价
predict_price = dtr.predict(test_features)
 
# 测试集的结果评价
print('score:', dtr.score(test_features, test_price)) 
print('R2:', r2_score(test_price, predict_price)) 
print('MSE:', mean_squared_error(test_price, predict_price))
print('MAE:', mean_absolute_error(test_price, predict_price)) 

利用garphviz软件画出决策树

from sklearn.tree import export_graphviz
import graphviz
# dtr 为决策树对象
dot_data = export_graphviz(dtr)
graph = graphviz.Source(dot_data)
# 生成 Source.gv.pdf 文件,并打开
graph.view()
# 载入画图所需要的库 matplotlib
import matplotlib.pyplot as plt

# 使输出的图像以更高清的方式显示
%config InlineBackend.figure_format = 'retina'

# 调整图像的宽高
plt.figure(figsize=(16,4))
for i, key in enumerate(['RM', 'LSTAT']):
    plt.subplot(1, 2, i+1)
    plt.xlabel(key)
    plt.scatter(data[key], data['MEDV'], alpha=0.5)
plt.savefig('effect1.png',dpi=500)
#, 
plt.figure(figsize=(16,4))
for i, key in enumerate(['PTRATIO','DIS']):
    plt.subplot(1, 2, i+1)
    plt.xlabel(key)
    plt.scatter(data[key], data['MEDV'], alpha=0.5)
plt.savefig('effect2.png',dpi=500)
#保留RM`LSTAT`PTRATIO`DIS四个参数
# 载入此项目所需要的库
import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit
# 让结果在notebook中显示
%matplotlib inline

# 载入波士顿房屋的数据集
data = pd.read_csv('house.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
    
# 完成
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
# 随机抽取25% 的数据作为测试集,其余为训练集
train_features, test_features, train_price, test_price = train_test_split(features, prices, test_size=0.25)
 
# 创建CART回归树
dtr = DecisionTreeRegressor()
 
# 拟合构造CART回归树
dtr.fit(train_features, train_price)
 
# 预测测试集中的房价
predict_price = dtr.predict(test_features)
 
# 测试集的结果评价
print('score:', dtr.score(test_features, test_price)) 
print('R2:', r2_score(test_price, predict_price)) 
print('MSE:', mean_squared_error(test_price, predict_price))
print('MAE:', mean_absolute_error(test_price, predict_price)) 
from sklearn.tree import export_graphviz
import graphviz
# dtr 为决策树对象
dot_data = export_graphviz(dtr)
graph = graphviz.Source(dot_data)
# 生成 Source.gv.pdf 文件,并打开
graph.view()
# 载入画图所需要的库 matplotlib
import matplotlib.pyplot as plt

# 使输出的图像以更高清的方式显示
%config InlineBackend.figure_format = 'retina'

# 调整图像的宽高
plt.figure(figsize=(16,4))
for i, key in enumerate(['RM', 'LSTAT']):
    plt.subplot(1, 2, i+1)
    plt.xlabel(key)
    plt.scatter(data[key], data['MEDV'], alpha=0.5)
plt.savefig('effect1.png',dpi=500)
#, 
plt.figure(figsize=(16,4))
for i, key in enumerate(['PTRATIO','DIS']):
    plt.subplot(1, 2, i+1)
    plt.xlabel(key)
    plt.scatter(data[key], data['MEDV'], alpha=0.5)
plt.savefig('effect2.png',dpi=500)

岭回归

#要用到的包
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import SGDRegressor
from sklearn.linear_model import Ridge#导入岭回归

# 1.获取数据 laod_boston bunch字典
data = load_boston()

# 2.数据集划分 数据的基本处理
x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22)

# 3.特征工程-标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)

# 4.机器学习-线性回归(岭回归)【重要】
# 4.1 创建模型 实例化估计器
estimator = Ridge(alpha=1)#(alpha表示正则的程度)
# 4.2 训练模型 fit 正规方程计算得到最优可训练参数
estimator.fit(x_train, y_train)

# 5.模型评估
# 5.1 获取系数等值
y_predict = estimator.predict(x_test)

# 5.2 评价
print("Training set score: {:.2f}".format(estimator.score(x_train, y_train)))
print("Test set score: {:.2f}".format(estimator.score(x_test, y_test)))
error = mean_squared_error(y_test, y_predict)
print("MSE:\n", error)
print("RMSE:\n",error**0.5)
print("Training set score: {:.2f}".format(estimator.score(x_train, y_train)))
print("Test set score: {:.2f}".format(estimator.score(x_test, y_test)))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值