第75课 实战:房价预测项目概览与数据探索
学习目标
完成本课学习后,你将能够:
- 理解一个完整的机器学习项目(以房价预测为例)从数据到模型的完整流程。
- 掌握使用Pandas进行数据加载、初步检查和基本统计分析的方法。
- 实践针对单一变量和多个变量的数据探索与可视化分析技术。
- 评估不同特征(房屋属性)与目标变量(房价)之间的潜在关系。
- 识别数据集中可能存在的缺失值、异常值等数据质量问题。
核心概念
欢迎来到实战项目模块!在接下来的几节课中,我们将一步步完成一个经典的机器学习项目——波士顿房价预测。这是一个回归问题,我们的目标是利用房屋的各种特征(如房间数、犯罪率、地理位置等)来预测其价格。
为什么要做数据探索(Exploratory Data Analysis, EDA)? 在建造房屋前,你需要先了解土地的情况。同样,在构建模型前,你必须深入了解你的数据。数据探索是项目成功的基础,它帮助我们:
- 理解数据的基本结构和质量。
- 发现特征之间的隐藏模式和关联。
- 为后续的特征工程和模型选择提供依据。
- 找出可能影响模型性能的数据问题。
数据探索的通用步骤:
- 数据加载与概览:读取数据,查看其形状、列名和数据类型。
- 单变量分析:研究单个特征(变量)的分布情况。
- 多变量分析:研究特征之间,以及特征与目标变量之间的关系。
- 数据质量检查:查找并处理缺失值、异常值和错误数据。
代码示例
下面,我们将使用Python的pandas、seaborn和matplotlib库,对波士顿房价数据集进行探索性分析。
# 导入必要的库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 设置绘图风格和显示中文(如果需要)
sns.set(style="whitegrid")
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 1. 加载数据
# 波士顿房价数据集是scikit-learn中的经典数据集。我们先从sklearn加载,然后转换为DataFrame以便分析。
from sklearn.datasets import load_boston
boston = load_boston()
# 创建DataFrame
df = pd.DataFrame(boston.data, columns=boston.feature_names)
# 添加目标变量(房价中位数,单位:千美元)
df['PRICE'] = boston.target
# 2. 数据初步检查
print("="*50)
print("数据集基本信息:")
print("="*50)
print(f"数据集形状 (行, 列): {df.shape}")
print("\n前5行数据:")
print(df.head())
print("\n数据类型和非空值信息:")
print(df.info())
# 3. 描述性统计
print("\n"+"="*50)
print("数值型特征的描述性统计 (均值、标准差、分位数等):")
print("="*50)
print(df.describe())
# 4. 目标变量(房价)分析
print("\n"+"="*50)
print("目标变量 PRICE 的分布:")
print("="*50)
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
sns.histplot(df['PRICE'], kde=True)
plt.title('房价分布直方图')
plt.xlabel('房价 (千美元)')
plt.ylabel('频数')
plt.subplot(1, 2, 2)
sns.boxplot(y=df['PRICE'])
plt.title('房价箱线图')
plt.ylabel('房价 (千美元)')
plt.tight_layout()
plt.show()
# 5. 特征相关性分析
print("\n"+"="*50)
print("特征与目标变量 PRICE 的相关系数 (降序):")
print("="*50)
correlations = df.corr()['PRICE'].sort_values(ascending=False)
print(correlations)
# 6. 可视化相关性热力图
plt.figure(figsize=(12, 10))
sns.heatmap(df.corr(), annot=True, fmt='.2f', cmap='coolwarm', center=0)
plt.title('特征相关性热力图')
plt.show()
# 7. 探索重要特征与房价的关系
# 根据相关系数,我们选择几个相关的特征进行可视化
important_features = ['RM', 'LSTAT', 'PTRATIO', 'INDUS']
plt.figure(figsize=(12, 8))
for i, feature in enumerate(important_features, 1):
plt.subplot(2, 2, i)
sns.scatterplot(x=df[feature], y=df['PRICE'], alpha=0.6)
plt.title(f'{feature} 与 房价 的关系')
plt.xlabel(feature)
plt.ylabel('房价')
plt.tight_layout()
plt.show()
# 8. 数据质量检查:缺失值
print("\n"+"="*50)
print("缺失值检查:")
print("="*50)
missing_values = df.isnull().sum()
print(missing_values[missing_values > 0])
if missing_values.sum() == 0:
print("恭喜!该数据集没有缺失值。")
# 9. 数据质量检查:异常值示例(以RM为例)
plt.figure(figsize=(8, 6))
sns.boxplot(y=df['RM'])
plt.title('房间数(RM)箱线图 (用于识别异常值)')
plt.ylabel('房间数')
plt.show()
实践练习
练习1:特征深度探索
基于上面的代码,选择两个你感兴趣的特征(例如AGE和DIS),分别完成:
a) 绘制它们与PRICE的散点图。
b) 计算它们与PRICE的皮尔逊相关系数。
c) 根据图形和数值,简要分析这两个特征与房价可能的关系。
练习2:分类特征分析 波士顿数据集主要是数值特征。想象一下,如果我们的数据集中有一个“房屋风格”(如:Colonial, Victorian, Ranch)这样的分类特征,我们应该如何探索它与房价的关系?请用文字描述你的分析思路和可能使用的可视化方法。
练习3:寻找数据问题
仔细观察练习1中你绘制的散点图或AGE/DIS特征的箱线图,看能否发现一些异常的数据点(例如,明显偏离主体分布的点)。尝试使用pandas或numpy的方法,将这些异常点找出来并报告其数量。
常见错误
- 跳过数据探索直接建模:急于训练模型,忽略了对数据分布、异常值和缺失值的检查,导致模型效果差且难以调试。
- 混淆相关性与因果性:看到两个变量高度相关就断定一个导致了另一个。例如,
LSTAT(低收入人口比例)与房价负相关,但这可能只是相关关系,直接改变低收入比例并不会改变房价。 - 忽略数据的尺度问题:不同特征的数值范围差异巨大(如
TAX税收 vsCHAS查尔斯河哑变量),在后续建模前可能需要进行标准化/归一化。 - 盲目使用所有特征:并非所有特征都对预测有帮助,有些可能是噪音。数据探索的目的之一就是进行初步的特征筛选。
- 可视化过度或不足:画了太多杂乱无章的图,或者只看了一个平均数统计量,遗漏了关键信息。
小结
本节课我们迈出了实战项目的第一步:
- 项目背景:理解了房价预测作为一个回归任务的基本流程。
- 数据加载:学习了如何使用
pandas加载和查看数据结构。 - 核心EDA技能:实践了单变量分布分析(直方图、箱线图)和多变量关系分析(相关系数、热力图、散点图)。
- 质量把控:掌握了检查缺失值和通过可视化发现异常值的方法。
关键要点:良好的数据探索能为后续工作打下坚实基础,避免在错误的方向上浪费精力。在下一节课中,我们将基于今天发现的数据特点和问题,进行特征工程,并开始构建我们的第一个房价预测模型!