当前位置:首页>python>Python | 驱动因素分析VIF + RF + PDP

Python | 驱动因素分析VIF + RF + PDP

  • 2026-10-11 08:19:07
Python | 驱动因素分析VIF + RF + PDP

一、数据准备

二、相关性矩阵

变量间相关性整体中等,无强共线性。

三、VIF

所有变量VIF均低于5,可同时进入模型。

四、随机森林重要性

SM、PRE贡献最高,TMP次之。

五、PDP解释机制

SM和PRE呈阈值型上升,TMP呈倒U型,VPD为负效应。

六、代码

import osimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.model_selection import train_test_splitfrom sklearn.inspection import PartialDependenceDisplayfrom statsmodels.stats.outliers_influence import variance_inflation_factorout_dir = r"C:\Users\Ayu\Pictures\结果"os.makedirs(out_dir, exist_ok=True)df = pd.read_csv(r"C:\Users\Ayu\Pictures\数据.csv")y = df["RSEI"]X = df.drop(columns=["RSEI"])plt.figure(figsize=(8,6))sns.heatmap(X.corr(), cmap="coolwarm", annot=True, fmt=".2f")plt.title("Correlation Matrix")plt.tight_layout()plt.savefig(os.path.join(out_dir, "correlation.jpg"), dpi=300)plt.close()X_vif = X.copy()X_vif["intercept"] = 1vif = pd.DataFrame()vif["Variable"] = X.columnsvif["VIF"] = [variance_inflation_factor(X_vif.values, i) for i in range(len(X.columns))]plt.figure(figsize=(8,5))sns.barplot(data=vif, x="VIF", y="Variable")plt.axvline(5, linestyle="--")plt.title("VIF")plt.tight_layout()plt.savefig(os.path.join(out_dir, "vif.jpg"), dpi=300)plt.close()X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)rf = RandomForestRegressor(n_estimators=500, random_state=42)rf.fit(X_train, y_train)imp = pd.DataFrame({ "Variable": X.columns, "Importance": rf.feature_importances_}).sort_values(by="Importance", ascending=False)plt.figure(figsize=(8,5))sns.barplot(data=imp, x="Importance", y="Variable")plt.title("Random Forest Importance")plt.tight_layout()plt.savefig(os.path.join(out_dir, "rf_importance.jpg"), dpi=300)plt.close()top_vars = imp["Variable"].iloc[:6].tolist()fig, ax = plt.subplots(figsize=(10,8))PartialDependenceDisplay.from_estimator(rf, X, features=top_vars, grid_resolution=50, ax=ax)plt.tight_layout()plt.savefig(os.path.join(out_dir, "pdp.jpg"), dpi=300)plt.close()

七

各位同学在做驱动因素分析的时候,变量可以适当多选一些,不一定只局限于气候因子,比如土地利用、人口密度、GDP、夜间灯光、土壤类型、蒸散发、干旱指数这些都可以往里加一加;图也可以稍微花点心思优化一下,比如统一一下字体、调一调配色、把子图排版整理得更清爽一点,这样不管是写论文还是做汇报都会更加加分。另外,如果想把分析再往深一点做,除了RF和PDP,也可以尝试XGBoost、地理探测器、SHAP、SEM或者GWR这些方法,从不同角度去看变量的作用,比如贡献大小、空间差异或者作用路径,整体会更完整一些。

最新文章

随机文章