欢迎光临
我们一直在努力

[深度学习*]Kaggle:Three-Step Approach to Random Forest Optimization

💎个人主页:星柚程

🚀精选文章:《MATLAB多目标优化》,《Kaggle:CV、Public LB 》、《我的第一次 Kaggle》、《C++构造传参》、《蛇形机械臂的模拟退火优化》

🛠️专栏建设:|深度学习|、|Python量化|、|C++学习|、|数据结构|

🎯流水不争先,争得是涛涛不绝。

随机森林效果不佳时,可从数据、模型、特征三个层面进行系统性优化。核心优化路径如下表所示:

优化层面具体方法关键说明
数据层面 处理缺失值与异常值 采用中位数/众数填充、插值或模型预测,使用IQR、3σ原则识别异常值。
  处理类别不平衡 对多数类进行下采样或对少数类进行过采样(如SMOTE)。
  特征标准化/归一化 对基于距离的模型有益,随机森林本身不必须,但可提升稳定性。
特征层面 特征工程与选择 创建交互特征、多项式特征;利用随机森林的feature_importances_筛选重要性高的特征。
  降维处理 对高维稀疏特征使用PCA等降维,减少噪声与计算量。
模型层面 超参数调优 最关键的优化步骤,使用网格搜索、随机搜索或贝叶斯优化寻找最优参数组合。
  增加基学习器数量 增加n_estimators(如从100增至300或500),通常能提升效果,但会增大计算开销。
  控制树的结构与复杂度 调整max_depth(防止过拟合)、min_samples_split、min_samples_leaf等。
  调整随机性参数 调整max_features(每棵树使用的最大特征数),这是随机性的主要来源之一。
  使用交叉验证 使用cross_val_score评估模型稳定性,避免单次划分的偶然性。
  尝试其他集成算法 可升级至梯度提升树(如XGBoost、LightGBM)或 stacking 等更高级的集成方法。

1. 核心优化:超参数调优

使用 GridSearchCV 或 RandomizedSearchCV 进行自动化调参是最有效的方法之一。

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
import numpy as np

# 定义参数网格
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [10, 20, 30, None],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4],
'max_features': ['sqrt', 'log2', 0.8] # 调整特征随机性
}

# 初始化模型
rf = RandomForestRegressor(random_state=42)

# 使用网格搜索(计算量大但更彻底)
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid,
cv=5, scoring='neg_mean_squared_error', n_jobs=-1, verbose=1)
grid_search.fit(X_train, y_train)

print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳交叉验证分数: {-grid_search.best_score_:.4f}")

# 使用最佳模型进行预测
best_rf = grid_search.best_estimator_

对于参数空间较大时,推荐使用计算效率更高的 RandomizedSearchCV。

2. 特征工程与选择

利用模型训练后的特征重要性进行筛选,可以简化模型并提升泛化能力。

import matplotlib.pyplot as plt

# 训练一个基础随机森林模型
base_rf = RandomForestRegressor(n_estimators=100, random_state=42)
base_rf.fit(X_train, y_train)

# 获取特征重要性
importances = base_rf.feature_importances_
feature_names = X_train.columns
indices = np.argsort(importances)[::-1] # 按重要性降序排列

# 可视化前N个重要特征
top_n = 20
plt.figure(figsize=(10, 6))
plt.title(f"Top {top_n} Feature Importances")
plt.bar(range(top_n), importances[indices[:top_n]])
plt.xticks(range(top_n), feature_names[indices[:top_n]], rotation=90)
plt.tight_layout()
plt.show()

# 选择重要性高于阈值的特征
threshold = 0.01 # 根据实际情况调整阈值
selected_features = feature_names[importances > threshold]
X_train_selected = X_train[selected_features]
X_val_selected = X_val[selected_features]

# 使用筛选后的特征重新训练调优后的模型
best_rf.fit(X_train_selected, y_train)

3. 处理数据不平衡问题

对于分类任务,若数据类别不平衡,需进行专门处理。

from imblearn.under_sampling import RandomUnderSampler
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import Pipeline

# 方法一:下采样(适用于数据量足够大的情况)
undersampler = RandomUnderSampler(random_state=42)
X_train_resampled, y_train_resampled = undersampler.fit_resample(X_train, y_train)

# 方法二:过采样(使用SMOTE合成少数类样本)
smote = SMOTE(random_state=42)
X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)

# 将重采样与模型训练结合成流水线
pipeline = Pipeline([
('sampler', SMOTE(random_state=42)),
('classifier', RandomForestClassifier(random_state=42))
])

4. 使用更高级的优化算法

对于超参数调优,可以尝试贝叶斯优化等更智能的算法,以更少的迭代次数找到更优解。

from skopt import BayesSearchCV
from skopt.space import Integer, Categorical, Real

# 定义贝叶斯优化的搜索空间
search_spaces = {
'n_estimators': Integer(100, 500),
'max_depth': Integer(5, 50),
'min_samples_split': Integer(2, 20),
'min_samples_leaf': Integer(1, 10),
'max_features': Categorical(['sqrt', 'log2', 0.6, 0.8])
}

# 执行贝叶斯优化搜索
bayes_search = BayesSearchCV(
estimator=RandomForestRegressor(random_state=42),
search_spaces=search_spaces,
n_iter=50, # 迭代次数
cv=5,
scoring='neg_mean_squared_error',
random_state=42,
n_jobs=-1,
verbose=1
)
bayes_search.fit(X_train, y_train)
print(f"贝叶斯优化最佳参数: {bayes_search.best_params_}")

优化建议流程:首先检查并处理数据质量问题(缺失、异常、不平衡),然后进行基础的特征工程。在此基础上,使用交叉验证配合随机搜索或贝叶斯优化进行超参数调优。调优后,可分析特征重要性进行二次特征筛选,最后用最优参数和特征重新训练模型。若效果仍不理想,可考虑更换为梯度提升树等更强大的算法。


参考来源

  • 随机森林算法及贝叶斯优化调参Python实践
  • sklearn实战之随机森林
  • 随机森林参数选择
  • 随机森林(RFC)实现模型优化与特征提取
  • 随机森林+不平衡处理+遗传算法优化

 

 

赞(0)
未经允许不得转载:171主机测评 » [深度学习*]Kaggle:Three-Step Approach to Random Forest Optimization
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址