多元线性回归案例:加州房价预测
1.多元线性回归解决了什么问题?
多元线性回归,解决了多个特征变量和目标变量之间的相关性问题,并根据结论进行预测。 在加州房价数据集的例子中,解决了平均房间数、平均收入和户主平均年龄这三个特征变量和平均房价之间的关系,并以此进行房价的预测,最后用误差分析系数,对模型的表现进行评估。
2.多元线性回归的过程:
- 导入数据分析和模型预测相关的库,加载加州房价数据集。
- 绘制热力图,查看各变量之间的相关性。
- 根据图像,确定特征变量和目标变量,有时需要对变量进行数据处理得到特征变量。
- 对特征变量进行标准化处理,消除量纲。
- 对线性回归模型进行训练和预测。
- 对模型的预测表现进行评估,用R2,MSE,RMSE这些指标。
- 绘制预测房价与真实房价的对比图,以散点图的形式。
- 也可以绘制残差分析散点图和残差分布直方图,对预测值进行进一步分析。
- 采用5折交叉验证法对R2系数进行评估。
- 最后,将得到的结果以文件的形式保存。
3.代码块解释:
导入数据分析和模型预测相关的库,加载加州房价数据集
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing #加载加州房价数据集
from sklearn.linear_model import LinearRegression #多元线性回归模型
from sklearn.preprocessing import StandardScaler #标准化处理
from sklearn.metrics import mean_squared_error,r2_score
from sklearn.model_selection import cross_val_score #交叉验证模块
#正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
#正常显示负号
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv("./cal_housing.csv")
df.head()
绘制热力图,查看各变量之间的相关性 用变量间的相关性系数作为指标,显示相关系数数值,规定热力图的色彩风格和系数显示方式。
plt.figure(figsize=(12,8))
sns.heatmap(df.corr(),annot=True,cmap='coolwarm',fmt=".2f")
plt.title("特征与房价(MedHouseVal)相关性热力图")
plt.show()
根据图像,确定特征变量和目标变量,有时需要对变量进行数据处理得到特征变量 在这里,我选择avgRooms,medianIncome和housingMedianAge作为特征变量,因为这三个特征变量的相关性最高,用medianHouseValue作为目标变量。
df['avgRooms'] = df['totalRooms']/df['households']
features = ['medianIncome','avgRooms','housingMedianAge']
X = df[features]
y = df["medianHouseValue"]
特征标准化处理,消除量纲
scaled = StandardScaler()
X_scaled = scaled.fit_transform(X)
对线性回归模型进行训练和预测
model = LinearRegression()
model.fit(X_scaled, y)
predictions = model.predict(X_scaled)
对模型的预测表现进行评估,用R2,MSE,RMSE这些指标,打印模型的斜率和截距
mse = mean_squared_error(y,predictions)
rmse = np.sqrt(mse)
r2 = r2_score(y,predictions)
print("模型系数:",model.coef_)
print("模型截距:",model.intercept_)
print("均方误差:",mse)
print("均方根误差:",rmse)
print("决定系数:",r2)
模型系数: [84115.11433906 -6718.06656196 21171.01321494]
模型截距: 206855.81690891474
均方误差: 6496608827.746702
均方根误差: 80601.54358166289
决定系数: 0.5121018839958533
可以从结果看出,决定系数R2约51%,在50%~70%之间,可以接受。
绘制预测结果与真实房价的对比图,以散点图的形式
plt.figure(figsize = (8,5))
plt.scatter(range(len(y)),y,label='实际价格',alpha=0.7)
plt.scatter(range(len(y)),predictions,label='预测价格',alpha=0.7)
plt.title('房价预测对比图')
plt.xlabel('样本编号')
plt.ylabel('价格')
plt.legend()
plt.show()
从图像看出,预测价格在真实价格之间波动
绘制残差分析散点图和残差分布直方图,对预测值进行进一步分析
residuals = y - predictions
plt.figure(figsize = (8,5))
plt.scatter(predictions,residuals,alpha=0.6)
plt.hlines(y=0,xmin = predictions.min(),xmax = predictions.max(),colors = 'red')
plt.title('残差图')
plt.xlabel('预测值')
plt.ylabel('残差')
plt.grid(True)
plt.show()
从残差图看,大部分残差点在横轴附近对称分布。
plt.figure(figsize = (8,5))
sns.histplot(residuals,kde=True,bins=30,color = 'purple')
plt.title('残差分布图')
plt.xlabel('残差值')
plt.ylabel('频率')
plt.grid(True)
plt.show()
从残差分布直方图看出,残差分布呈现正态分布形式。
采用5折交叉验证法对R2系数进行评估
cross_val_scores = cross_val_score(model,X_scaled,y,cv = 5,scoring = 'r2')
print("5折交叉验证 R2 分数:",cross_val_scores)
print("平均交叉验证得分:",cross_val_scores.mean())
5折交叉验证 R2 分数: [0.460717 0.39491883 0.48956221 0.40375787 0.54777794]
平均交叉验证得分: 0.4593467712230394
从交叉验证得分看出,0.45得分偏低,但考虑到在房价预测这种多元线性回归模型中,0.45较为常见。
将结果以文件形式保存
results_df = pd.DataFrame({
'特征名称':features,
'回归系数':model.coef_
})
summary_df = pd.DataFrame({
'项':['截距','MSE','RMSE','R2','交叉验证均值R2'],
'值':[model.intercept_,mse,rmse,r2,cross_val_scores.mean()]
})
full_results_df = pd.concat([results_df,pd.DataFrame([{}]),summary_df],ignore_index=True)
full_results_df.to_csv('regression_results.csv',index = False,encoding = 'utf-8-sig')
print('回归分析结果已保存至 regression_results.csv')
pred_df = pd.DataFrame({
'实际房价':y,
'预测房价':predictions,
'残差':residuals
})
pred_df.to_csv('predictions_residuals.csv',index = False,encoding = 'utf-8-sig')
print('预测值与残差数据已保存至 predictions_residuals.csv')
将特征名称、回归系数和一系列模型预测评估指标保存至csv文件中;将预测结果、实际房价和残差保存至另一个csv文件中。
4. 总结:
用加州房价数据集作为样本,分析了多个特征变量与目标变量之间的关系,用多元线性回归模型进行预测,并对其表现进行评估,以指标系数得分的形式,将预测结果和残差可视化分析,综合评估模型的性能,最后将结果保存至文件中。