手把手教你用Python机器学习预测房价,完成你的第一个机器学习项目!
这篇博文将作为上一篇的理论知识的实践篇,带领读者一步步完成第一个机器学习项目。
动手实战:用Python预测房价,完成你的第一个机器学习项目!
在上一篇文章《一篇文章帮你入门机器学习》中,我们了解了机器学习的基本概念和流程。今天,我们将告别理论,亲手用代码搭建一个机器学习模型,解决一个经典问题:预测房价。
通过这个项目,你将完整地走一遍数据探索、清洗、建模、评估的全过程,并深刻理解“理论”是如何落地为“代码”的。我将会在附件中提供完整的代码,大家也可以按照步骤一步一步的复制我在正文中列出的代码。
项目准备:我们的工具箱
我们将使用Python生态中强大的数据科学库:
-
Pandas:用于数据处理和分析。
-
NumPy:提供高效的数学运算。
-
Matplotlib / Seaborn:用于数据可视化,让我们能“看见”数据。
-
Scikit-learn:机器学习核心库,提供了丰富的算法和工具。
确保你的环境已安装这些库:
pip install pandas numpy matplotlib seaborn scikit-learn
第一步:理解问题与加载数据
问题定义:我们拥有一个房屋数据集,包含各种特征(如面积、卧室数量、地理位置等)和对应的售价(标签)。我们的目标是训练一个模型,学习这些特征与售价之间的关系,从而预测新房屋的价格。
我们将使用Scikit-learn自带的波士顿房价数据集(一个经典的入门数据集)。
# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 加载数据集
from sklearn.datasets import fetch_california_housing
data = fetch_california_housing()
# 将数据转换为易于操作的Pandas DataFrame
df = pd.DataFrame(data.data, columns=data.feature_names)
# 将目标变量(房价)也添加到DataFrame中
df['PRICE'] = data.target
# 让我们先看一眼数据
print("数据形状:", df.shape) # 查看数据有多少行、多少列
df.head() # 显示前5行数据
输出解读:
你会看到数据有多个特征,比如 MedInc(居民收入中位数)、HouseAge(房龄)、AveRooms(平均房间数)等,以及我们的目标 PRICE。
第二步:探索性数据分析(EDA)
在训练模型前,我们必须先了解数据。
# 1. 查看基本统计信息
print(df.describe())
# 2. 检查缺失值
print(df.isnull().sum())
# 3. 可视化目标变量分布
plt.figure(figsize=(10, 6))
sns.histplot(df['PRICE'], bins=30, kde=True)
plt.title('house price distribution')
plt.xlabel('price')
plt.ylabel('num')
plt.show()
此处输出图形示例:

观察:房价分布大致是怎样的?是正态分布还是有所偏斜?
# 4. 分析特征与目标的关系
plt.figure(figsize=(10, 6))
# 这里以“居民收入中位数”为例
sns.scatterplot(x=df['MedInc'], y=df['PRICE'])
plt.title('Median Resident Income vs Housing Prices')
plt.xlabel('Median Resident Income')
plt.ylabel('Housing Prices')
plt.show()
此处输出图形示例:

观察:这个特征与房价有明显的相关性吗?
# 5. 计算所有特征之间的相关性热力图
plt.figure(figsize=(12, 10))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('heatmap')
plt.show()
此处输出图形示例:

观察:哪些特征与房价(PRICE)的相关性最强?特征之间是否存在高度相关性(共线性)?
第三步:数据预处理
我们的数据看起来很干净(因为来自sklearn),但在真实项目中,这一步通常包括处理缺失值、异常值、编码分类变量等。这里我们主要做特征工程和数据分割。
# 训练前的准备,选择特征,划分训练集与测试集
# 1. 选择特征 (这里我们选择与房价相关性最高的几个特征)
# 根据热力图,我们选择 'MedInc', 'AveRooms', 'HouseAge' 等
features = ['MedInc', 'AveRooms', 'HouseAge', 'Latitude', 'Longitude']
X = df[features] # 特征矩阵
y = df['PRICE'] # 目标向量
# 2. 分割数据集为训练集和测试集
# test_size=0.2 表示20%的数据作为测试集,random_state是为了保证每次分割结果一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f"训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")
第四步:选择模型并训练
我们从最简单的线性回归模型开始。
# 建立模型
# 1. 创建模型实例
model = LinearRegression()
# 2. 在训练集上训练模型 (核心步骤!)
model.fit(X_train, y_train)
# 3. 查看模型学到的系数(权重)
print("模型截距:", model.intercept_)
print("模型系数:")
for feature, coef in zip(features, model.coef_):
print(f" {feature}: {coef:.4f}")
解读:系数告诉我们,当其他特征不变时,某个特征每增加一个单位,房价平均会变化多少。例如,MedInc的系数为正且较大,说明收入越高的地区,房价也越高。
第五步:模型评估与预测
现在,是时候检验我们的模型了。
# 进行预测
# 1. 在测试集上进行预测
y_pred = model.predict(X_test)
# 2. 评估预测效果
# 均方误差 (MSE) - 越小越好
mse = mean_squared_error(y_test, y_pred)
# 决定系数 (R²) - 越接近1越好,表示模型解释了大部分数据方差
r2 = r2_score(y_test, y_pred)
print(f"均方误差 mse: {mse:.2f}")
print(f"决定系数 R²: {r2:.4f}")
结果分析:
-
MSE:表示预测值与真实值之间的平均平方差。数值本身的大小需要结合房价的原始范围来看。
-
R²:例如0.6,意味着我们的模型能够解释目标变量(房价)60%的方差。对于第一个简单模型来说,这算是一个不错的开始!
将运行结果可视化(更加直观的了解模型的预测结果)
#1:散点图
# 3. 可视化预测结果 vs 真实结果 散点图
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5) # 画散点图
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2) # 画一条理想的对角线
plt.xlabel('real')
plt.ylabel('predict')
plt.title('real vs predict')
plt.show()
可视化结果:

观察:点是否紧密地分布在对角线附近?如果点分散得很开,说明模型预测不准;反之若点分散的较近,说明模型预测的很准。对于简单的线性回归来说,散点图达到这样的效果,算是一个不错的开始。
#2:折线图
# 4. 可视化预测结果 vs 真实结果 样本对比折线图
plt.figure(figsize=(15, 8))
# 选择部分样本进行可视化(避免过于密集)
n_samples = min(100, len(y_test)) # 最多显示100个样本
indices = np.arange(n_samples)
# 获取对应的真实值和预测值
y_test_subset = y_test.values[:n_samples] if hasattr(y_test, 'values') else y_test[:n_samples]
y_pred_subset = y_pred[:n_samples]
# 绘制折线图
plt.plot(indices, y_test_subset, 'b-o', linewidth=2, markersize=4, label='Real Values', alpha=0.8)
plt.plot(indices, y_pred_subset, 'r-s', linewidth=2, markersize=4, label='Predicted Values', alpha=0.8)
plt.xlabel('Sample Index')
plt.ylabel('House Price')
plt.title('Comparison: Real vs Predicted Values')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
可视化结果:

观察:两条曲线是否重合,如果重合度越高,说明模型的预测效果越好(与此同时,上方的决定系数R² 也会越接近于1,均方误差MSE也会越小)。
总结与下一步
恭喜你!你已经成功完成了你的第一个机器学习项目。让我们简单做一下总结:
-
✅ 加载并探索了真实世界的数据集。
-
✅ 通过可视化理解了数据分布和关系。
-
✅ 完成了数据预处理和分割。
-
✅ 训练了一个线性回归模型。
-
✅ 评估了模型性能并解读了结果。
这只是一个开始。机器学习的魅力在于无尽的迭代和优化。大家可以尝试采用更加高级和复杂的模型来进行房价的预测,我也会在以后的博文中为大家带来各种不同的算法。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)