房价预测 - MACHINE-LEARNING教程

机器学习 - 房价预测

买房时,人通常会综合判断:地段、面积、房龄、房间数量、人口密度、交通条件等,每一个因素都在影响价格,但这种影响并不是线性的、单一的,而是叠加、权衡、博弈后的结果。

机器学习中的 回归问题 ,本质就是把这种「经验判断」变成一个可计算、可复用、可评估的数学模型。

本章节将从零开始,完整走一遍 房价预测 的标准机器学习流程:数据理解 → 特征分析 → 模型训练 → 模型评估 → 模型优化。目标不是记 API,而是理解每一步在做什么、为什么要做。


第一部分:项目准备与环境搭建

1.1 使用到的核心工具

  • NumPy :底层数值计算工具,提供高效数组运算。
  • Pandas :表格型数据分析核心工具,机器学习前期必备。
  • Matplotlib / Seaborn :数据可视化,用于理解数据分布与关系。
  • Scikit-learn :机器学习工具箱,涵盖数据集、模型、评估方法。

1.2 安装依赖

pip install numpy pandas matplotlib seaborn scikit-learn

第二部分:加载并理解数据集

早期教程常使用 Boston Housing 数据集,但该数据集已被弃用。这里使用官方推荐的 California Housing 数据集,概念一致,数据更规范。

示例代码
importpandasaspdfromsklearn.datasetsimportfetch_california_housing# 加载加州房价数据集data=fetch_california_housing()# 特征数据(X)df_features=pd.DataFrame(data.data,columns=data.feature_names)# 目标变量(y):房价中位数df_target=pd.DataFrame(data.target,columns=['MedHouseVal'])print(df_features.head())print(df_target.head())

输出:


   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  Longitude

0  8.3252      41.0  6.984127   1.023810       322.0  2.555556     37.88    -122.23

1  8.3014      21.0  6.238137   0.971880      2401.0  2.109842     37.86    -122.22

2  7.2574      52.0  8.288136   1.073446       496.0  2.802260     37.85    -122.24

3  5.6431      52.0  5.817352   1.073059       558.0  2.547945     37.85    -122.25

4  3.8462      52.0  6.281853   1.081081       565.0  2.181467     37.85    -122.25

   MedHouseVal

0        4.526

1        3.585

2        3.521

3        3.413

4        3.422

此时你应该明确三点:

  • 每一行是一套房子的统计特征
  • 每一列是一个可用于预测的变量
  • MedHouseVal 是我们要预测的目标

第三部分:探索性数据分析(EDA)

在训练模型之前,必须先回答一个问题: 数据值不值得学?

3.1 数据结构与缺失值检查

示例代码
print("特征维度:",df_features.shape)print("目标维度:",df_target.shape)print("\n数据类型与缺失情况:")df_features.info()print("\n缺失值统计:")print(df_features.isnull().sum())

结论:

  • 样本量充足(2 万条左右)
  • 全部为数值型特征
  • 无缺失值,可直接建模

3.2 单一特征与房价的关系

机器学习不是黑盒,至少在入门阶段,你应该知道模型在学什么。

示例代码
importmatplotlib.pyplotaspltplt.figure(figsize=(8,6))plt.scatter(df_features['AveRooms'],df_target['MedHouseVal'],alpha=0.4)plt.xlabel('Average Rooms')plt.ylabel('Median House Value')plt.title('Rooms vs House Price')plt.grid(True)plt.show()

直观结论:房间数越多,房价整体越高,但存在明显离散。这正是回归模型存在的意义。

3.3 特征相关性分析

示例代码
importseabornassnsdf_all=pd.concat([df_features,df_target],axis=1)corr=df_all.corr()plt.figure(figsize=(10,8))sns.heatmap(corr,cmap='coolwarm',center=0)plt.title('Feature Correlation Heatmap')plt.show()

这一步的目的不是"选模型",而是确认:确实存在可学习的统计关系。


第四部分:构建第一个回归模型

4.1 划分训练集与测试集

模型不能用同一批数据既学习又考试,否则评估结果毫无意义。

示例代码
fromsklearn.model_selectionimporttrain_test_splitX=df_featuresy=df_target['MedHouseVal']X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)print("训练集:",X_train.shape)print("测试集:",X_test.shape)

4.2 训练线性回归模型

示例代码
fromsklearn.linear_modelimportLinearRegressionmodel=LinearRegression()model.fit(X_train,y_train)print("截距:",model.intercept_)print("系数:")forname,coefinzip(X.columns,model.coef_):print(f"{name}: {coef:.4f}")

线性回归的优势在于: 可解释性强 ,适合理解回归问题本质。


第五部分:模型预测与评估

5.1 预测结果对比

示例代码
y_pred=model.predict(X_test)result=pd.DataFrame({"Actual": y_test.values,"Predicted": y_pred})print(result.head())

5.2 使用评估指标量化模型

示例代码
fromsklearn.metricsimportmean_squared_error,r2_scoremse=mean_squared_error(y_test,y_pred)r2=r2_score(y_test,y_pred)print("MSE:",mse)print("R2:",r2)

解释:

  • MSE 越小,预测误差越低
  • R² 越接近 1,模型解释能力越强

第六部分:模型优化 —— 标准化与岭回归

6.1 为什么要标准化

不同特征量纲差异巨大,会导致模型偏向数值大的特征。

示例代码
fromsklearn.preprocessingimportStandardScalerscaler=StandardScaler()X_train_scaled=scaler.fit_transform(X_train)X_test_scaled=scaler.transform(X_test)

6.2 使用岭回归抑制过拟合

示例代码
fromsklearn.linear_modelimportRidgeridge=Ridge(alpha=1.0)ridge.fit(X_train_scaled,y_train)y_pred_ridge=ridge.predict(X_test_scaled)print("Ridge MSE:",mean_squared_error(y_test,y_pred_ridge))print("Ridge R2:",r2_score(y_test,y_pred_ridge))

第七部分:完整流程回顾