文章目录
- 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')
- 不考虑城镇人均犯罪率,模型评分较高
# 不要第一列的数据
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()