2026年4月3日
间隔好久了,快一年了,竟然!继续,开始逐步完善预测房价的功能了。
1、打开运行py文件
在VScode中打开BostonHoursePrice.py,运行一下,出错了,提示要打开文件夹,冲洗打开所在文件夹D:\MyAI\BostonHoursePrice。运行还是失败,原来我点错了运行按钮(窗口左边竖着那排按钮里的一个三角形),要点py文件窗口上面那个三角图标按钮,运行成功,输出了数据集的列名等信息。

2、完善py文件,实现房价预测
参照之前成功运行的加州房价程序,完善代码如下:
import numpy as np
import pandas as pd
import random
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 数据文件路径
data_path = 'D:/MYAI/BostonHoursePrice/archive/HousingData.csv'
# 使用 Pandas 的 read_csv 方法读取数据
df = pd.read_csv(data_path)
# 打印数据的基本信息
print("数据形状 (行, 列):", df.shape)
print("\n数据预览 (前5行):")
print(df.head())
print("\n数据列名:")
print(df.columns.tolist())
# 检查缺失值
print("\n检查缺失值:")
print(df.isnull().sum())
# 处理缺失值(使用每列的中位数填充)
print("\n处理缺失值(使用中位数填充)...")
for column in df.columns:
if df[column].isnull().any():
median_value = df[column].median()
df[column].fillna(median_value, inplace=True)
print(f" 列 '{column}' 已用中位数 {median_value:.2f} 填充")
print("\n缺失值处理完成,再次检查:")
print(df.isnull().sum())
# 查看数据统计信息
print("\n查看数据统计信息:")
print(df.describe())
# 绘制房价分布图(目标变量通常是 MEDV)
# 波士顿数据集中,目标变量是 MEDV(自有住房的中位数报价,以千美元为单位)
target_column = 'MEDV' if 'MEDV' in df.columns else df.columns[-1]
print(f"\n目标变量列: {target_column}")
print("\n绘制房价分布图")
sns.histplot(df[target_column], kde=True, bins=20)
plt.title("Price Distribution (MEDV)") # 房价分布 标题
plt.xlabel("Price (in $1000s)") # 房价(千美元) x坐标
plt.ylabel("Frequency") # 频数 y坐标
plt.show()
print("\n绘制特征相关性热力图")
plt.figure(figsize=(12, 10))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)
plt.title("Feature Correlation Heatmap") # 特征相关性热力图
plt.show()
# 特征标准化
print("\n特征标准化")
# 分离特征和目标变量
features = df.drop(target_column, axis=1)
target = df[target_column]
# 标准化特征
scaler = StandardScaler()
features_scaled = scaler.fit_transform(features)
print(f"特征形状: {features_scaled.shape}")
print(f"目标形状: {target.shape}")
# 划分训练集和测试集
print("\n划分训练集和测试集")
X_train, X_test, y_train, y_test = train_test_split(
features_scaled, target, test_size=0.2, random_state=42
)
print(f"训练集大小: {X_train.shape[0]} 样本")
print(f"测试集大小: {X_test.shape[0]} 样本")
# 初始化并训练线性回归模型
print("\n初始化线性回归模型")
model = LinearRegression()
print("训练模型...")
model.fit(X_train, y_train)
# 预测
print("进行预测...")
y_pred = model.predict(X_test)
print("\n输出预测结果(前10个):")
print(y_pred[:10])
# 评估性能
SSE = sum((y_test - y_pred) ** 2)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"\n模型评估指标:")
print(f'SSE (误差平方和): {SSE:.2f}')
print(f'MSE (均方误差): {mse:.2f}')
print(f'RMSE (均方根误差): {np.sqrt(mse):.2f}')
print(f'R2 分数: {r2:.4f}')
# 获取模型参数
print("\n模型参数:")
feature_names = features.columns.tolist()
for i, (name, coef) in enumerate(zip(feature_names, model.coef_)):
print(f"{name} - 系数 {i}: {coef:.4f}")
intercept = model.intercept_
print(f"截距 (intercept): {intercept:.4f}")
# 构建回归方程字符串
equation = f"回归方程式: y = {intercept:.4f}"
for name, coef in zip(feature_names, model.coef_):
equation += f" + ({coef:.4f} * {name})"
print(f"\n{equation}")
# 可视化实际房价与预测房价的对比
print("\n绘制实际房价 vs 预测房价对比图")
# 设置Seaborn的主题
sns.set(style="whitegrid")
# 设置Matplotlib字体,解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10, 6))
# 创建散点图
scatter = plt.scatter(y_test, y_pred, c=y_pred, cmap='viridis', alpha=0.7, edgecolors='w', s=50)
# 设置标签
plt.xlabel('实际房价(千美元)')
plt.ylabel('预测房价(千美元)')
plt.title('波士顿房价:实际值 vs 预测值')
# 添加理想预测参考线
min_val = min(y_test.min(), y_pred.min())
max_val = max(y_test.max(), y_pred.max())
plt.plot([min_val, max_val], [min_val, max_val], color='red', lw=2, label='理想预测线')
# 显示图例
plt.legend()
plt.grid(True, alpha=0.3)
# 添加颜色条
plt.colorbar(scatter, label='预测房价(千美元)')
plt.show()
# 绘制残差图
print("\n绘制残差图")
plt.figure(figsize=(10, 6))
residuals = y_test - y_pred
plt.scatter(y_pred, residuals, alpha=0.7, edgecolors='w', s=50)
plt.axhline(y=0, color='red', linestyle='--', linewidth=2)
plt.xlabel('预测房价(千美元)')
plt.ylabel('残差(实际值 - 预测值)')
plt.title('残差分布图')
plt.grid(True, alpha=0.3)
plt.show()
# 输出特征重要性排序(基于系数绝对值)
print("\n特征重要性排序(基于系数绝对值):")
feature_importance = sorted(
zip(feature_names, model.coef_),
key=lambda x: abs(x[1]),
reverse=True
)
for name, coef in feature_importance:
print(f" {name}: {coef:.4f}")
print("\n模型训练完成!")
运行成功!
-房价预测&spm=1001.2101.3001.5002&articleId=159795434&d=1&t=3&u=13a07841d63c40a6914e0e62c851acc3)
1万+

被折叠的 条评论
为什么被折叠?



