news 2026/6/13 2:13:04

[深度学习]KagglePreprocessing actually: led to a decrease in scores,ErrorExitStandard

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[深度学习]KagglePreprocessing actually: led to a decrease in scores,ErrorExitStandard

遇到的“预处理后效果反而下降”和“更换更强模型(XGBoost)后效果更差”是Kaggle泰坦尼克号竞赛中非常典型的现象。这通常不是模型或预处理本身的问题,而是数据处理、特征工程或模型调参不当导致的。根据您提供的数据(RF: 0.77 -> 0.76, XGBoost: 0.71),核心问题很可能出在以下几个方面:

问题根因分析与优化路径

现象可能原因诊断与解决方案
随机森林预处理后分数下降 (0.77 -> 0.76)1.信息丢失或引入噪声:不恰当的缺失值填充(如用均值/中位数填充Age)或编码方式破坏了原始数据的分布或关联性。
2.特征缩放副作用:对数值特征(如Fare)进行了标准化/归一化。树模型(RF、XGBoost)不受特征尺度影响,缩放可能因浮点精度问题引入微小扰动,反而有害无益。
3.数据泄露:预处理时使用了全数据集(包含测试集)的统计量(如全局均值)来填充训练集,导致评估时分数虚高,在严格划分的验证集上表现下降。
诊断:检查预处理步骤,尤其是缺失值填充和编码逻辑。对比预处理前后特征的数据分布(如Age的直方图)。
解决
1. 对Age的缺失值,尝试使用更智能的填充(如基于PclassTitle的中位数)而非简单全局中位数。
2.为树模型移除所有特征缩放步骤
3. 确保所有预处理器(如SimpleImputer,LabelEncoder)都仅在训练集上拟合,再转换验证集和测试集,避免数据泄露。
XGBoost表现更差 (0.71)1.默认参数不适用:XGBoost对超参数(如learning_rate,max_depth,subsample)非常敏感,使用默认参数在未调优的小数据集上极易过拟合或欠拟合。
2.数据格式问题:输入数据包含非数值特征或缺失值,XGBoost无法直接处理,而随机森林对此容忍度更高。
3.未进行特征选择:XGBoost虽然自带特征重要性,但初始训练时若特征过多或噪声大,默认参数下可能无法有效学习。
诊断:观察XGBoost在训练集和验证集上的表现差异。若训练集准确率远高于验证集,则是过拟合。
解决
1.必须进行超参数调优。使用网格搜索或随机搜索,至少调整learning_raten_estimatorsmax_depth
2. 确保所有输入特征均为数值型,并正确处理缺失值(XGBoost可自动处理,但显式处理更可控)。
3. 可先使用随机森林的特征重要性结果,筛选出重要特征后再喂给XGBoost训练。

核心优化代码示例

以下代码段展示了针对上述问题的关键优化步骤,包括正确的预处理流程随机森林特征筛选XGBoost基础调优

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score from xgboost import XGBClassifier from sklearn.preprocessing import LabelEncoder # 1. 数据加载与基础预处理(避免数据泄露的示范) train_df = pd.read_csv('train.csv') test_df = pd.read_csv('test.csv') # 合并以便于统一处理,但需标记来源 train_df['IsTrain'] = True test_df['IsTrain'] = False combined = pd.concat([train_df, test_df], ignore_index=True) # 2. 智能特征工程(以Age为例) # 从姓名中提取称呼(Title),作为填充Age的依据 combined['Title'] = combined['Name'].apply(lambda x: x.split(',')[1].split('.')[0].strip()) # 将罕见的称呼归为‘Rare’ combined['Title'] = combined['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare') combined['Title'] = combined['Title'].replace('Mlle', 'Miss') combined['Title'] = combined['Title'].replace('Ms', 'Miss') combined['Title'] = combined['Title'].replace('Mme', 'Mrs') # 按Title和Pclass分组填充Age的缺失值 combined['Age'] = combined.groupby(['Title', 'Pclass'])['Age'].transform(lambda x: x.fillna(x.median())) # 对类别特征进行标签编码(在拆分前进行是安全的,因为是无状态转换) le = LabelEncoder() categorical_cols = ['Sex', 'Embarked', 'Title'] for col in categorical_cols: combined[col] = le.fit_transform(combined[col].astype(str)) # 3. 重新拆分训练集和测试集(关键:避免泄露) train_processed = combined[combined['IsTrain'] == True].drop('IsTrain', axis=1) test_processed = combined[combined['IsTrain'] == False].drop('IsTrain', axis=1) y = train_processed['Survived'] X = train_processed.drop(['PassengerId', 'Survived', 'Name', 'Ticket', 'Cabin'], axis=1) # 移除高基数或缺失严重的特征 # 划分训练集和验证集 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) # 4. 使用随机森林进行特征筛选 print("=== 随机森林特征重要性筛选 ===") rf_for_feature = RandomForestClassifier(n_estimators=100, random_state=42) rf_for_feature.fit(X_train, y_train) importances = pd.DataFrame({'feature': X_train.columns, 'importance': rf_for_feature.feature_importances_}) importances = importances.sort_values('importance', ascending=False) print(importances) # 选择重要性大于阈值的特征 selected_features = importances[importances['importance'] > 0.02]['feature'].tolist() X_train_sel = X_train[selected_features] X_val_sel = X_val[selected_features] # 5. 在筛选后的特征上优化随机森林 print(" === 优化随机森林 ===") rf = RandomForestClassifier(random_state=42) param_grid_rf = { 'n_estimators': [100, 200], 'max_depth': [5, 10, None], 'min_samples_split': [2, 5] } grid_rf = GridSearchCV(rf, param_grid_rf, cv=5, scoring='accuracy') grid_rf.fit(X_train_sel, y_train) best_rf = grid_rf.best_estimator_ val_pred_rf = best_rf.predict(X_val_sel) print(f"优化后随机森林验证集准确率: {accuracy_score(y_val, val_pred_rf):.4f}") print(f"最佳参数: {grid_rf.best_params_}") # 6. 在筛选后的特征上优化XGBoost(关键步骤) print(" === 优化XGBoost ===") xgb = XGBClassifier(random_state=42, use_label_encoder=False, eval_metric='logloss') # 基础调优参数网格 param_grid_xgb = { 'learning_rate': [0.01, 0.1], # 降低学习率防止过拟合 'n_estimators': [100, 200], 'max_depth': [3, 5], # 限制树深防止过拟合 'subsample': [0.8, 1.0] # 行采样 } grid_xgb = GridSearchCV(xgb, param_grid_xgb, cv=5, scoring='accuracy') grid_xgb.fit(X_train_sel, y_train) best_xgb = grid_xgb.best_estimator_ val_pred_xgb = best_xgb.predict(X_val_sel) print(f"优化后XGBoost验证集准确率: {accuracy_score(y_val, val_pred_xgb):.4f}") print(f"最佳参数: {grid_xgb.best_params_}")

总结与行动建议

  1. 停止无效预处理:立即移除对树模型无益且可能有害的特征缩放步骤。
  2. 检查数据泄露:确保所有预处理器的fit方法只作用于训练数据,再用transform方法转换验证集和测试集。
  3. 优先进行特征工程:像处理Age缺失值那样,进行基于业务逻辑的智能填充和特征构建(如从Name提取Title,从SibSpParch构建FamilySize等),这比复杂的模型切换更有效。
  4. 必须调参:尤其是对于XGBoost,不经调参直接使用默认参数很难得到好结果。至少调整learning_ratemax_depthn_estimators
  5. 模型融合:在单个模型优化到瓶颈后,可以考虑将优化后的随机森林、XGBoost甚至逻辑回归的结果进行投票或堆叠(Stacking),这往往是Kaggle比赛中进一步提升分数的关键。

参考来源

  • 30:再犯概率预测:逻辑回归与随机森林机器学习训练-CSDN博客
  • 生存预测 : kaggle titanic 泰坦尼克号 逻辑回归(Logistic回归) 随机森林(random forest) xgboost - scpy - 简书
  • 是否可以将随机森林和神经网络集成_51CTO博客
  • 随机森林 Sklearn 实战:泰坦尼克号生存预测(附可运行代码 + 超参数调优)-CSDN博客
  • GitHub - SeanLee97/titanic_disaster: 数据分析实战 kaggle titanic disaster。使用了RandomForestRegressor来预测缺失值,RandomForestClassifier来分类
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 2:12:57

从GDAS1到NetCDF:一个气象小白的Python数据处理实战记录(含完整代码)

从GDAS1到NetCDF:气象数据处理实战全流程解析第一次接触气象数据时,我被那些神秘的缩写和复杂的格式搞得晕头转向。GDAS1、NetCDF、GRIB...这些术语就像一堵高墙,把初学者挡在了气象数据分析的门外。直到我亲手用Python处理了第一份GDAS1数据…

作者头像 李华
网站建设 2026/6/13 2:12:49

告别点灯!用LVGL在ESP32上快速打造智能家居控制面板(附完整工程)

告别点灯!用LVGL在ESP32上快速打造智能家居控制面板(附完整工程)智能家居控制面板作为家庭自动化系统的核心交互入口,其用户体验直接影响着整套系统的使用感受。传统的嵌入式界面开发往往需要从底层绘制像素开始,耗费大…

作者头像 李华
网站建设 2026/6/13 2:12:46

碧蓝航线自动化革命:如何用Alas脚本每天节省3小时游戏时间

碧蓝航线自动化革命:如何用Alas脚本每天节省3小时游戏时间 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 你是否…

作者头像 李华
网站建设 2026/6/13 2:12:41

音频自监督学习评估新方法:凸门控探测技术解析

1. 音频自监督学习的评估困境与突破在计算机视觉领域,冻结特征探测(frozen-feature probing)已成为评估自监督学习(SSL)嵌入质量的黄金标准。这种方法通过保持预训练模型参数冻结,仅训练轻量级探测头&#…

作者头像 李华