【机器学习】利用线性回归模型来预测California的房价

环境

Python编程语言

Scikit-learn库

Matplotlibseaborn(用于数据可视化)

NumPy和Pandas库(用于数据处理)

Jupyter Notebook或类似IDE(用于代码编写和结果展示)

数据集

使用 California Housing 数据集:此数据集包含加利福尼亚州的房屋数据,包括多个特征(如房间数量、人口、平均收入等)以及目标变量 MedHouseVal(房价中位数,单位为千美元)。

步骤

1. 数据加载与初步探索

使用 fetch_california_housing 函数加载 California Housing 数据集。

将数据加载为 Pandas DataFrame,并对数据的基本统计信息、分布情况等进行探索性分析。

使用 Pandas、Matplotlib 等工具对数据进行初步探索。

2. 数据集划分

使用 train_test_split 方法将数据集分为训练集和测试集(80% 用于训练,20% 用于测试)。

3. 模型训练与预测

使用 LinearRegression 创建线性回归模型,并使用训练集对模型进行训练。

利用训练好的模型对测试集进行预测,并生成预测的房价数据。

4. 模型性能评估

使用 mean_squared_error 计算均方误差(MSE),评估预测值与实际值的差异。

使用 r2_score 计算 R² 分数,评估模型的拟合优度。

5. 结果可视化

绘制测试集实际房价与预测房价的对比图,直观展示模型的预测效果。

添加参考线帮助理解模型的预测偏差。

结果展示

均方误差(MSE):展示测试集上的均方误差,以量化模型的平均预测误差。

R² 分数:展示模型的 R² 分数,表示模型解释目标变量方差的比例。

实际房价与预测房价对比图:图表展示了测试集上实际房价与预测房价的关系,以便直观理解模型的表现。

代码参考

以下是一个通过线性回归模型来预测加利福尼亚州各区域房价的代码实例:

导入必要的库

import numpy as np  # 用于科学计算的库,提供数组支持
import pandas as pd  # 用于数据处理的库
import matplotlib.pyplot as plt  # 用于绘图
import seaborn as sns  # 提供更美观的绘图样式
from sklearn.datasets import fetch_california_housing  # 加载California房价数据集
from sklearn.model_selection import train_test_split  # 数据集划分函数
from sklearn.linear_model import LinearRegression  # 线性回归模型
from sklearn.metrics import mean_squared_error, r2_score  # 评价指标:均方误差和R²分数

加载加利福尼亚房价数据集

california_housing = fetch_california_housing()

数据集介绍:

加利福尼亚房价数据集是由美国人口普查局(U.S. Census Bureau)提供的数据,它包含了1990年时加利福尼亚州的10个区域(即块)数据。这些区域的特征反映了该地区的地理和人口统计信息,如房屋的规模、收入水平等。

数据集的结构:

数据集包含了 20,640 个样本(即区域的数量),每个样本具有 8 个特征,以及 1 个目标变量(即房价中位数)。

m,n=california_housing.data.shape
print(california_housing.keys())
print(california_housing.feature_names)
print(california_housing.target)
print(california_housing.DESCR)

图片1

我们从图中可以看出该数据的列名为['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']

数据特征具体含义;

MedInc:区域内家庭收入的中位数(单位:10,000美元)。

HouseAge:房屋的中位数年龄(单位:年)。

AveRooms:每个住宅单元的平均房间数。

AveBedrms:每个住宅单元的平均卧室数。

Population:区域内的总人口数量。

AveOccup:每个住宅单元的平均住户人数。

Latitude:区域的纬度(地理坐标)。

Longitude:区域的经度(地理坐标)。

MedHouseVal:目标变量,区域内房价的中位数(单位:10,000美元),这是我们想要预测的目标。

将数据集转换为DataFrame并添加列名

df = pd.DataFrame(california_housing.data, columns=california_housing.feature_names)

图片2

将目标值转为Series对象

target = pd.Series(california_housing.target, name='MedHouseVal')
df['MedHouseVal'] = target# 合并特征和目标变量

图片3

拆分数据集

80%用于训练,20%用于测试

X = df.drop(columns='MedHouseVal')  # 特征
y = df['MedHouseVal']  # 目标值
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

图片4

创建线性回归模型

model = LinearRegression()

图片5

在训练集上训练模型

model.fit(X_train, y_train)

图片6

在测试集上进行预测

y_pred = model.predict(X_test)

图片7

评估模型性能

mse = mean_squared_error(y_test, y_pred)  # 计算均方误差
r2 = r2_score(y_test, y_pred)  # 计算R²分数
print(f"均方误差 (MSE): {mse}")
print(f"R²分数: {r2}")

图片8

可视化实际房价与预测房价的对比

# 设置Seaborn的主题
sns.set(style="whitegrid")  # 使用干净的网格背景
# 设置Matplotlib字体,解决中文显示问题(使用支持中文的字体)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体(需要确保该字体在系统中可用)
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 可视化实际房价与预测房价的对比
plt.figure(figsize=(10, 6))
# 创建一个渐变色的散点图,使用`c`参数根据预测值设定颜色
scatter = plt.scatter(y_test, y_pred, c=y_pred, cmap='viridis', alpha=0.7, edgecolors='w', s=50, label='预测房价')
# 设置x轴标签
plt.xlabel('实际房价(中位数)')
# 设置y轴标签
plt.ylabel('预测房价(中位数)')
# 设置图表标题
plt.title('实际房价 vs 预测房价')
# 添加参考线,用于显示理想预测效果的对比
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], color='red', lw=2, label='理想预测线')
# 显示图例
plt.legend()
# 显示网格
plt.grid(True)
# 添加颜色条以显示颜色映射
plt.colorbar(scatter, label='预测房价(颜色渐变)')
# 显示图表
plt.show()

图片9

### 使用深度学习和线性回归模型实现加州房价预测 #### 3.1 准备环境与加载数据 为了使用Python中的`scikit-learn`库来进行线性回归分析以及利用`PyTorch`框架实施基于深度学习的方法,首先需要安装并导入必要的软件包。对于本案例而言,重点在于获取并预处理加州住房数据集。 ```python import numpy as np from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error import torch from torch.utils.data import TensorDataset, DataLoader import torch.nn as nn ``` 接着,加载加州房价数据集,并将其划分为训练集和测试集: ```python data = fetch_california_housing() X = data['data'] y = data['target'] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` #### 3.2 构建线性回归模型 通过调用`LinearRegression()`函数创建一个简单的线性回归模型实例,并对其进行拟合操作以适应给定的训练样本[^1]。 ```python linear_reg = LinearRegression().fit(X_train, y_train) # 对测试集做出预测 predictions_lr = linear_reg.predict(X_test) print(f'线性回归均方误差: {mean_squared_error(y_test, predictions_lr)}') ``` #### 3.3 实现基于PyTorch的简单神经网络 定义一个多层感知器结构用于执行相同的任务—即预测房屋的价格。这里采用两层全连接层的设计方案;同时考虑到输入特征的数量较多(共有8个),适当调整隐藏单元数可以提高性能表现。 ```python class MLP(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(8, 64) self.relu = nn.ReLU() self.fc2 = nn.Linear(64, 1) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out.flatten() device = "cuda" if torch.cuda.is_available() else "cpu" model = MLP().to(device=device) criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.01) dataset = TensorDataset(torch.tensor(X_train).float(), torch.tensor(y_train).float()) dataloader = DataLoader(dataset, batch_size=32, shuffle=True) for epoch in range(50): # 训练周期次数可以根据实际情况设定 for i, (inputs, labels) in enumerate(dataloader): inputs, labels = inputs.to(device), labels.to(device) outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() with torch.no_grad(): predicted_values_dl = model(torch.tensor(X_test).float().to(device)).cpu().numpy() print(f'Deep Learning MSE Loss on Test Set: {mean_squared_error(y_test, predicted_values_dl)}') ``` 上述代码展示了两种不同方法的应用过程:传统机器学习技术下的线性回归模型以及现代深度学习领域内的多层感知机架构。两者都旨在解决同样的问题——根据历史记录估计未来可能发生的事件或趋势,在这里是针对房地产市场的价值评估[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值