python建立一元、多元线性回归模型,实现房价预测

文章目录

  • 1. 一元回归——通过面积预测房价
  • 2. 建立多元回归模型——波士顿房价预测
    • 数据集
    • 使用的第三方库
    • 读取并处理数据
    • 查看数据
    • 查看数据分散情况——绘制箱形图
    • 数据集分割
    • 建立多元回归模型
    • 测试
      • 画图表示结果

1. 一元回归——通过面积预测房价

  • 数据集:csv格式
No,square_feet,price
1,150,6450
2,200,7450
3,250,8450
4,300,9450
5,350,11450
6,400,15450
7,500,18450
  • 从csv文件中读取数据
import pandas as pd
data = pd.read_csv('data/房价.csv')
  • 建立线性回归模型
from sklearn.linear_model import LinearRegression

model = LinearRegression()
x = data['square_feet'].values.reshape(-1, 1)
y = data['price']
model.fit(x, y)
  • 预测面积为 1000 平方英尺的房子价格
print(model.predict([[1000]]))
  • 画图
import matplotlib.pyplot as plt
plt.scatter(data['square_feet'], y, color='blue')
plt.plot(x, model.predict(x), 'r-')
plt.grid(True)
plt.show()

2. 建立多元回归模型——波士顿房价预测

数据集

下载链接

属性 含义 属性 含义
CRIM 城镇人均犯罪率 ZN 住宅用地超过 25000 sq.ft. 的比例。
INDUS 城镇非零售商用土地的比例 CHAS 查理斯河空变量(如果边界是河流,则为1;否则为0)
NOX 一氧化氮浓度 RM 住宅平均房间数
DIS 到波士顿五个中心区域的加权距离 RAD 辐射性公路的接近指数
TAX 每 10000 美元的全值财产税率 PTRATIO 城镇师生比例
B 1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例 LSTAT 人口中地位低下者的比例。
MEDV 自住房的平均房价,以千美元计

使用的第三方库

import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

读取并处理数据

  • 读取数据
data = pd.read_csv('data/housing.csv')
  • 不考虑城镇人均犯罪率,模型评分较高
    iloc用法
# 不要第一列的数据
new_data = data.iloc[:, 1:]

查看数据

  • 查看处理后的数据集
# 得到数据集且查看
print('head:', new_data.head(), '\nShape:', new_data.shape)
  • 检查是否存在缺失值
# 缺失值检验
print(new_data.isnull().sum())

查看数据分散情况——绘制箱形图

  • 输出行数count平均值mean标准差std最小值min最大值max上四分位数75%, 中位数50%下四分位数25%
print(new_data.describe())
  • 箱形图(Box-plot)是一种用作显示一组数据分散情况资料的统计图。

  • 箱线图的绘制方法是:先找出一组数据的上边缘、下边缘、中位数和两个四分位数;然后, 连接两个四分位数画出箱体;再将上边缘和下边缘与箱体相连接,中位数在箱体中间。

  • 箱型图绘制代码

new_data.boxplot()
plt.show()

数据集分割

将原始数据按照2:8比例分割为“测试集”和“训练集”

X_train, X_test, Y_train, Y_test = train_test_split(new_data.iloc[:, :13], new_data.MEDV, train_size=.80)

建立多元回归模型

根据训练集建立模型

model = LinearRegression()
model.fit(X_train, Y_train)
a = model.intercept_
b = model.coef_
print("最佳拟合线:截距", a, ",回归系数:", b)

score = model.score(X_test, Y_test)
print(score)
最佳拟合线:截距 0.0 ,回归系数: [-1.74325842e-16  1.11629233e-16 -1.79794258e-15  7.04652389e-15
 -2.92277767e-15  2.97853711e-17 -8.23334194e-16  1.17159575e-16
  1.88696229e-17 -3.41643920e-16 -1.28401929e-17 -5.78208730e-17
  1.00000000e+00]
1.0

测试

Y_pred = model.predict(X_test)
print(Y_pred)
plt.plot(range(len(Y_pred)), Y_pred, 'b', label="predict")
plt.show()

画图表示结果

X_train, X_test, Y_train, Y_test = train_test_split(new_data.iloc[:, :13], new_data.MEDV, train_size=.80)

plt.figure()
plt.plot(range(len(Y_pred)), Y_pred, 'b', label="predict")
plt.plot(range(len(X_test)), Y_test, 'r', label="test")
plt.legend(loc="upper right")
plt.xlabel("the number of MEDV")
plt.ylabel('value of MEDV')
plt.show()

在这里插入图片描述

你可能感兴趣的:(数据挖掘,python,数据挖掘,数据分析)