【机器学习实战】监督学习:使用 Scikit-learn 库训练一个房价预测模型

一、引言

在机器学习领域,监督学习是一种通过已有标注数据训练模型,从而对新数据进行预测的重要方法。房价预测作为回归问题的典型应用,在房地产分析、投资决策等场景中具有重要价值。本文将基于 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 库的模块化设计让数据科学工作流更加高效,后续可根据实际数据集特点灵活调整数据处理与模型选择策略,进一步提升预测性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值