ARTICLE DETAIL

资讯详情

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

随机森林回归预测气温:Python完整实现与调参指南

随机森林回归预测气温:Python完整实现与调参指南 简介基于Python随机森林算法实现气温预测的完整源码包面向毕业设计、课程设计及项目开发场景适合有一定Python基础并希望掌握机器学习建模流程的开发者。项目经过严格测试均可放心参考和扩展。压缩包共15个文件其中4个Python脚本为核心预测逻辑2个CSV为训练与测试数据集另有XML配置和TXT说明等辅助文件整体仅4.27MB轻量且易于部署。资源内附完整气象数据和参数说明便于理解随机森林特征重要性、超参数调优等关键点目录结构清晰源码与数据分离可快速定位并二次改造。目前已有324人学习浏览源码涵盖数据读取、特征处理、模型训练与结果评估等环节。读者可基于此完成气温预测实验也可替换其他气象数据延伸研究。1. 用Python实现随机森林气温预测毕业设计能直接交差的完整方案每年这个时候都会有一批人拿着气温预测题目来找我看代码。说实话气温预测在算法层面不难难在数据和特征整理。随机森林回归的思路很简单——大量决策树各自预测再取平均——但它对气象数据这种高噪声、强非线性、特征互相纠缠的场景稳定性和精度都明显好于线性回归。这篇笔记把链路拆开讲数据清洗、特征构造、sklearn训练、调参和避坑。适合两类人毕业设计和课程设计需要一套能跑通、能写进论文的完整方案的人刚开始学Python数据分析、想拿随机森林做真实预测任务的人。文中代码拼起来就是完整源码环境只要Python、sklearn、pandas和matplotlib。2. 随机森林回归预测气温的原理为什么决策树投票能拟合温度2.1 随机森林回归的决策逻辑从CART分裂到集成投票先把随机森林回归算法的底层逻辑讲清楚这套逻辑也是论文里原理部分的骨架。随机森林由若干棵CART回归树组成每一棵树的生长过程是从根节点开始遍历候选特征和候选分裂阈值找到一个让分裂后两个子节点的均方误差之和最小的切分方式把样本分成左右两个分支然后在子节点上重复这个过程直到达到预设的深度或叶子节点样本数下限。放在气温数据上第一刀大概率切在月份上——7月还是1月对温度的影响远大于其他特征再往下分割依据会变成前一日气温是否高于某个值、气压是否出现骤降。每个叶子节点最终保存的是它内部样本标签的平均值预测时把新样本沿树往下送落到哪个叶子就用哪个叶子的均值作为这棵树的输出。森林层面的设计是两重随机。第一重是行采样每棵树从原始数据集里有放回地抽取一份与原始数据等量的样本大约有36.8%的数据在单棵树的训练中完全没出现这部分叫袋外数据Out-of-Bag可以直接用来评估这棵树而不用额外划分验证集sklearn里对应的是oob_score_属性。第二重是列采样每棵树在每次分裂时只从全部特征中随机挑选一个子集回归任务默认是特征总数的三分之一在这个子集里找最优切分。两重随机保证树与树之间的相关性被尽量压低——树之间差异越大集成平均的效果越好。预测时森林把上百棵树的输出取算术平均根据大数定律均值会显著压缩单棵树的随机波动。sklearn里训练时设置oob_scoreTrue训练结束的oob_score_就是袋外数据的R²它和测试集分数的趋势一致可以当做一个不需要留验证集的快速参考指标。这里有个值得记住的结论随机森林的每棵树都可以过拟合但森林整体不会。树之间随机性的引入让各自的过拟合误差分布互相独立平均之后彼此抵消。这也解释了为什么随机森林比单棵决策树的预测曲线平滑得多不会因为训练集里多了一个异常年份就剧烈变形。2.2 气温预测为什么选随机森林非线性、多特征、抗过拟合气温预测任务的特征维度不高但信息密度大。一个普通气象站的逐日数据原始字段大概十个左右加上时间派生特征也就二十个上下。这种中低维度表格数据恰好是随机森林的舒适区。相比之下神经网络在小样本表格数据上优势不明显还要求先做标准化、处理缺失值、调学习率一套流程下来可能丢掉整个项目的三分之二工期。气象数据的第二个特点是强非线性。气温不是气压、湿度、风速的线性加权组合冷空气过境时气温断崖式下跌夏季午后雷雨能让温度在半小时内降五度这些过程在特征空间里都是陡峭的非线性跳变。线性回归完全抓不住这种结构SVM理论上能处理非线性但核函数的选择又是一个玄学。随机森林用分段常数函数逼近任意形状的映射关系——它不假设数据服从任何分布也不需要特征满足单调关系。第三个常被低估的优势是不用量纲统一。气象数据集里气压是1000百帕的量级、湿度是0到100的百分数、风速是两位数以下如果走神经网络或KNN必须先做标准化否则大数值特征会主导距离计算随机森林每次分裂只在一个特征内部比较切分收益特征之间天然没有尺度竞争所以StandardScaler不是必选项省掉一步预处理就少一个出错点。同理它对异常值的容忍度也高某个时刻传感器把气温记成500度单棵树会被带歪但森林里有几十棵树没抽到这条样本投票结果几乎不受影响。从项目交付的角度看随机森林在遥感领域的地表温度反演、气象站温度插值这类任务里也大量被验证过不是毕设专属的小玩具。而且它有天然的可解释性——训练完成后直接输出每个特征的feature_importances_答辩时老师问模型依据什么预测你可以直接指着特征重要性图回答这个优势神经网络很难替代。2.3 随机森林和决策树的区别用方差换偏差随机森林和决策树的区别是被问得最多的一个问题理解这个区别其实就是理解整个随机森林的动机。单棵决策树的问题是方差太大训练数据稍稍变化树的切分结构可能完全重排预测结果剧烈摇摆树越深越接近把训练集背下来泛化能力直线下降。随机森林的策略是在基本不增加偏差的前提下用大量有差异的树做平均把方差压到非常低也就是常说的用方差换偏差。实操时你可以做一个小实验验证这个差别等第3章的数据准备跑完之后用同一份训练集分别训练单棵树和森林from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor # X_train, y_train, X_test, y_test 来自第3章的特征构造与时间切分 tree DecisionTreeRegressor(max_depth12, random_state42) forest RandomForestRegressor(n_estimators100, max_depth12, random_state42, n_jobs-1) tree.fit(X_train, y_train) forest.fit(X_train, y_train) print(决策树R²:, round(tree.score(X_test, y_test), 4)) print(随机森林R²:, round(forest.score(X_test, y_test), 4))注意两个模型用了同样的max_depth12唯一差别是森林多做了100次有放回抽样和特征随机。多数情况下你会看到森林在测试集上的R²比单棵树高几个百分点并且如果你把单棵树的深度改成不限制它的测试集分数会明显下跌而森林即使深度放开一点测试集分数的波动也远小于单棵树。代码里random_state42保证两个模型在相同条件下可比n_jobs-1让森林并行跑满所有CPU核百棵树几秒就结束。这个对比实验写进论文里非常加分它能直观证明集成这一步的价值而不只是把随机森林当成一个黑匣子调包。补充一句如果你的数据量只有两三百天随机森林的效果会明显受限因为树的分裂找不到足够样本支撑此时优先收集更多年份数据而不是加参数。3. 气温预测的数据准备与特征工程真正拉开分差的工作3.1 气象数据的获取与清洗从原始表格到可训练DataFrame数据是气温预测里最耗时的部分也是决定模型上限的环节这个顺序不要颠倒——特征和模型都救不了一堆烂数据。常见的数据来源有中国气象数据网的单站逐日气象数据集需要实名申请Kaggle上有不少城市历史气象站数据格式规整适合练手NASA POWER提供全球格点化的气象再分析数据适合做多站点扩展。毕设场景用单站逐日数据就够一般包含以下字段字段含义处理要点date日期转成datetime类型按时间排序后重置索引tavg日平均气温目标值检查是否存在超出物理范围的极值pressure日平均气压缺失时用前后日线性插值humidity日平均相对湿度确认单位是0-100还是0-1wind_speed日平均风速0值可能是静风不要当异常删除precipitation日降水量缺测日占比高可考虑直接去掉该列拿到数据的第一个动作不是写模型而是做质量审计。下面这段代码是标准清洗流程直接用就可以import pandas as pd df pd.read_csv(weather_data.csv, parse_dates[date]) print(df.shape, df.isnull().sum()) print(df.describe()) # 气温超出物理合理范围的整行置空交由插值处理 df.loc[(df[tavg] 45) | (df[tavg] -40), tavg] None df.sort_values(date, inplaceTrue) df.reset_index(dropTrue, inplaceTrue) # 线性插值填充缺失气象序列时间连续线性插值优于均值填充 df df.interpolate(methodlinear, limit_directionboth) df df.dropna().reset_index(dropTrue) print(df[[date, tavg]].head())这段代码的执行顺序是有讲究的。parse_dates[date]把日期列转成datetime对象后面做滞后特征、按年滚动都依赖这个类型describe()的min/max能一眼看出有没有传感器把气温记成100度的脏数据sort_values加上reset_index保证行序严格按时间递增否则后面的shift滞后特征会把乱序数据错位对齐interpolate(methodlinear)是按日期先后逐列做线性插值比如7月3日缺测就用7月2日和4日的折中估计limit_directionboth处理序列开头和结尾的缺测。dropna会顺带删掉那些没法插值的行比如某个字段一整年都为空。这里必须提醒一点interpolate插值的前提是缺失段两端都有有效数据如果数据文件里出现连续几个月整段缺失一些老旧站点的通病线性插值会硬拉出一条诡异的直线这时候的常规处理是直接把这段数据切掉而不是让模型去学习一段虚构出来的平稳温度。3.2 构造预测特征滞后特征、滑动窗口与时间编码模型能不能预测准一大半看特征气温尤其如此。气温是一个强自相关序列今天的气温与昨天、前天高度相关一周前的温度也还有参考价值。针对逐日数据我用得最多的是三类特征滞后特征、滑动窗口统计、时间编码。滞后特征是把历史目标值整体下移若干行让模型学会用昨天预测今天滑动窗口是取过去N天温度的均值、极值刻画短期变化趋势时间编码则是把月份、季节、一年中的第几天拆成数值列让模型感知现在处于一年中的什么位置。特征构造的代码和说明如下# 滞后特征昨天、前天、三天前、一周前的平均气温 for lag in [1, 2, 3, 7]: df[ftavg_lag{lag}] df[tavg].shift(lag) # 滑动窗口过去3天和7天的温度均值 df[rolling_mean_3] df[tavg].rolling(3).mean() df[rolling_mean_7] df[tavg].rolling(7).mean() # 时间编码月份、一年中的第几天、季节 df[month] df[date].dt.month df[dayofyear] df[date].dt.dayofyear df[season] df[month].apply(lambda m: (m % 12 3) // 3) # 1冬 2春 3夏 4秋 # 窗口和滞后产生的NaN必须删掉否则训练时sklearn直接报错 df.dropna(inplaceTrue) feature_cols [pressure, humidity, wind_speed, tavg_lag1, tavg_lag2, tavg_lag3, tavg_lag7, rolling_mean_3, rolling_mean_7, month, dayofyear, season] print(df[feature_cols].head())shift(lag)的含义是把tavg整体向下移动lag行新列的第一行因为前面没有历史数据而变成NaN这就是为什么最后必须dropna。滞后天数的选择要贴合气温的自然周期逐日数据取1、2、3、7比较稳lag1和lag2刻画短时惯性lag7呼应一周左右的天气过程周期。如果你拿到的是逐小时数据思路要换成lag 24、lag 48和lag 168同时加上hour列因为日内温度曲线有明显的昼夜节律。season的计算比较trick实际写论文时建议改成更直白的if-else映射答辩时一条条说得清楚比代码简洁更重要。除了这些基础特征气压和湿度的时间变化量也很值得加比如pressure_change_24h气压24小时变化冷空气过境前气压会剧烈上升这个特征对捕捉温度突变非常有效而且它不需要预测当天数据——前一天的数值在预报时刻就能拿到。特征不是越多越好每加一个特征都要确认它在预报时刻确实已知否则就是变相泄漏未来信息。3.3 时序数据划分为什么气温预测不能随机切分这是气温预测项目里最容易翻车的地方我几乎每年都要给来问的人解释一遍。普通机器学习任务用train_test_split(test_size0.2, random_state42)随机拆数据完全没问题因为样本之间独立同分布。但气温序列完全不同——7月15日的温度天然和7月14日、7月16日高度相关随机切分意味着训练集里会混入时间上晚于测试集的数据模型相当于提前看到了未来的天气走势测试集分数虚高得一塌糊涂真到了上线阶段立刻露馅。这个概念在气象领域叫数据泄漏也是答辩老师最爱追问的点之一。正确做法是按时间顺序硬切前面的80%做训练最后面的20%做测试严格保证测试集所有样本的时间都在训练集之后。如果你想让验证更严谨用TimeSeriesSplit做滚动交叉验证from sklearn.model_selection import TimeSeriesSplit cut int(len(df) * 0.85) X_train, X_test df.iloc[:cut][feature_cols], df.iloc[cut:][feature_cols] y_train, y_test df.iloc[:cut][tavg], df.iloc[cut:][tavg] tscv TimeSeriesSplit(n_splits3) for train_idx, val_idx in tscv.split(X_train): print(f训练 {train_idx.min()}~{train_idx.max()}, 验证 {val_idx.min()}~{val_idx.max()})TimeSeriesSplit的机制是第一次用前半段做训练、紧跟的下一段做验证第二次把训练段扩展进来再往后验证逐段推进。注意它的特点不只是不乱序而是严格保证验证段永远排在训练段之后这才符合时间序列外推的真实语义。我在前面代码里保留了它打印出来的切分索引你跑一次就能直观看到每次验证集都在不断向未来推移。还有一个概念需要分清预测当天的温度用当天的气压湿度特征和提前一天预报温度用截至昨天的特征是两个任务。如果你做的是后者所有特征列都要整体向后平移一天让第t天的特征只包含第t-1天及之前的信息。注意笔记里说的预测如果指的是提前24小时的预报务必把所有特征整体滞后一天。用当天实测湿度预测当天气温只是拟合练习不是预报论文里把这个词用对能避免答辩时被追问到尴尬。4. 基于sklearn的随机森林回归实现从训练到参数调整代码写的顺序其实也是项目推进的顺序先跑通最小模型再理解参数最后用网格搜索把调参自动化。4.1 最小可运行代码训练、预测、评估一条龙环境上先交代一句pip install scikit-learn pandas matplotlib安装sklearn时注意版本1.4以后建议直接用root_mean_squared_error老代码里用squaredFalse拿RMSE的写法在新版本里会告警。下面是最小可运行版本数据来自第3章的dffrom sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, root_mean_squared_error, r2_score # 固定随机种子保证实验可复现n_jobs-1 使用全部CPU核 model RandomForestRegressor( n_estimators100, max_depth12, min_samples_leaf4, random_state42, n_jobs-1 ) model.fit(X_train, y_train) y_pred model.predict(X_test) mae mean_absolute_error(y_test, y_pred) rmse root_mean_squared_error(y_test, y_pred) r2 r2_score(y_test, y_pred) print(fMAE{mae:.2f}°C RMSE{rmse:.2f}°C R²{r2:.4f})参数含义后面一节专门讲先把评估指标说清。MAE的单位直接就是摄氏度业务上最直观它的含义是平均每个样本预测值与真实值差多少度逐日平均气温的MAE在1.01.5度之间算相当不错超过2度说明特征或数据有问题。RMSE对个别的大误差惩罚更重平方后求平均再开方如果MAE不大但RMSE明显偏大说明模型偶尔会给出离得很远的预测常见诱因是极端天气样本。R²表示模型解释了多少方差气温这类有强季节周期的序列R²超过0.9很常见——但这不代表模型捕捉到了什么复杂的天气机制它只是把夏天热冬天冷学明白了真正考验在滞后特征和极端事件上。4.2 随机森林回归的4个必调参数不是越多越好随机森林回归参数很多但气温预测这种表格任务真正值得动的只有4个其余保持默认。给一张参考表参数作用经验值调节方向n_estimators树的数量100200越大方差越小但超过200后收益趋零max_depth树的最大深度1015过拟合训练集远好于测试集时调小min_samples_leaf叶节点最少样本数24越大越平滑抑制过拟合效果明显max_features每棵树的候选特征数特征少于15用None特征多时改用sqrt或默认1/3n_estimators按我的经验100到200就够用。你可以做一个递增实验分别用50、100、200、400棵树跑一遍画出测试集MAE随树数量的曲线几乎一定是先快速下降然后趋于水平。气温预测特征少、样本量中等几百棵树之后方差就收敛到噪声水平了继续加只烧CPU。max_depth和min_samples_leaf是控制过拟合的两大主力如果发现训练集R²是0.98而测试集只有0.85优先把max_depth从默认的None完全不限制降到12左右把min_samples_leaf从1提到4这两个动作往往立竿见影。max_features反而容易被忽视。当特征总数小于15时我建议让每次分裂看全部特征max_featuresNone因为特征本来就不多再随机丢弃纯属损失信息特征经过膨胀超过30个之后再用sqrt或默认的1/3让树之间差异变大。另外bootstrap默认是True不要关掉——关掉后所有树都看全量数据树之间高度相似集成效果名存实亡。训练时顺手把oob_scoreTrue打开多一个参考指标没坏处。4.3 用网格搜索找参数告别手动试参的玄学手动调参容易陷入玄学试了十几个组合最后全凭感觉挑一个。正确做法是让代码替你搜。GridSearchCV会用参数网格里的每个组合做交叉验证选出评分最高的一组但气温预测用的时候有两个坑要绕开。第一个坑是GridSearchCV默认的cv5用的是K折随机切分对时序数据等同于泄漏未来必须显式传入TimeSeriesSplit。第二个坑是交叉验证折数越多程序越慢随机森林百棵树配合几折循环可能跑出十分钟起步的漫长等待建议先用小网格验证流程再放宽。from sklearn.model_selection import GridSearchCV, TimeSeriesSplit param_grid { n_estimators: [100, 200], max_depth: [8, 10, 12], min_samples_leaf: [2, 4, 6] } grid GridSearchCV( RandomForestRegressor(random_state42, n_jobs-1), param_grid, cvTimeSeriesSplit(n_splits3), scoringneg_root_mean_squared_error ) grid.fit(X_train, y_train) print(grid.best_params_) print(-grid.best_score_)这段代码里scoringneg_root_mean_squared_error表示交叉验证以RMSE作为评分标准sklearn的惯例是分数越大越好所以负RMSE取最大值等价于RMSE取最小值最后打印时取负号就是真实RMSE。TimeSeriesSplit(n_splits3)意味着每次用前2/3训练、后1/3验证如果你的数据只有三年验证集可能只覆盖一个完整年度周期结果有偶然性——稳妥做法是用grid.best_params_在全量训练集上重训一次再用最后一个测试段评估。训练完之后强烈建议画一张预测值和真实值的对比曲线这张图既是交给导师看的主要效果图也是自查模型行为的最直观手段import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.figure(figsize(12, 5)) plt.plot(y_test.index, y_test.values, label真实气温, linewidth1.2) plt.plot(y_test.index, y_pred, label随机森林预测, linewidth1.2, alpha0.8) plt.xlabel(日期) plt.ylabel(日平均气温 (°C)) plt.legend() plt.title(随机森林回归气温预测效果对比) plt.show()画图有两个检查点。第一预测曲线是否贴合真实曲线还是整体滞后了几天——如果滞后明显说明滞后特征影响了模型的反应速度可以考虑加入气压24小时变化量。第二误差是否季节性分布冬天冷空气过境时气温骤降模型容易慢半拍夏天相对平稳误差就小。如果发现某一段系统性偏高或偏低建议用model.feature_importances_看模型主要依据哪些特征再回查原始数据那段时间是否有缺测被错误插值。5. 随机森林气温预测避坑指南5条血泪经验下面五条是按出现频率排序的真实踩坑记录每一条我都见过不止一次。它们大多不会让程序报错而是让结果悄悄变难看属于最难排查的一类问题。5.1 训练集R²接近0.99测试集却只有0.6现象训练集上R²高达0.99看起来完美测试集上跌到0.6甚至更低。原因大概率是max_depth没限制树深到几十层每片叶子只剩一两个样本模型把训练数据的噪声连同信号一起背下来了次要原因是特征里混入了预报时刻拿不到的数据也就是泄漏。解决先把max_depth压到1015、min_samples_leaf提到4重新看测试集。如果差距依旧逐一检查特征列表预测第t天气温时凡是用到第t天实测值的特征都要整体后移一天。我见过最简单的泄漏是把当天实测最高气温当特征去预测当天平均气温训练集分数漂亮得不真实答辩老师一眼就能看穿。5.2 随机切分测试集R²有0.95滚动验证却崩了现象用train_test_split随机切分R²高达0.95按时间切分后掉到0.8甚至更低滚动预测更惨。原因随机切分把未来数据混进了训练集气温的强自相关让模型偷看到了答案属于泄漏。解决一律改成按iloc时间切分交叉验证用TimeSeriesSplit。这是气温预测里最值钱的一条避坑经验写论文时主动交代采用时间顺序划分以避免数据泄漏答辩反而会变成加分项。5.3 n_estimators从100加到1000精度纹丝不动现象听说树越多越好把n_estimators加到1000训练时间从十几秒涨到几分钟测试集指标几乎没有变化。原因气温预测特征少、样本量中等100200棵树之后方差已经收敛到噪声水平增加的树只是重复相同的信息。解决先用100棵树跑通网格搜索只试到200还想压误差的话应从特征工程入手——加气压变化量、多站点数据而不是堆树。用oob_score_也可以辅助判断袋外分数不再提升时树的数量已经够了。5.4 极端天气预测误差是平时的三倍现象寒潮、台风出现时预测温度明显偏离实测值MAE冲得很高全年平均指标却被拉低视而不见。原因训练集中极端天气样本占比太小随机森林在分裂时几乎没有为这类事件建立有效分支滞后特征又让模型严重依赖前一天温度骤降10度时惯性预测自然跟不上。解决加气压24小时变化量前一日温差这类能预告天气突变的特征把误差按月份或者按天气过程分开统计不要只报全年均值如果项目目标就是极端事件预警换个思路用分类器先识别是否极端日再分两套模型。随机森林做回归在极端值上的短板确实明显调参只能缓解不能根除。5.5 预测的最高温偏低、最低温偏高曲线被削平现象画出预测曲线发现峰值和谷值都被削掉一截整体比真实曲线平滑。原因回归树输出的是叶子均值森林再取平均这种多层平均天然把极端值拉向中间属于集成模型的结构性偏差调参只能缓解不能根除。解决做轻度的预测后校正让整体分布贴近真实from sklearn.linear_model import LinearRegression # 用训练集拟合校正关系真实值 a * 原始预测 b calib LinearRegression().fit( model.predict(X_train).reshape(-1, 1), y_train ) y_pred_calib calib.predict(model.predict(X_test).reshape(-1, 1))LinearRegression在训练集上学习原始预测值和真实值之间的线性关系之后把测试集的预测值按同一关系拉伸温和地补偿被平均掉的极值。注意校正系数要完全来自训练集不能在测试集上拟合否则又是一种泄漏。我个人的做法是只在R²已经不错、只差极值还原时做这步不做过度拟合因为它不解决根本问题只是让曲线分布好看一点。6. 让气温预测模型真正可用滚动验证与特征重要性的落点6.1 滚动预测验证测出模型在真实场景的真实水平一次性切分只验证了一个时间段的预测能力运气成分大。更接近真实使用的方式是逐年滚动用前N年训练预测下一年然后把这一年并入训练集继续往后推。实现也不复杂years sorted(df[date].dt.year.unique()) mae_list [] for year in years: trn df[df[date].dt.year year] tst df[df[date].dt.year year] if len(trn) 730 or len(tst) 60: continue m RandomForestRegressor(n_estimators200, max_depth12, min_samples_leaf4, n_jobs-1, random_state42) m.fit(trn[feature_cols], trn[tavg]) mae_list.append(mean_absolute_error(tst[tavg], m.predict(tst[feature_cols]))) print(f逐年滚动MAE: {sum(mae_list)/len(mae_list):.2f}°C)len(trn) 730是让前两年只做训练不做评测避免样本太少导致误差波动。如果逐年MAE比一次性切分的MAE高出一截说明模型对未见过年份的泛化能力一般问题多半出在特征覆盖不够而不是参数。6.2 特征重要性输出顺手拿到的答辩素材importance pd.Series(model.feature_importances_, indexfeature_cols) print(importance.sort_values(ascendingFalse).to_string())气温预测里几乎每次跑出来的前几名都是lag1、lag2、month气压和湿度排在中间风速通常在末尾。这个顺序本身就有业务含义短期靠温度惯性中期靠季节周期风速对逐日平均气温的影响权重确实较低。把这张表连同前面那张预测对比图放进论文的实验分析小节整个项目立得住。6.3 从毕设到真实项目多站点与模型对比时间充裕的话沿着三个方向扩展一是多站点特征把周边三五个站点的气压、温度作为额外输入冷空气路径对本站的影响就能体现预测误差通常再降一档二是多步预测把单日预测改成未来3天、7天的逐日输出这时滞后特征要换成用预测输出回填的策略三是算法对比用LightGBM或XGBoost跑同一份数据梯度提升树在气温上通常比随机森林再低零点几度的MAE但随机森林几乎无需调参的稳定性是实打实的优势。我一直的习惯是先把随机森林这条链路做深——数据、特征、切分、评估、避坑每个环节都能讲出细节再谈换模型、加站点。温度预测这一类题目评委看的就是数据链路是否扎实、验证是否严谨而不是模型名有多唬人。希望这些经验能帮到你少踩几个坑把毕设稳稳做完。本文还有配套的精品资源点击获取
返回列表