以下是一个使用 随机森林(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)可随时告知!