学习记录:机器学习入门案例——波士顿房价预测(二)-房价预测

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模型训练完成!")

运行成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值