线性回归预测波士顿房价

线性回归预测波士顿房价

一、数据理解

理解数据集背景以及数据含义

img

详细见文档《数据集说明》

二、数据读入

使用pandas 读入数据并输出读入的数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets

# 加载波士顿房价的数据集
boston = pd.read_csv('house_data.csv')

# 输出数据集看一下
print(boston)

# 显示前十行数据
boston.head(10)

# 输出数据集的描述
boston.info()

# 读入数据
boston_df = pd.DataFrame(boston, columns=boston.columns)
# 查看数据是否存在空值,从结果来看数据不存在空值。
boston_df.isnull().sum()

# 查看数据大小
boston_df.shape

# 显示数据前5行
boston_df.head()

# 查看数据的描述信息,在描述信息里可以看到每个特征的均值,最大值,最小值等信息。
boston_df.describe()

在这里插入图片描述

# 各个特征和MEDV的线性关系。
plt.figure(facecolor='gray')
corr = boston_df.corr()
corr = corr['MEDV']
corr[abs(corr) > 0.5].sort_values().plot.bar()

从图片结果可以得出,LSTAT、PTRATIO、RM和MEDV的相关性都超过0.5。

接下来通过数据分布图来分别观察特征值’crim’, ‘rm’, 'lstat’和目标值’medv’之间的关系。

# LSTAT 和MEDV的散点图
plt.figure(facecolor='gray')
plt.scatter(boston_df['LSTAT'], boston_df['MEDV'], s=30, edgecolor='white')
plt.title('LSTAT')

说明:LSTAT与MEDV呈负相关性

# CRIM 和MEDV的散点图
plt.figure(facecolor='gray')
plt.scatter(boston_df['CRIM'], boston_df['MEDV'], s=30, edgecolor='white')
plt.title('CRIM')

说明:CRIM和MEDV呈负相关性

# RM 和MEDV的散点图
plt.figure(facecolor='gray')
plt.scatter(boston_df['RM'], boston_df['MEDV'], s=30, edgecolor='white')
plt.title('RM')
plt.show()

说明:RM和MEDV呈正相关性

三、定义特征值、目标值

使用’crim’, ‘rm’, 'lstat’作为特征值,'medv’为目标值,输出特征值的描述性统计

boston_df['MEDV'] = boston['MEDV']
#分析房屋的’RM’, ‘LSTAT’,'CRIM’ 特征与MEDV的相关性性,所以,将其余不相关特征移除
boston_df = boston_df[['LSTAT', 'CRIM', 'RM', 'MEDV']]
# 目标值
y = np.array(boston_df['MEDV'])
boston_df = boston_df.drop(['MEDV'], axis=1)
# 特征值
X = np.array(boston_df)

四、区分训练集和测试集

split_num = int(len(features)*0.7)

from sklearn.model_selection import train_test_split
 
#70%用于训练,30%用于测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=10)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

五、线性回归

利用sklearn的LinearRegression()函数进行线性回归,输出模型的回归方程系数及方程的截距

from sklearn import preprocessing
# 初始化标准化器
min_max_scaler = preprocessing.MinMaxScaler()
# 分别对训练和测试数据的特征以及目标值进行标准化处理
X_train = min_max_scaler.fit_transform(X_train)
y_train = min_max_scaler.fit_transform(y_train.reshape(-1,1)) # reshape(-1,1)指将它转化为1列,行自动确定
X_test = min_max_scaler.fit_transform(X_test)
y_test = min_max_scaler.fit_transform(y_test.reshape(-1,1))

from sklearn.linear_model import LinearRegression
lr = LinearRegression()

# 使用训练数据进行参数估计
lr.fit(X_train, y_train)

六、进行预测

对数据集进行预测,输出预测值

# 使用r2_score对模型评估
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

# 绘图函数
def figure(title, *datalist):
    plt.figure(facecolor='gray', figsize=[16, 8])
    for v in datalist:
        plt.plot(v[0], '-', label=v[1], linewidth=2)
        plt.plot(v[0], 'o')
    plt.grid()
    plt.title(title, fontsize=20)
    plt.legend(fontsize=16)
    plt.show()

# 使用测试数据进行回归预测
y_test_pred = lr.predict(X_test)
print('y_test_pred : ', y_test_pred)

七、获取平均值

求取预测值和真实值的mae

#计算平均绝对误差
train_MAE = [mean_absolute_error(y_train, [np.mean(y_train)] * len(y_train)),
               mean_absolute_error(y_train, y_train_pred)]

八、获取均分绝对误差

求取预测值和真实值的mse

#计算平均绝对误差
train_MAE = [mean_absolute_error(y_train, [np.mean(y_train)] * len(y_train)),
               mean_absolute_error(y_train, y_train_pred)]

# 绘制误差图
figure(' MSE = %.4f' % (train_MSE[-1]), [train_MSE, 'MSE'])
figure(' MAE = %.4f' % (train_MAE[-1]), [train_MAE, 'MAE'])

img

img

九、获取决定系数

# 绘制预测值与真实值图
figure('预测值与真实值图 模型的' + r'$R^2=%.4f$' % (r2_score(y_train_pred, y_train)), [y_test_pred, 'pred_value'],
       [y_test, 'true_value'])

img

如上图,决定系数为0.4531

# 线性回归的系数
print('线性回归的系数为:\n w = %s \n b = %s' % (lr.coef_, lr.intercept_))

https://cdn.nlark.com/yuque/0/2023/png/35484431/1691050478961-7902fb87-cb38-44ff-a1c8-9ae69fd337e7.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值