1.作者介绍
孟乐世,男,学院:西安工程大学电子信息学院
年级与身份:2025级研究生
研究方向:机器学习,数据挖掘与人工智能方向
电子邮件:1400980969@qq.com
2.关于理论方面的介绍
2.1随机森林回归模型的介绍
随机森林回归是一种集成学习方法,它通过构建多棵决策树并对各棵树的预测结果求平均值,从而提升模型的泛化能力与预测稳定性。相较于单棵决策树,随机森林能够有效降低过拟合风险,并且可以输出各特征对预测结果的贡献度,因此非常适合用于房价预测与特征重要性分析任务。
本项目中使用的是RandomForestRegressor回归模型。代码中设置了n_estimators=300、max_depth=12、min_samples_split=4、min_samples_leaf=2等参数,以平衡模型复杂度和预测效果。
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_state=42保证实验具有可复现性。
模型训练完成后,程序基于测试集计算 R2、RMSE 和 MAE,同时提取model.feature_importances_作为特征重要性分析依据。最终结果会自动保存到outputs/目录中,方便后续在 Word 或 PPT 中直接引用。
3.4 测试结果与结果分析
从实验结果来看,当前模型的 R2 为 0.8865,说明模型能够较好地解释房价变化;RMSE 为 0.3868,MAE 为 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",]TARGET="MedHouseVal"DEFAULT_RANDOM_STATE=423.2.3命令行参数解析
defparse_args()->argparse.Namespace:project_root=Path(__file__).resolve().parents[1]default_csv=project_root/"california_housing_demo.csv"default_output_dir=project_root/"outputs"parser=argparse.ArgumentParser(description="...")parser.add_argument("--csv",type=Path,default=default_csv)parser.add_argument("--output-dir",type=Path,default=default_output_dir)parser.add_argument("--test-size",type=float,default=0.2)parser.add_argument("--show-plot",action="store_true")parser.add_argument("--use-sklearn-data",action="store_true")returnparser.parse_args()3.5.4数据加载与校验
defvalidate_columns(df:pd.DataFrame)->None:required_columns=FEATURES+[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}")df=pd.read_csv(csv_path)validate_columns(df)returndf# 从sklearn加载数据defload_from_sklearn()->pd.DataFrame:dataset=fetch_california_housing(as_frame=True)df=dataset.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:model=RandomForestRegressor(n_estimators=300,# 300棵树max_depth=12,# 树最大深度12min_samples_split=4,# 节点分裂最小样本数min_samples_leaf=2,# 叶子节点最小样本数random_state=DEFAULT_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(parents=True,exist_ok=True)# 自动创建文件夹# 保存评估指标为jsonwithopen("metrics.json","w")asf:json.dump(metrics,f,indent=2)# 保存特征重要性、预测结果为CSVfeature_importance.to_csv("feature_importance.csv")predictions.to_csv("predictions.csv")# 保存两张图表save_feature_importance(...)save_prediction_plot(...)