当前位置: 首页 > news >正文

[深度学习]Kaggle:Random Forest optimization full process Python code

以下是一个针对随机森林模型优化的完整 Kaggle 竞赛代码模板,涵盖了数据预处理、特征工程、超参数调优、模型训练与评估、以及提交文件生成的全流程。

# 导入必要的库 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, GridSearchCV, cross_val_score from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier from sklearn.metrics import mean_squared_error, accuracy_score, classification_report from sklearn.impute import SimpleImputer from sklearn.preprocessing import LabelEncoder, StandardScaler import warnings warnings.filterwarnings('ignore') # 1. 数据加载 train_data = pd.read_csv('/kaggle/input/your-competition/train.csv') test_data = pd.read_csv('/kaggle/input/your-competition/test.csv') sample_submission = pd.read_csv('/kaggle/input/your-competition/sample_submission.csv') # 2. 数据探索与预处理 print(f"训练集形状: {train_data.shape}") print(f"测试集形状: {test_data.shape}") print(f"训练集缺失值统计: {train_data.isnull().sum().sort_values(ascending=False).head(10)}") # 分离特征和目标变量(假设目标列名为'target') if 'target' in train_data.columns: y = train_data['target'] X = train_data.drop('target', axis=1) else: # 如果是分类问题,假设目标列名为'Survived'(泰坦尼克号示例) y = train_data['Survived'] X = train_data.drop('Survived', axis=1) # 3. 特征工程与预处理 def preprocess_features(df): """特征预处理函数""" df_processed = df.copy() # 处理缺失值:数值型用中位数填充,类别型用众数填充 numeric_cols = df_processed.select_dtypes(include=[np.number]).columns categorical_cols = df_processed.select_dtypes(include=['object']).columns # 数值型特征填充 if len(numeric_cols) > 0: num_imputer = SimpleImputer(strategy='median') df_processed[numeric_cols] = num_imputer.fit_transform(df_processed[numeric_cols]) # 类别型特征编码 if len(categorical_cols) > 0: for col in categorical_cols: le = LabelEncoder() # 处理训练集中未见过的类别 df_processed[col] = df_processed[col].astype(str) df_processed[col] = le.fit_transform(df_processed[col]) return df_processed # 应用预处理 X_processed = preprocess_features(X) test_processed = preprocess_features(test_data) # 4. 划分训练集和验证集 X_train, X_val, y_train, y_val = train_test_split( X_processed, y, test_size=0.2, random_state=42, stratify=y if y.nunique() < 10 else None ) # 5. 基础随机森林模型训练 print(" === 基础模型训练 ===") base_model = RandomForestRegressor(n_estimators=100, random_state=42) # 回归问题 # 如果是分类问题,使用:RandomForestClassifier(n_estimators=100, random_state=42) base_model.fit(X_train, y_train) # 基础模型评估 if hasattr(base_model, 'predict_proba'): # 分类问题 base_val_preds = base_model.predict(X_val) base_accuracy = accuracy_score(y_val, base_val_preds) print(f"基础模型验证集准确率: {base_accuracy:.4f}") print("分类报告:") print(classification_report(y_val, base_val_preds)) else: # 回归问题 base_val_preds = base_model.predict(X_val) base_rmse = np.sqrt(mean_squared_error(y_val, base_val_preds)) print(f"基础模型验证集RMSE: {base_rmse:.4f}") # 6. 特征重要性分析 print(" === 特征重要性分析 ===") feature_importances = pd.DataFrame({ 'feature': X_train.columns, 'importance': base_model.feature_importances_ }).sort_values('importance', ascending=False) print("Top 10重要特征:") print(feature_importances.head(10)) # 选择重要性大于阈值的特征 importance_threshold = 0.005 # 根据实际情况调整 selected_features = feature_importances[feature_importances['importance'] > importance_threshold]['feature'].tolist() print(f" 筛选后特征数量: {len(selected_features)} / {len(X_train.columns)}") X_train_selected = X_train[selected_features] X_val_selected = X_val[selected_features] test_selected = test_processed[selected_features] # 7. 超参数调优(核心优化步骤) print(" === 超参数调优 ===") # 定义参数网格 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'], # 寻找最佳分割时考虑的特征数 'bootstrap': [True, False] # 是否使用bootstrap采样 } # 初始化模型 rf = RandomForestRegressor(random_state=42, n_jobs=-1) # 回归问题 # 如果是分类问题,使用:RandomForestClassifier(random_state=42, n_jobs=-1) # 使用网格搜索进行调优 grid_search = GridSearchCV( estimator=rf, param_grid=param_grid, cv=5, # 5折交叉验证 scoring='neg_mean_squared_error' if hasattr(rf, 'predict') else 'accuracy', n_jobs=-1, verbose=1 ) print("开始网格搜索调参...") grid_search.fit(X_train_selected, y_train) print(f" 最佳参数组合: {grid_search.best_params_}") print(f"最佳交叉验证分数: {grid_search.best_score_:.4f}") # 8. 使用最优参数重新训练模型 print(" === 使用最优参数训练最终模型 ===") best_model = grid_search.best_estimator_ # 在整个训练集上重新训练(使用筛选后的特征) best_model.fit(pd.concat([X_train_selected, X_val_selected]), pd.concat([y_train, y_val])) # 9. 生成测试集预测 print(" === 生成测试集预测 ===") test_preds = best_model.predict(test_selected) # 10. 创建提交文件 submission = sample_submission.copy() if 'target' in submission.columns: submission['target'] = test_preds elif 'Survived' in submission.columns: # 泰坦尼克号示例 submission['Survived'] = test_preds.astype(int) else: # 根据实际情况调整列名 submission.iloc[:, 1] = test_preds # 保存提交文件 submission_file = 'submission_optimized.csv' submission.to_csv(submission_file, index=False) print(f"提交文件已保存: {submission_file}") print(f"预测值统计: 均值={test_preds.mean():.4f}, 标准差={test_preds.std():.4f}") # 11. 模型性能对比 print(" === 模型性能对比 ===") print("| 模型类型 | 验证集分数 | 特征数量 |") print("|----------|------------|----------|") if hasattr(base_model, 'predict_proba'): base_score = accuracy_score(y_val, base_val_preds) optimized_val_preds = best_model.predict(X_val_selected) optimized_score = accuracy_score(y_val, optimized_val_preds) print(f"| 基础模型 | {base_score:.4f} | {X_train.shape[1]} |") print(f"| 优化模型 | {optimized_score:.4f} | {X_train_selected.shape[1]} |") print(f"| 提升幅度 | +{(optimized_score - base_score)*100:.2f}% | - |") else: base_score = np.sqrt(mean_squared_error(y_val, base_val_preds)) optimized_val_preds = best_model.predict(X_val_selected) optimized_score = np.sqrt(mean_squared_error(y_val, optimized_val_preds)) print(f"| 基础模型 | RMSE={base_score:.4f} | {X_train.shape[1]} |") print(f"| 优化模型 | RMSE={optimized_score:.4f} | {X_train_selected.shape[1]} |") print(f"| 提升幅度 | -{(base_score - optimized_score)/base_score*100:.2f}% | - |")

关键优化步骤说明:

优化步骤实现方法优化效果
数据预处理自动处理缺失值(数值型用中位数,类别型用众数)提高数据质量,减少噪声影响
特征工程自动编码类别特征,特征重要性筛选降低维度,保留关键特征,提升模型效率
参数调优网格搜索(GridSearchCV)寻找最优参数组合系统性地找到最佳超参数,提升模型性能
交叉验证5折交叉验证评估模型稳定性避免过拟合,确保模型泛化能力
特征选择基于重要性阈值筛选特征简化模型,减少过拟合风险,提升训练速度

使用说明:

  1. 数据适配:根据具体竞赛数据调整目标变量列名(如'target''Survived'
  2. 问题类型:代码自动适配回归或分类问题,根据目标变量类型选择相应模型
  3. 参数调整:可根据计算资源调整param_grid中的参数范围和GridSearchCVcv
  4. 特征筛选:通过调整importance_threshold控制特征选择严格度
  5. 提交格式:确保sample_submission的列名与竞赛要求一致

此代码模板提供了从数据加载到提交的完整流程,重点突出了随机森林优化的核心步骤,包括特征重要性分析和系统性的超参数调优。


参考来源

  • 【Ryo】Python:随机森林及参数优化——基于Kaggle的实战详解
  • kaggle(一):随机森林与泰坦尼克
  • 实用 Kaggle 竞赛之 随机森林 Random Forest 的评估及调参
  • 随机森林及应用
  • 实用 Kaggle 随机森林 - 如何处理 nan & 数据太少怎么办
http://www.jsqmd.com/news/1002157/

相关文章:

  • 如何解决B站视频下载难题:DownKyi免安装版全攻略
  • 3个关键功能,让Snap Hutao成为你原神冒险的最佳伙伴
  • GD32F30x看门狗配置避坑指南:独立看门狗和窗口看门狗到底怎么选?
  • 失业保险金
  • Milvus 向量检索服务 + SpringBoot 实战:电商商品语义检索与相似商品推荐
  • 2026年研磨液实力厂家:广东金刚石粗磨精磨研磨液与镜面抛光液生产商深度解析 - 品牌发掘
  • 从冷却塔到核电站:双曲面与旋转曲面在工程中的神奇应用与数学原理
  • MyBatis-Plus的Wrappers.lambdaQuery(),你真的用对了吗?盘点那些容易被忽略的‘坑’和高级用法
  • 2026年成都四害消杀市场格局分析:从灭鼠到白蚁防治的行业实测与趋势解读 - 优质品牌商家
  • 从Flask到Scrapy:盘点那些用Python Hook提升开发效率的真实场景与避坑指南
  • stm32使用Jlink进行GDB脚本调试
  • 洞察2026年6月模具温控系统市场:五家评价高的制造厂深度解析 - 品牌鉴赏官2026
  • 3大技术突破:MMD Tools如何打通Blender与MikuMikuDance的次元壁
  • 永城奔驰宝马奥迪保养多少钱?真实花费指南 - 品牌排行榜
  • 下雨天再也不用狂奔回家收衣服:30元DIY一个智能晾晒助手
  • Unity URP 法线贴图如何生成 用什么工具创建
  • 流体智能体强化学习:动态群体协作的新范式
  • 3分钟上手:英雄联盟玩家的智能游戏助手完全指南
  • MC9S08GT系列8位MCU:低功耗架构与丰富外设的嵌入式经典设计解析
  • AI 驱动的会议效率提升:从语音转写到行动项提取的工程实践
  • Zotero GPT终极指南:如何用AI智能插件5分钟打造高效文献助手
  • 2026年上海松江区权威金条回收+银条回收机构推荐:称重准 报价实 - 沪上贵金属口碑推荐官
  • 5分钟解决日文游戏乱码:Locale-Emulator终极配置指南
  • 儿童增高床垫品牌哪家好?自己用过才敢说 - 深圳市民HLL
  • Kemono下载器:Windows平台终极批量下载解决方案
  • 56800TDC开发套件实战指南:从硬件安装到CodeWarrior环境搭建
  • 上海嘉定区金条回收别乱找!2026公认靠谱的机构都在这 - 沪上贵金属口碑推荐官
  • 【毕业设计】基于 SpringBoot 的个性化旅游行程规划系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 68HC908LJ12深度解析:8位MCU的Flash管理与低功耗设计实战
  • 嵌入式安全实践:基于IEC 60730标准的MCU硬件特性与软件自检设计