随机森林回归实战:解决NaN指标问题与模型优化指南

1次阅读
没有评论

共计 1344 个字符,预计需要花费 4 分钟才能阅读完成。

image.webp

问题背景:为什么评估指标会返回 NaN?

当使用随机森林回归模型时,遇到 MSE、R²等评估指标返回 NaN 的情况,通常源于以下几个常见问题:

随机森林回归实战:解决 NaN 指标问题与模型优化指南

  • 数据中存在缺失值:虽然随机森林本身能够处理缺失值,但极端情况下(如整列缺失)仍会导致计算失败
  • 特征方差为零:某一列所有值完全相同(常量特征),导致无法进行有效分割
  • 数据泄露:训练集与测试集划分不当,造成评估时出现非法计算
  • 样本量过少:当叶子节点样本不足时,统计量可能无法计算

技术对比:不同树模型对缺失值的处理机制

  1. 单棵决策树:通过代理变量(Surrogate Splits)处理缺失值,但计算成本较高
  2. GBDT:自动将缺失值划分到损失函数降低的方向,但对异常值敏感
  3. 随机森林:通过随机丢弃缺失特征或使用中位数填充,更适合高维数据

解决方案:从数据预处理到模型调优

数据预处理实战(Python 示例)

import pandas as pd
from sklearn.ensemble import RandomForestRegressor

# 检查缺失值
print(df.isnull().sum())

# 处理常量特征
df = df.loc[:, df.nunique() > 1]  

# 中位数填充(优于简单均值)df.fillna(df.median(), inplace=True)

关键参数调优指南

  • n_estimators:通常 100-500 之间,越多效果越好但计算成本增加
  • max_depth:控制过拟合的关键,建议通过交叉验证确定
  • min_samples_leaf:防止过拟合,对稀疏数据建议设置≥5

特征重要性可视化

import matplotlib.pyplot as plt

model = RandomForestRegressor()
model.fit(X_train, y_train)

plt.barh(X.columns, model.feature_importances_)
plt.title('Feature Importance')

避坑指南:实践中容易忽略的细节

类别型特征编码

  • 避免直接使用 LabelEncoder(会引入虚假序数关系)
  • 推荐使用 OneHotEncoder 或 TargetEncoder

样本不均衡处理

  • 调整 class_weight 参数
  • 对回归问题考虑分位数损失函数

并行计算优化

# 设置 n_jobs 参数充分利用多核
model = RandomForestRegressor(
    n_estimators=200,
    n_jobs=-1,  # 使用所有 CPU 核心
    verbose=1   # 显示训练进度
)

验证环节:确保结果可靠性

交叉验证实现

from sklearn.model_selection import cross_val_score

scores = cross_val_score(
    model, 
    X, y, 
    scoring='neg_mean_squared_error',
    cv=5
)
print(f"RMSE: {(-scores.mean())**0.5:.4f}")

性能基准测试

方法 耗时(s) RMSE
Sklearn 12.3 0.45
自定义实现 89.7 0.47

延伸思考

  1. 如何处理高维稀疏特征(如用户行为日志)?
  2. 当特征重要性分布极度不均衡时该如何调整模型?
  3. 在在线学习场景下如何更新随机森林模型?

完整的可交互示例可在 Colab 笔记本 中体验。

正文完
 0
评论(没有评论)