一、引言
在机器学习领域,监督学习是一种通过已有标注数据训练模型,从而对新数据进行预测的重要方法。房价预测作为回归问题的典型应用,在房地产分析、投资决策等场景中具有重要价值。本文将基于 Scikit-learn 库,完整演示从数据准备到模型评估的全流程,带领读者掌握房价预测模型的构建方法。
二、数据准备:从 Kaggle 获取数据集
本文使用 Kaggle 上的经典波士顿房价数据集(Boston Housing Dataset),该数据集包含 506 条样本,13 个特征变量,目标变量为房价中位数(单位:千美元)。首先通过 Pandas 完成数据加载与初步探索:
1. 数据加载
import pandas as pd
from sklearn.datasets import load_boston
# 加载数据集(本地文件或远程加载)
# data = pd.read_csv("housing.csv") # 实际使用时从Kaggle下载后加载
data = load_boston()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['MEDV'] = data.target # 添加目标变量
2. 数据初探
print("数据集基本信息:")
print(df.info())
print("\n前5条数据:")
print(df.head())
print("\n统计描述:")
print(df.describe())
三、数据清洗:处理缺失值与异常值
1. 缺失值处理
通过 isnull().sum() 检查缺失值,波士顿数据集无缺失值,若实际数据集存在缺失值,可采用以下方法:
- 缺失率高(>70%)的特征直接删除:
df.drop(columns=['feature_name'], inplace=True)
- 数值型特征用均值 / 中位数填充:
df['feature'] = df['feature'].fillna(df['feature'].mean())
- 类别型特征用众数填充:
df['feature'] = df['feature'].fillna(df['feature'].mode()[0])
2. 异常值检测(以 Z-score 法为例)
from scipy import stats
import numpy as np
# 计算Z-score
z_scores = np.abs(stats.zscore(df.select_dtypes(include=[np.number])))
# 删除Z-score>3的异常样本
df = df[(z_scores < 3).all(axis=1)]
四、特征工程:筛选与创建有效特征
1. 相关性分析筛选特征
通过计算特征与目标变量的相关系数,保留相关性 > 0.3 的特征:
import seaborn as sns
import matplotlib.pyplot as plt
corr_matrix = df.corr()
target_corr = corr_matrix['MEDV'].sort_values(ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x=target_corr.values, y=target_corr.index)
plt.title("特征与房价相关性分析")
plt.show()
# 选择相关系数>0.3的特征
selected_features = target_corr[target_corr.abs() > 0.3].index.tolist()
selected_features.remove('MEDV') # 移除目标变量
X = df[selected_features]
y = df['MEDV']
2. 创建新特征(示例:组合特征)
若数据集包含更多特征,可通过特征组合提升模型表现力:
# 假设存在'RM'(房间数)和'AGE'(房龄)特征
# df['RM_AGE'] = df['RM'] * df['AGE']
五、模型构建:线性回归模型实现
1. 数据集划分
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
2. 模型初始化与训练
使用随机梯度下降回归器(SGDRegressor)演示超参数调整(学习率、迭代次数):
from sklearn.linear_model import SGDRegressor
sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, random_state=42)
sgd_reg.fit(X_train, y_train)
六、超参数调整:网格搜索优化
通过 GridSearchCV 寻找最优超参数组合:
from sklearn.model_selection import GridSearchCV
param_grid = {
'learning_rate': ['constant', 'optimal', 'invscaling', 'adaptive'],
'eta0': [0.001, 0.01, 0.1], # 初始学习率
'max_iter': [500, 1000, 1500]
}
grid_search = GridSearchCV(sgd_reg, param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
# 最佳模型
best_sgd_reg = grid_search.best_estimator_
七、模型评估:性能指标与可视化
1. 定量指标计算
from sklearn.metrics import mean_squared_error, r2_score
# 训练集预测
y_train_pred = best_sgd_reg.predict(X_train)
# 测试集预测
y_test_pred = best_sgd_reg.predict(X_test)
# 均方误差(MSE)
train_mse = mean_squared_error(y_train, y_train_pred)
test_mse = mean_squared_error(y_test, y_test_pred)
# R平方值
train_r2 = r2_score(y_train, y_train_pred)
test_r2 = r2_score(y_test, y_test_pred)
print(f"训练集MSE: {train_mse:.2f}, R²: {train_r2:.2f}")
print(f"测试集MSE: {test_mse:.2f}, R²: {test_r2:.2f}")
2. 预测结果可视化
plt.figure(figsize=(12, 6))
plt.scatter(y_test, y_test_pred, alpha=0.6, color='blue')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r-', linewidth=2)
plt.xlabel("真实房价(千美元)")
plt.ylabel("预测房价(千美元)")
plt.title("预测值与真实值对比图")
plt.show()
八、结论与优化方向
1. 模型表现分析
本次实验构建的线性回归模型在测试集上取得了较好的拟合效果,R² 值达到 XX(根据实际运行结果填写),表明模型能够解释 XX% 的房价变化。但 MSE 仍有优化空间,可尝试以下方法:
2. 改进方向
- 非线性模型:尝试决策树回归、随机森林、梯度提升等算法
- 特征工程深化:进行多项式特征转换、特征选择优化
- 正则化处理:添加 L1/L2 正则化防止过拟合(如 Ridge/Lasso 回归)
- 数据增强:若数据量较小,可使用 SMOTE 等方法生成合成样本
通过本次实战,我们掌握了监督学习在房价预测中的完整应用流程。Scikit-learn 库的模块化设计让数据科学工作流更加高效,后续可根据实际数据集特点灵活调整数据处理与模型选择策略,进一步提升预测性能。