news 2026/6/13 1:04:53

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[深度学习]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 & 数据太少怎么办
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 1:02:53

从TiDB到Flink:聊聊RocksDB这个‘幕后功臣’在实际项目里怎么用

从TiDB到Flink&#xff1a;RocksDB在分布式系统中的实战精要第一次在TiKV的监控面板里看到RocksDB的compact操作导致写入延迟飙升时&#xff0c;我盯着那根突然拔高的曲线愣了两分钟。作为刚从MySQL转型过来的工程师&#xff0c;这种由LSM树特性引发的性能波动完全超出了我的认…

作者头像 李华
网站建设 2026/6/13 1:02:51

OpenCore Configurator:黑苹果引导配置的终极可视化工具

OpenCore Configurator&#xff1a;黑苹果引导配置的终极可视化工具 【免费下载链接】OpenCore-Configurator A configurator for the OpenCore Bootloader 项目地址: https://gitcode.com/gh_mirrors/op/OpenCore-Configurator OpenCore Configurator 是一款专为黑苹果…

作者头像 李华
网站建设 2026/6/13 0:57:07

终极指南:如何在macOS上轻松解密QQ音乐QMC格式文件

终极指南&#xff1a;如何在macOS上轻松解密QQ音乐QMC格式文件 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换…

作者头像 李华
网站建设 2026/6/13 0:51:05

5步掌握智慧职教自动化学习:告别重复点击的智能解决方案

5步掌握智慧职教自动化学习&#xff1a;告别重复点击的智能解决方案 【免费下载链接】auto-play-course 简单好用的刷课脚本[支持平台:职教云,智慧职教,资源库] 项目地址: https://gitcode.com/gh_mirrors/hc/auto-play-course 还在为繁琐的网课学习任务而烦恼吗&#x…

作者头像 李华