基于随机森林回归模型的加州房价预测与特征重要性分析
1.作者介绍孟乐世男学院西安工程大学电子信息学院年级与身份2025级研究生研究方向机器学习数据挖掘与人工智能方向电子邮件1400980969qq.com2.关于理论方面的介绍2.1随机森林回归模型的介绍随机森林回归是一种集成学习方法它通过构建多棵决策树并对各棵树的预测结果求平均值从而提升模型的泛化能力与预测稳定性。相较于单棵决策树随机森林能够有效降低过拟合风险并且可以输出各特征对预测结果的贡献度因此非常适合用于房价预测与特征重要性分析任务。本项目中使用的是RandomForestRegressor回归模型。代码中设置了n_estimators300、max_depth12、min_samples_split4、min_samples_leaf2等参数以平衡模型复杂度和预测效果。2.2 California Housing 数据集与字段说明根据 scikit-learn 官方文档California Housing 是一个经典回归数据集官方版本包含 20640 条样本、8 个特征目标变量为MedHouseVal。本项目目录中的california_housing_demo.csv为与官方字段结构一致的演示数据用于在当前环境中完整复现建模、评估与可视化流程。当前演示 CSV 共包含 240 条样本、8 个特征列和 1 个目标列不存在缺失值适合直接用于随机森林回归实验。2.3回归指标评价介绍为衡量模型的预测效果本文采用决定系数 R2、均方根误差 RMSE 和平均绝对误差 MAE 三项指标。其中R2 越接近 1说明模型对目标变量的解释能力越强RMSE 与 MAE 越小则说明预测值与真实值之间的偏差越小。通过这三项指标的综合分析可以更全面地判断模型在房价预测任务中的精度、稳定性及误差分布情况。3.关于实验过程的介绍完整实验代码测试结果3.1实验环境与所需安装包本实验在 Windows 11 环境下完成编程语言为 Python 3.13.13。主要依赖的软件包包括 pandas、scikit-learn 和 matplotlib。其中pandas 用于数据读取与表格处理scikit-learn 用于数据集划分、模型训练与指标计算matplotlib 用于结果可视化。安装依赖命令如下python -m pip install -r requirements.txt。如需重新生成本课程 Word 模板另需安装python-docx。3.2 数据准备与实验流程实验首先读取本地的california_housing_demo.csv数据文件并对字段进行校验确保输入数据中完整包含MedInc、HouseAge、AveRooms、AveBedrms、Population、AveOccup、Latitude、Longitude和目标变量MedHouseVal。随后程序将特征矩阵 X 和目标变量 y 按照 8:2 的比例划分为训练集和测试集。在当前演示数据中训练集样本数约为 192 条测试集样本数约为 48 条。接着使用随机森林回归模型完成训练再在测试集上进行预测与性能评估最后输出指标文件、特征重要性表和可视化图像。整体实验流程可概括为读取数据 - 校验字段 - 划分训练集/测试集 - 训练随机森林回归模型 - 预测 - 计算评估指标 - 生成可视化图表。3.3 模型训练过程与核心实现说明代码中定义了统一的特征列表FEATURES和目标变量TARGET便于后续进行字段校验与建模。在模型训练阶段程序调用RandomForestRegressor进行拟合并使用固定随机种子random_state42保证实验具有可复现性。模型训练完成后程序基于测试集计算 R2、RMSE 和 MAE同时提取model.feature_importances_作为特征重要性分析依据。最终结果会自动保存到outputs/目录中方便后续在 Word 或 PPT 中直接引用。3.4 测试结果与结果分析从实验结果来看当前模型的 R2 为 0.8865说明模型能够较好地解释房价变化RMSE 为 0.3868MAE 为 0.2922表明预测误差处于较低水平。总体上随机森林回归模型在当前演示数据集上的预测效果较为理想。特征重要性分析结果显示MedInc的重要性远高于其他特征是影响房价预测结果的核心变量AveRooms、AveOccup和HouseAge也具有一定贡献但整体影响明显弱于收入中位数。这一结果说明在当前样本中地区收入水平与住房价值之间具有较强的相关关系。图 1 特征重要性分析图图 2 真实值与预测值对比图从“真实值与预测值对比图”可以看出大多数样本点分布在对角线附近说明模型预测值与真实值较为接近。若后续使用更大规模的官方原始数据集并进一步优化超参数模型性能仍有继续提升的空间。3.5 实验代码实现过程3.5.1导入依赖库from__future__importannotationsimportargparseimportjsonfrompathlibimportPathimportmatplotlib.pyplotaspltimportpandasaspdfromsklearn.datasetsimportfetch_california_housingfromsklearn.ensembleimportRandomForestRegressorfromsklearn.metricsimportmean_absolute_error,mean_squared_error,r2_scorefromsklearn.model_selectionimporttrain_test_split3.5.2全局常量定义FEATURES[MedInc,HouseAge,AveRooms,AveBedrms,Population,AveOccup,Latitude,Longitude,]TARGETMedHouseValDEFAULT_RANDOM_STATE423.2.3命令行参数解析defparse_args()-argparse.Namespace:project_rootPath(__file__).resolve().parents[1]default_csvproject_root/california_housing_demo.csvdefault_output_dirproject_root/outputsparserargparse.ArgumentParser(description...)parser.add_argument(--csv,typePath,defaultdefault_csv)parser.add_argument(--output-dir,typePath,defaultdefault_output_dir)parser.add_argument(--test-size,typefloat,default0.2)parser.add_argument(--show-plot,actionstore_true)parser.add_argument(--use-sklearn-data,actionstore_true)returnparser.parse_args()3.5.4数据加载与校验defvalidate_columns(df:pd.DataFrame)-None:required_columnsFEATURES[TARGET]missing_columns[cforcinrequired_columnsifcnotindf.columns]ifmissing_columns:raiseValueError(缺少必要列, .join(missing_columns))# 从本地CSV加载数据defload_from_csv(csv_path:Path)-pd.DataFrame:ifnotcsv_path.exists():raiseFileNotFoundError(f文件不存在{csv_path})dfpd.read_csv(csv_path)validate_columns(df)returndf# 从sklearn加载数据defload_from_sklearn()-pd.DataFrame:datasetfetch_california_housing(as_frameTrue)dfdataset.frame.copy()validate_columns(df)returndf# 统一数据加载入口defload_dataset(csv_path:Path,use_sklearn_data:bool)-tuple[pd.DataFrame,str]:ifuse_sklearn_data:returnload_from_sklearn(),sklearn数据集returnload_from_csv(csv_path),f本地CSV{csv_path}3.5.5模型训练deftrain_model(X_train:pd.DataFrame,y_train:pd.Series)-RandomForestRegressor:modelRandomForestRegressor(n_estimators300,# 300棵树max_depth12,# 树最大深度12min_samples_split4,# 节点分裂最小样本数min_samples_leaf2,# 叶子节点最小样本数random_stateDEFAULT_RANDOM_STATE,n_jobs-1,# 用满CPU核心加速)model.fit(X_train,y_train)# 训练模型returnmodel3.5.6模型评估defcompute_metrics(y_true:pd.Series,y_pred:pd.Series)-dict[str,float]:return{r2:r2_score(y_true,y_pred),# 拟合优度越接近1越好rmse:mean_squared_error(y_true,y_pred)**0.5,# 均方根误差mae:mean_absolute_error(y_true,y_pred)# 平均绝对误差}# 绘制特征重要性图defsave_feature_importance(...)-Path:...# 绘制真实值vs预测值散点图defsave_prediction_plot(...)-Path:...3.5.7 结果保存defsave_outputs(output_dir:Path,...)-dict[str,Path]:output_dir.mkdir(parentsTrue,exist_okTrue)# 自动创建文件夹# 保存评估指标为jsonwithopen(metrics.json,w)asf:json.dump(metrics,f,indent2)# 保存特征重要性、预测结果为CSVfeature_importance.to_csv(feature_importance.csv)predictions.to_csv(predictions.csv)# 保存两张图表save_feature_importance(...)save_prediction_plot(...)