ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

随机森林实现文旅经济预测:特征工程、模型调参与论文写作全流程

随机森林实现文旅经济预测:特征工程、模型调参与论文写作全流程 简介基于文旅现象对地方经济影响这一真实场景构建的随机森林数据分析与预测项目内容覆盖数据读取、特征相关性分析、模型训练与拟合效果可视化适合机器学习初学者用于毕业设计、期末大作业或课程设计。压缩包共19个文件主要类型包括可运行的Python源码、完整论文PDF/Word、Excel数据表格、PNG可视化图以及项目配置与说明文档整包仅2.81MB结构清晰便于对照学习。源码已在本地编译通过评审分98分难度适中并经过助教老师审定可直接运行复现旅游总收入走势、特征相关性等关键图表。当前已有357人学习下载能够帮助使用者快速掌握随机森林在具体经济数据分析中的完整流程。1. 文旅经济预测为什么选中随机森林数据小、特征杂、还得解释得清很多做文旅经济影响分析的课题最后都卡在同一个环节数据量不大、特征口径混乱还要给出能写进结论的解释。基于Python机器学习随机森林的数据分析与预测项目恰好覆盖了这条完整链路——用随机森林回归做数据分析与预测不需要深度学习那样的算力又能从特征重要性里找到「到底是哪个文旅因素在拉动经济」的答案。随机森林对表格数据的适应性极强数据标准化都可以省几十个样本也能训练出有参考价值的模型这对文旅经济这类中小规模课题非常关键。这类项目里的「文旅现象」不是一句描述而是一组可量化变量旅游接待人次、旅游总收入、A级景区数量、住宿餐饮业营业额、交通客运量「地方经济影响」则对应GDP增速、第三产业占比这类经济指标。把这些变量清洗对齐、构造特征、训练回归模型、评估预测效果最后把过程和结论写成论文就是一套标准交付物。源码里包含数据清洗、特征工程、模型训练和评估的完整流程论文里给出方法说明和实证图表。这个方向适合三种人刚入门机器学习、想把pandas和sklearn真正跑通一个完整项目的人手里有一批经济类表格数据、想做预测分析但不确定模型怎么选的人以及需要完成毕业课题或竞赛作品的在校生。数据量小、特征杂、还要可解释这三个条件占两个随机森林基本就是性价比最高的起点。2. 把「文旅现象」翻译成可训练特征数据清洗、标签构造与时间划分2.1 特征数据源怎么选统计年鉴、文旅公报与网络热度三类口径先说数据源。文旅类课题最常用的数据是地方统计年鉴里的旅游指标包括国内旅游接待人次、入境旅游人次、旅游总收入、旅行社数量、星级饭店数量其次是文旅部门每月发布的旅游统计简报里面有重点景区的接待量如果要体现「现象」层面的热度还可以补充网络搜索热度指数——用「城市名旅游」作为检索词随时间变化形成一条热度曲线。三类数据拼起来才构成「文旅现象」的完整画像。口径对齐是第一步也是最容易翻车的一步。不同来源的「旅游接待人次」可能完全不是同一个东西有的是过夜游客口径有的是包含一日游的总口径有的按景区售票统计有的按住宿登记推算。我一般会在合并脚本里保留一列source字段再写一个口径映射表把不同来源统一成「过夜游客人次」和「总人次」两个口径宁可放弃部分数据也不硬拼。硬拼的结果就是模型学到的是统计口径差异而不是真实的经济影响。数据粒度上建议定为「地级市-季度」。季度数据在统计年鉴里基本都能拿到样本量能达到百行级别。如果只用年度数据一个市十几年才十几个样本随机森林再能打也练不出东西如果用月度数据旅游收入的季节性会让模型先拟合周期反而干扰经济影响判断。数据合并后用pandas检查缺失率和唯一值数量缺失超过30%的特征直接丢弃唯一值数量过少的特征考虑转成有序编码。这一步没做好后面所有调参都是在给脏数据擦屁股。特征数据源的质量直接决定模型上限随机森林只是把数据里的信号挖出来数据本身没信号算法再强也是白搭。2.2 特征与标签构造滞后变量、滚动窗口和占比指标「文旅现象对地方经济影响」里的「影响」天然带有滞后性游客来了消费发生在当期但配套产业的产能扩张、就业岗位增加是后面几个季度才反映出来的。所以原始特征不能直接用当期值要构造滞后变量。滞后变量在金融时序预测里也是标配文旅经济只是加了一层「产业拉动有延迟」的业务含义。我常用的构造方式是import pandas as pd df pd.read_csv(tourism_econ_data.csv, parse_dates[quarter]) df df.sort_values([city, quarter]).reset_index(dropTrue) # 滞后4期用前4个季度的旅游收入解释当前GDP增速 for lag in [1, 2, 4]: df[ftourism_income_lag{lag}] df.groupby(city)[tourism_income].shift(lag) # 滚动4期均值平滑季节性体现趋势性影响 df[tourism_income_ma4] ( df.groupby(city)[tourism_income] .transform(lambda x: x.rolling(4, min_periods1).mean()) ) # 占比指标旅游收入相当于地区GDP的份额体现产业依赖度 df[tourism_gdp_ratio] df[tourism_income] / df[gdp]这段代码里需要注意几点。groupby(city).shift(lag)是在每个城市内部向后平移不会跨城市计算错位如果忘了groupby直接shift第一个城市的末尾数据会错接到第二个城市开头这是数据泄露的一种隐蔽形式。rolling(4, min_periods1)在数据不足4期时用已有数据计算保证前几行不是空值。tourism_gdp_ratio这类占比特征对树模型是有用的它把绝对量差异缩小让模型更容易捕捉「旅游在经济中的相对地位」这个业务含义。标签选择上我一般用两个GDP同比增速和第三产业增加值占GDP比重。GDP增速反映增长动能变化第三产业占比反映结构转型。预测任务在论文里可以只写一个为主另一个放稳健性检验。标签必须保持在当期特征已经用了滞后变量如果标签也做滞后等于把未来信息泄露给模型。这个构造思路和电商里用用户历史行为预测复购是同一套逻辑只是业务对象从消费者换成了区域经济。特征构造完做一个相关性筛查。把特征和标签的相关系数矩阵打印出来明显高于0.9的特征要么删除要么换滞后版本。这一步后面会在避坑章详细讲但建议在构造阶段就养成习惯不要等模型跑完再回头看。2.3 时间序列的数据划分shuffleFalse 是底线很多人在这一步踩坑。用train_test_split(X, y, test_size0.2)不指定shuffleFalse默认会把所有季度打乱再随机抽样。这在普通回归任务里没问题但在时间序列任务里等于把未来数据混进训练集——模型背答案测试集分数虚高真实场景里根本复现不出来。正确做法是按时间顺序切分训练集取前80%的时间区间测试集取最后20%。我一般在数据清洗完成之后、任何建模之前就先把切分代码写好并固定种子后面反复实验都用同一份切分保证所有模型横向可比。from sklearn.model_selection import train_test_split # 按时间排序后的索引切分禁止shuffle train_size int(len(feature_df) * 0.8) train_df feature_df.iloc[:train_size] test_df feature_df.iloc[train_size:] # 也可以用train_test_split但必须显式关掉shuffle X_train, X_test, y_train, y_test train_test_split( feature_df.drop(columns[gdp_growth]), feature_df[gdp_growth], test_size0.2, shuffleFalse, # 时间序列数据必须顺序切分 random_state42 )这段代码的核心是shuffleFalse。只要写了这一行至少能保证数据划分不会泄露未来信息。第二个要注意的是random_state42要固定论文里所有的实验数字必须能复现随机种子不固定重跑一遍结果全变论文里的表格就站不住脚。第三个是关于验证集常见做法是从训练集里再切出一部分做验证但时间序列更好的选择是用第4章要讲的TimeSeriesSplit做滚动验证而不是随机交叉验证。提示如果样本量实在太小比如只有60行以下可以考虑把粒度从季度改成半年度或者把多个城市的面板数据堆在一起训练。用城市作为group做滞后处理样本量能到几百行模型才有足够的数据学习非线性关系。3. 随机森林回归建模sklearn 实现步骤与 5 个必调参数3.1 为什么这里选回归树而不是分类器预测GDP增速是一个连续值所以选RandomForestRegressor而不是RandomForestClassifier。这个听起来像废话但很多人会在论文里把「预测增长」写成分类问题——把增速分成「高/中/低」三档用分类器做这会丢掉大量信息模型性能反而远不如回归。随机森林的原理可以浓缩成一句话在Bagging框架下并行训练一堆决策树每棵树在训练时从样本中有放回地抽样bootstrap采样在每次分裂时从随机选取的特征子集里找最优切分点最终预测取所有树的平均。两个随机性——样本随机和特征随机——让每棵树都「弱且有差异」集成之后方差被压下来整体模型不容易过拟合这正是小样本表格数据的刚需。这也是它在文旅经济这类任务里优于单一决策树和线性模型的原因单一决策树方差大换一组数据结果就飘线性模型又假设特征和标签是线性关系文旅经济里节假日爆发、基础设施滞后这类非线性效应它拟合不了。随机森林回归算法在sklearn里几乎开箱即用不需要做特征标准化和复杂预处理这是它在数据分析实战里被用得最多的原因之一。3.2 最小可行训练脚本从数据集到预测结果直接跑通一个最小脚本。假设特征工程已经得到了feature_df里面有滞后变量、滚动变量和占比指标标签列是gdp_growthfrom sklearn.ensemble import RandomForestRegressor from sklearn.metrics import r2_score, mean_squared_error import numpy as np rf RandomForestRegressor( n_estimators300, max_depth8, min_samples_leaf4, max_featuressqrt, oob_scoreTrue, random_state42 ) rf.fit(X_train, y_train) y_pred rf.predict(X_test) print(R2:, round(r2_score(y_test, y_pred), 4)) print(RMSE:, round(mean_squared_error(y_test, y_pred, squaredFalse), 4)) print(OOB R2:, round(rf.oob_score_, 4))这里把基础参数先定下来n_estimators300是树的数量树太少学习不充分树太多训练变慢且边际收益递减max_depth8限制每棵树的最大深度防止单棵树长到完全拟合训练集min_samples_leaf4要求每个叶子节点至少4个样本这条对回归任务很重要相当于给树的复杂度踩了刹车max_featuressqrt是分裂时随机抽取的特征数回归任务的常用起点oob_scoreTrue会开启袋外样本评估下面会讲用途。跑完之后先看三个数字的差距训练集R²、测试集R²、OOB R²。如果训练集R²接近1而测试集明显低是过拟合优先调大min_samples_leaf如果两边都低先回去检查特征工程而不是调参。这个判断顺序比任何调参技巧都重要sklearn作为python机器学习常用包里对随机森林支持最稳定的库这个脚本基本不用改就能复用到其他经济数据上。3.3 5 个必调参数先定结构再精修随机森林虽然比深度学习「玄学」成分少很多但参数之间一样有耦合。我一般按下面的顺序调每步只动一个参数参数默认值我的常用范围作用与判断方法n_estimators100200-500看OOB得分是否还在随树增加而上升到平台期就停max_depthNone6-12None容易过拟合小样本限制深度换取泛化min_samples_leaf13-10调大可明显抑制过拟合回归任务建议不小于3max_features1.0sqrt或1/3特征数在20以内用sqrt超过20尝试1/3criterionsquared_errorsquared_error或friedman_mse默认squared_error好用对离群值敏感时换absolute_error用GridSearchCV一次跑一个小网格不要一上来就全组合搜索。特征不到30个、样本几百行的数据一次网格搜索几分钟就能跑完但全组合会让时间翻几倍。常见做法是先固定n_estimators搜索max_depth和min_samples_leaf的组合然后再固定这两个微调max_features。from sklearn.model_selection import GridSearchCV param_grid { max_depth: [6, 8, 10], min_samples_leaf: [3, 5, 8], max_features: [0.3, sqrt] } grid GridSearchCV( RandomForestRegressor(n_estimators300, oob_scoreTrue, random_state42), param_grid, cv5, scoringr2, n_jobs-1 ) grid.fit(X_train, y_train) print(best params:, grid.best_params_)这里的cv5是随机5折交叉验证它用来粗筛参数选出best_params后再用第4章的TimeSeriesSplit做最终评估——交叉验证选参和时序评估各管一段分工不要混。scoringr2表示按R²选择参数如果业务上更在意误差绝对值可以换neg_mean_squared_error。调参有一条经验准则min_samples_leaf在回归任务里几乎总是要调大的默认值1在小样本下基本必过拟合max_depth要配合min_samples_leaf一起看两者都限制树复杂度但一个管深度一个管叶子规模max_features是随机森林里最被低估的参数它决定每棵树的「个性化程度」特征之间相关性高的时候调小max_features反而能提升整体稳定。3.4 OOB袋外估计不额外分割就能评估模型袋外样本是随机森林特有的免费评估机制。每棵树训练时用的是bootstrap抽取的样本没被抽到的样本就是这棵树的袋外样本。对每个样本来说把它在所有「没用到它训练」的树上的预测结果平均就得到一个几乎无偏的预测这就是rf.oob_score_。它和测试集R²高度相关但不需要动预留数据。用法上先用少量树比如50棵跑一次观察oob_score_随n_estimators的变化曲线。如果200棵树时OOB分数还在明显上升继续加到500如果100棵就到平台期别浪费算力。OOB分数是判断「树够不够多」最直接的证据比反复看测试集结果更省心。特征重要性rf.feature_importances_也在这里一起看importance pd.Series( rf.feature_importances_, indexX_train.columns ).sort_values(ascendingFalse) print(importance.head(10))内置重要性衡量的是每个特征在所有树分裂中带来的不纯度下降总量。它适合用来发现「哪些变量相对更重要」但绝对数值没有业务含义而且受共线性影响。如果某两个特征高度相关比如旅游总收入和接待人次重要性会在两者之间随机分配这个是第5章要讲的坑这里先记住结论内置重要性用于排序筛选不用于数值解读。4. 验证模型是不是真的能用回归指标、基线对比和残差分析4.1 回归预测四件套R²、RMSE、MAE、MAPE文旅经济课题里评审最关心的就四个数。R²看模型解释了多少变化RMSE和MAE看预测误差的绝对水平RMSE对大误差更敏感MAPE看相对误差百分比方便跨量级对比。一次性算齐from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error mape np.mean(np.abs((y_test - y_pred) / y_test)) * 100 print(fR2: {r2_score(y_test, y_pred):.4f}) print(fRMSE: {mean_squared_error(y_test, y_pred, squaredFalse):.4f}) print(fMAE: {mean_absolute_error(y_test, y_pred):.4f}) print(fMAPE: {mape:.2f}%)这四个指标不是选一个最好的写在论文里而是全部呈现。R²容易给人「模型很准」的错觉——当标签方差本身就小的时候R²可以很高但误差在当前业务里依然不可接受反过来RMSE受数据量纲影响不同城市之间没法直接比较所以要用MAPE补位。我见过的论文翻车方式里最常见的就是只写R²0.9x不写误差绝对水平被问到「RMSE对应的GDP增速误差是几个百分点」时答不上来。对于文旅经济课题MAPE落在8%-15%之间算可用。如果MAPE超过20%先检查数据划分和特征工程不要先怀疑算法。指标的选择也要对齐业务诉求更关注高增长年份的误差就多看RMSE更关注整体百分比偏差就多看MAPE两者在论文讨论部分可以分开说。4.2 和线性回归、单棵决策树、XGBoost 做基线对比一个预测模型在论文里的说服力来自和基线的对比而不是单看自身分数。常见做法是用同一份训练集和时序划分跑三个基线线性回归、单棵决策树、XGBoost。XGBoost需要先pip install xgboost接口和sklearn一致。from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from xgboost import XGBRegressor models { LinearRegression: LinearRegression(), DecisionTree: DecisionTreeRegressor(max_depth6, random_state42), RandomForest: RandomForestRegressor(n_estimators300, max_depth8, min_samples_leaf4, random_state42), XGBoost: XGBRegressor(n_estimators300, max_depth4, learning_rate0.05, random_state42) } for name, model in models.items(): model.fit(X_train, y_train) pred model.predict(X_test) print(f{name:20s} R2{r2_score(y_test, pred):.4f} fMAE{mean_absolute_error(y_test, pred):.4f})结果整理成对比表写进论文格式参考模型R²MAE结论线性回归0.35-0.551.2-1.8线性假设过强漏掉非线性效应单棵决策树0.2-0.6 波动大1.0-2.0方差大换数据分数飘随机森林0.65-0.850.5-1.0稳定且可解释XGBoost0.6-0.850.5-1.1与随机森林接近或略好这个范围是这类面板数据上常见的表现区间具体数字以你的数据为准。如果随机森林明显输给XGBoost不必沮丧这在几百行小样本上是常见现象可以把两者都写进论文说明选择依据随机森林在特征重要性解释上更透明适合需要向非技术读者解释的课题。不要为了好看只报最好的模型评审问到基线就露馅。关于树模型不需要特征标准化这一点放在论文方法部分说明即可。线性回归则要做标准化注意StandardScaler只在训练集上fit再transform测试集防止测试集信息混入。4.3 TimeSeriesSplit 时序交叉验证小样本的靠谱评估第2章说过固定时间切分是底线但固定切分的缺点是只给出一个测试集结果受尾部那几年偶然波动影响。更稳的做法是用TimeSeriesSplit做滚动评估第一次用前80%的时间段训练、后面20%测试第二次把窗口往后推依次滚动。from sklearn.model_selection import TimeSeriesSplit tscv TimeSeriesSplit(n_splits5) scores [] for train_idx, test_idx in tscv.split(X_train): rf_model RandomForestRegressor(n_estimators300, max_depth8, min_samples_leaf4, random_state42) rf_model.fit(X_train.iloc[train_idx], y_train.iloc[train_idx]) pred rf_model.predict(X_train.iloc[test_idx]) scores.append(r2_score(y_train.iloc[test_idx], pred)) print(TimeSeriesSplit R2:, np.mean(scores))这里要理解TimeSeriesSplit和普通KFold的本质区别KFold的测试集可能在训练集的时间之前等于用未来预测过去TimeSeriesSplit永远保证train_idx里的时间全部早于test_idx。论文方法部分只要写了用TimeSeriesSplit评审就知道你处理过时序泄露问题。最终报数时报这个滚动平均R²比报单次测试集R²更有说服力。4.4 残差分析预测误差画像能暴露大多数问题残差分析是验证环节最能暴露问题的步骤却最少有人做。把真实值减去预测值得到残差画在真实值-残差坐标下重点看三点残差是否围绕0轴上下均匀分布是否存在随真实值增大残差也增大的喇叭口是否存在某几个季度残差特别大。import matplotlib.pyplot as plt residual y_test - y_pred plt.scatter(y_test, residual, alpha0.6) plt.axhline(y0, colorred, linestyle--) plt.xlabel(真实GDP增速 (%)) plt.ylabel(残差 (真实值-预测值)) plt.title(残差分布) plt.show()喇叭口形态说明模型对高增长年份的系统性低估——旅游大爆发年份被模型当成噪声平滑掉了。这个问题随机森林很难靠调参解决需要在特征工程里加入更细的节日效应变量或者干脆在论文讨论部分说明模型对极端值的保守倾向。残差里如果发现连续多个季度同方向偏离说明有没被捕获的时间趋势回去看特征里是不是漏了宏观经济背景变量。python数据分析与可视化在这类验证里价值最大一张残差图顶得上十行指标说明图表进论文也符合经济类课题的惯例。5. 文旅经济预测的高频翻车现场与排查方法这一章直接给踩坑清单每一条我都实际撞过或者帮人排查过。现象、原因、解决三件事说清楚。5.1 现象R²很高预测曲线却几乎是均值训练集R²到0.95测试集R²有0.7看起来还行但把真实值和预测值画成折线预测曲线几乎是一条水平线只是在均值附近轻微波动。原因几乎一定是数据划分或者特征泄露。检查顺序第一train_test_split是否忘了shuffleFalse第二特征里有没有「当期GDP」或由当期GDP派生出来的变量第三是否在特征构造时不小心把标签的未来值shift进了特征。解决方法是按第2章的时序划分重跑并打印出所有特征的滞后阶数做一次人工审计。这类问题最大的麻烦在于指标看起来不差不画图根本发现不了所以每轮实验后我至少画一次预测对比折线图。5.2 现象旅游总收入进特征模型「作弊式」高估旅游贡献特征重要性排序里旅游总收入排第一论文结论看起来很漂亮但这个结果在评审那里一戳就破旅游总收入本身和GDP同属地区经济产出的一部分拿当期的它预测当期的GDP增速等于拿答案猜答案。原因是共线性加业务逻辑闭环。解决方法是做相关系数筛查剔除和标签相关系数大于0.9的特征或者强制把经济类特征全部滞后至少一期只保留「上一期旅游收入对本期GDP增速」的解释关系。这才是论文里「影响」二字能成立的基础——你证明的是时间上的先后影响而不是同期相关。5.3 现象类别特征热编码后维度爆炸景区等级、月份、城市名这些类别特征直接用pd.get_dummies全量热编码几十个类别变成几十列随机森林的特征随机采样被大量无信息列稀释训练变慢且重要性被冲淡。原因是对树模型用了深度学习的数据处理习惯。解决方法是树模型对有序类别用LabelEncoder或直接保留原始数值对无序类别只保留样本量前5的类别做热编码其余合并成「其他」类。这个操作在特征工程阶段就做不用等训练完再调。5.4 现象训练集R²接近1测试集R²掉到0.3这是min_samples_leaf1加max_depthNone的典型症状树长到每片叶子只有一个样本把训练集噪声全背下来了。解决方法是把min_samples_leaf提到样本量的3%-5%100行样本就设3-5限制max_depth在6-10之间用第3章的网格搜索找组合。判断是否解决的标准训练集R²会掉下来一点但测试集R²会明显回升这是树模型调参里最典型的此消彼长。如果回升不明显检查特征里是否还有上面5.2说的「作弊特征」。5.5 现象内置特征重要性和业务直觉打架比如「旅行社数量」的重要性排到第一而「游客接待人次」排到倒数和直觉完全相反。原因是内置重要性基于不纯度下降对共线性和高基数特征有偏向几个相关特征之间重要性会随机分配排名波动很大。解决方法是改用置换重要性把某一列特征随机打乱后看预测误差上升多少上升越多说明该特征越重要。这个方法不受共线性偏置影响得到的结果更接近业务直觉from sklearn.inspection import permutation_importance perm_result permutation_importance( rf, X_test, y_test, n_repeats10, random_state42 ) importance_perm pd.Series(perm_result.importances_mean, indexX_test.columns) print(importance_perm.sort_values(ascendingFalse).head(10))n_repeats10表示每列打乱10次取平均太少结果不稳定太多耗时线性增长。置换重要性用一个朴素实验证明「这个特征确实在影响预测」比直接甩一个黑匣子的内置权重更有说服力论文里建议同时报告内置重要性和置换重要性的结果并说明差异来源。6. 把结果写进论文图表组织、论证顺序与一份复现清单6.1 方法章节和实证章节怎么对齐论文结构建议用六章绪论、文献综述、数据与变量说明、随机森林方法与参数选择、实证结果、结论与建议。工作量集中在中间三章数据章写清每个特征的口径和滞后阶数方法章讲随机森林原理和5个参数的选取逻辑实证章用对比表和重要性图回答绪论里的问题。切忌写成算法科普评审想看你「怎么用」不是「随机森林是什么」。6.2 两张核心图直接决定评审印象第一张是特征重要性条形图第二张是真实值与预测值散点加45度参考线。用matplotlib就能画import matplotlib.pyplot as plt top_feat importance.head(10) plt.barh(top_feat.index[::-1], top_feat.values[::-1]) plt.xlabel(特征重要性) plt.title(文旅经济影响因子重要性排序) plt.tight_layout() plt.savefig(feature_importance.png, dpi300) plt.scatter(y_test, y_pred, alpha0.6) lim [min(y_test.min(), y_pred.min()), max(y_test.max(), y_pred.max())] plt.plot(lim, lim, r--) plt.xlabel(真实GDP增速 (%)) plt.ylabel(随机森林预测值 (%)) plt.title(测试集预测效果) plt.tight_layout() plt.savefig(pred_vs_true.png, dpi300) plt.show()保存成300dpi的PNG直接满足论文插图要求。条形图只看前十后面的重要性趋近于零画出来反而显得空。散点图加45度线后点越贴近红线越好这个视觉判断比一堆指标对非技术读者更友好。6.3 每个数字必须能复现最后动手改论文之前列一份复现清单数据文件路径、季度覆盖范围、训练集和测试集的时间边界、随机种子、所有超参、指标计算公式。论文里出现的每个数字重跑脚本必须原样得到。答辩现场当场跑脚本对不上论文数字的情况基本都是中间改过一次数据处理论文没同步。做这类课题最大的教训是「先保证划分对再谈调参」随机森林再能打也救不了数据泄露的锅。把从数据清洗到论文输出的流程完整跑两遍后续换任何经济数据都会顺很多希望帮到你。本文还有配套的精品资源点击获取
返回列表