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

详细案例,集成算法

以下是一个使用 随机森林(RF) 和 XGBoost 解决结构化数据分类问题的完整案例(以泰坦尼克号生存预测为例),包含数据处理、建模和结果分析:

 

案例:泰坦尼克号乘客生存预测

 

目标:根据乘客特征(如年龄、船舱等级等)预测生存与否(0=遇难,1=存活)。

 

一、数据准备

 

1. 加载数据

 

import pandas as pd

train = pd.read_csv("train.csv") # 训练集

test = pd.read_csv("test.csv") # 测试集

 

 

2. 数据清洗

 

- 缺失值处理:

- 年龄(Age):用中位数填充。

- 登船港口(Embarked):用众数填充。

- 船舱等级(Fare):用均值填充测试集缺失值。

 

train['Age'].fillna(train['Age'].median(), inplace=True)

train['Embarked'].fillna(train['Embarked'].mode()[0], inplace=True)

test['Age'].fillna(test['Age'].median(), inplace=True)

test['Fare'].fillna(test['Fare'].mean(), inplace=True)

 

 

- 特征工程:

- 提取船舱首字母(如Cabin='C85' → 'C'),缺失值标记为'X'。

- 转换分类变量(如性别、登船港口)为数值型(独热编码)。

 

train['Cabin'] = train['Cabin'].fillna('X').apply(lambda x: x[0])

test['Cabin'] = test['Cabin'].fillna('X').apply(lambda x: x[0])

train = pd.get_dummies(train, columns=['Sex', 'Embarked', 'Cabin'])

test = pd.get_dummies(test, columns=['Sex', 'Embarked', 'Cabin'])

 

 

- 选择核心特征:

features = ['Pclass', 'Age', 'SibSp', 'Parch', 'Fare'] + \

           [col for col in train.columns if 'Sex_' in col or 'Embarked_' in col or 'Cabin_' in col]

X_train = train[features]

y_train = train['Survived']

X_test = test[features]

 

 

二、模型训练与调优

 

1. 随机森林(RF)

 

from sklearn.ensemble import RandomForestClassifier

from sklearn.model_selection import GridSearchCV

 

# 初始模型

rf = RandomForestClassifier(random_state=42)

rf.fit(X_train, y_train)

 

# 网格搜索调参

param_grid = {

    'n_estimators': [100, 200],

    'max_depth': [None, 10, 20],

    'min_samples_split': [2, 5]

}

grid_search = GridSearchCV(rf, param_grid, cv=5, scoring='accuracy')

grid_search.fit(X_train, y_train)

best_rf = grid_search.best_estimator_

 

 

2. XGBoost

 

import xgboost as xgb

from xgboost import plot_importance

import matplotlib.pyplot as plt

 

# 初始模型

xgb_model = xgb.XGBClassifier(

    objective='binary:logistic',

    random_state=42,

    n_estimators=500,

    learning_rate=0.1

)

xgb_model.fit(X_train, y_train, early_stopping_rounds=50, 

             eval_set=[(X_train, y_train)], verbose=False)

 

# 特征重要性可视化

plot_importance(xgb_model)

plt.show()

 

 

三、结果分析

 

1. 模型评估(训练集)

 

from sklearn.metrics import accuracy_score, classification_report

 

# 随机森林

y_pred_rf = best_rf.predict(X_train)

print("RF准确率:", accuracy_score(y_train, y_pred_rf)) # 示例输出:~0.85

 

# XGBoost

y_pred_xgb = xgb_model.predict(X_train)

print("XGBoost准确率:", accuracy_score(y_train, y_pred_xgb)) # 示例输出:~0.88

 

 

2. 预测提交(测试集)

 

# 生成预测结果

test['Survived'] = best_rf.predict(X_test) # 或用xgb_model.predict(X_test)

submission = test[['PassengerId', 'Survived']]

submission.to_csv("submission.csv", index=False)

 

 

四、关键结论

 

1. 特征重要性:

- XGBoost显示性别(Sex_female)、船舱等级(Pclass)、年龄(Age)是最重要的生存预测因素(见特征重要性图)。

2. 模型对比:

- 随机森林调参后准确率约85%,XGBoost通过正则化和早停机制准确率更高(约88%),但需注意过拟合风险。

3. 优化方向:

- 可尝试Stacking集成(如RF+逻辑回归作为元模型),或进一步调整XGBoost的 max_depth 和 reg_alpha 。

 

代码优化建议

 

- 并行加速:XGBoost设置 n_jobs=-1 启用多线程,RF设置 n_jobs=-1 加速训练。

- 数据泄漏检查:特征工程需在训练集和测试集独立处理(避免用测试集数据填充训练集缺失值)。

 

需要完整数据集或其他算法案例(如GBDT)可随时告知!

http://www.xdnf.cn/news/4001.html

相关文章:

  • 高等数学第三章---微分中值定理与导数的应用(3.3泰勒(Taylor)公式)
  • JAVA组织/岗位拉取多段时间属性到一张表上时,时间段分隔问题
  • 解释一下NGINX的反向代理和正向代理的区别?
  • 【C++重载操作符与转换】下标操作符
  • Android学习总结之事件分发机制篇
  • Java大厂面试:Java技术栈中的核心知识点
  • 25.5.4数据结构|哈夫曼树 学习笔记
  • 深度学习在自动驾驶车辆车道检测中的应用
  • 硬件工程师面试常见问题(13)
  • 一个整数n可以有多种分划,分划的整数之和为n,在不区分分划出各整数的次序时,字典序递减输出n 的各详细分划方案和分划总数,详解
  • 5.4学习记录
  • 洛谷 P2473 [SCOI2008] 奖励关
  • TS 类型别名
  • ES6入门---第三单元 模块一:类、继承
  • 【操作系统】死锁
  • [pdf,epub]292页《分析模式》漫谈合集01-59提供下载
  • 【C语言入门级教学】VS使用调试技巧1
  • 算法笔记.求约数
  • 303.整数拆分
  • Seata TCC 实战笔记:从零搭建分布式事务 Demo (含源码)
  • Linux的时间同步服务器
  • 【LLM】deepseek R1之GRPO训练笔记(持续更新)
  • 【TF-BERT】基于张量的融合BERT多模态情感分析
  • 代码随想录算法训练营Day44
  • PyTorch_张量索引操作
  • Spring Cloud Gateway路由+断言+过滤
  • Flask + SQLite 简单案例
  • 位置权限关掉还能看到IP属地吗?全面解析定位与IP的关系
  • 腾讯云服务器技术全景解析:从基础架构到行业赋能​
  • React-router v7 第七章(导航)