DAY 22 复习日kaggle泰坦里克号人员生还预测
复习日
仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。
作业:
自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码
kaggle泰坦里克号人员生还预测
输入:
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import SimpleImputer # 添加这行导入
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifier
# 加载数据集# 加载数据集
train_data = pd.read_csv(r'titanic/train.csv')
test_data = pd.read_csv(r'titanic/test.csv')# 数据预处理优化
# 删除无关特征(保留原始注释)
train_data = train_data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
test_data = test_data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)# 修正缺失值处理流程
missing_cols = {
'str': ['Embarked', 'Sex'],
'num': ['Age', 'Fare']
}# 统一使用训练集的统计量进行填充
imputer = {
'str': SimpleImputer(strategy='most_frequent').fit(train_data[missing_cols['str']]),
'num': SimpleImputer(strategy='median').fit(train_data[missing_cols['num']])
}# 应用填充
train_data[missing_cols['str']] = imputer['str'].transform(train_data[missing_cols['str']])
test_data[missing_cols['str']] = imputer['str'].transform(test_data[missing_cols['str']])
train_data[missing_cols['num']] = imputer['num'].transform(train_data[missing_cols['num']])
test_data[missing_cols['num']] = imputer['num'].transform(test_data[missing_cols['num']])# 特征编码优化
train_data = pd.get_dummies(train_data, columns=['Sex', 'Embarked'], drop_first=True)
# 确保测试集与训练集列对齐
test_data = pd.get_dummies(test_data, columns=['Sex', 'Embarked'], drop_first=True)
test_data = test_data.reindex(columns=train_data.columns.drop('Survived'), fill_value=0)# 划分数据集(添加随机种子)
X = train_data.drop('Survived', axis=1)
y = train_data['Survived']
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)# 移除特征缩放(树模型不需要)
# 新增参数调优
param_grid = {
'n_estimators': [100, 200],
'max_depth': [None, 5, 10],
'class_weight': [None, 'balanced']
}rf = RandomForestClassifier(random_state=42)
grid_search = GridSearchCV(rf, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)best_model = grid_search.best_estimator_
val_pred = best_model.predict(X_val)
from sklearn.metrics import accuracy_score, roc_auc_score # 添加ROC AUC指标
# 增强模型评估
print(f"\n最佳参数: {grid_search.best_params_}")
print("验证集准确率:", accuracy_score(y_val, val_pred))
print("AUC分数:", roc_auc_score(y_val, best_model.predict_proba(X_val)[:, 1]))
print("特征重要性:")
for name, importance in zip(X.columns, best_model.feature_importances_):
print(f"{name}: {importance:.3f}")# 原导入部分保持不变,添加以下内容# 预测并保存结果
test_pred = best_model.predict(test_data)
output = pd.DataFrame({'PassengerId': range(892, 1310), 'Survived': test_pred})
output.to_csv('submission.csv', index=False)
print("预测结果已保存为 submission.csv")
输出:
最佳参数: {'class_weight': None, 'max_depth': 5, 'n_estimators': 200}
验证集准确率: 0.7932960893854749
AUC分数: 0.8412384716732543
特征重要性:
Pclass: 0.141
Age: 0.118
SibSp: 0.047
Parch: 0.037
Fare: 0.180
Sex_male: 0.438
Embarked_Q: 0.012
Embarked_S: 0.028
预测结果已保存为 submission.csv