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

python打卡训练营打卡记录day22

复习日

仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。

作业:

自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码

kaggle泰坦尼克号人员生还预测

导入数据

# 导入所需库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.impute import SimpleImputer
from lightgbm import LGBMClassifier
import shap# 忽略警告
warnings.filterwarnings("ignore")# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 加载数据
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

数据预处理

# 删除无关列
drop_columns = ['PassengerId', 'Name', 'Ticket', 'Cabin']
train_data = train_data.drop(drop_columns, axis=1)
test_data = test_data.drop(drop_columns, axis=1)# 性别0-1编码
train_data['Sex'] = train_data['Sex'].map({'female': 0, 'male': 1})
test_data['Sex'] = test_data['Sex'].map({'female': 0, 'male': 1})# Embarked独热编码
train_data = pd.get_dummies(train_data, columns=['Embarked'], drop_first=True)
test_data = pd.get_dummies(test_data, columns=['Embarked'], drop_first=True)# 填充缺失值(年龄和票价用中位数)
imputer_age = SimpleImputer(strategy='median')
train_data['Age'] = imputer_age.fit_transform(train_data[['Age']])
test_data['Age'] = imputer_age.transform(test_data[['Age']])imputer_fare = SimpleImputer(strategy='median')
train_data['Fare'] = imputer_fare.fit_transform(train_data[['Fare']])
test_data['Fare'] = imputer_fare.transform(test_data[['Fare']])

特征工程

# 添加家庭规模和独自旅行特征
train_data['FamilySize'] = train_data['SibSp'] + train_data['Parch'] + 1  # 家庭规模(包括自己)
train_data['IsAlone'] = (train_data['FamilySize'] == 1).astype(int)  # 1表示独自旅行test_data['FamilySize'] = test_data['SibSp'] + test_data['Parch'] + 1
test_data['IsAlone'] = (test_data['FamilySize'] == 1).astype(int)

调参与模型训练

X_train = train_data.drop('Survived', axis=1)
y_train = train_data['Survived']
X_test = test_data  # 测试集暂不使用,如需预测可后续添加# 划分训练集和验证集(8:2)
X_train_split, X_val, y_train_split, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42# 定义参数网格
param_grid = {'n_estimators': [50, 100, 200],  'learning_rate': [0.05, 0.1, 0.2],  # 平衡速度与精度的常用值'max_depth': [5, 10],  'min_child_samples': [10, 20],  'subsample': [0.8, 1.0],  # 行抽样常用值'colsample_bytree': [0.8, 1.0]  # 列抽样常用值
}# 初始化模型和网格搜索
model = LGBMClassifier(random_state=42, verbose=-1)
grid_search = GridSearchCV(estimator=model,param_grid=param_grid,cv=3,  # 3折交叉验证(比5折快40%)n_jobs=-1,scoring='f1_macro',verbose=1
)# 执行网格搜索
grid_search.fit(X_train_split, y_train_split)# 获取最优模型和参数
best_lgbm = grid_search.best_estimator_
print(f"最优参数:{grid_search.best_params_}")
print(f"最佳交叉验证F1值:{grid_search.best_score_:.4f}")
Fitting 3 folds for each of 144 candidates, totalling 432 fits
最优参数:{'colsample_bytree': 1.0, 'learning_rate': 0.1, 'max_depth': 10, 'min_child_samples': 20, 'n_estimators': 50, 'subsample': 0.8}
最佳交叉验证F1值:0.8099

模型评估

y_pred = best_lgbm.predict(X_val)print("\n调优后LightGBM模型评估结果:")
print(f"准确率:{accuracy_score(y_val, y_pred):.4f}")
print("分类报告:")
print(classification_report(y_val, y_pred))
print("混淆矩阵:")
print(confusion_matrix(y_val, y_pred))
调优后LightGBM模型评估结果:
准确率:0.8324
分类报告:precision    recall  f1-score   support0       0.85      0.87      0.86       1051       0.81      0.78      0.79        74accuracy                           0.83       179macro avg       0.83      0.83      0.83       179
weighted avg       0.83      0.83      0.83       179混淆矩阵:
[[91 14][16 58]]

shap可视化

# 初始化SHAP解释器
explainer = shap.TreeExplainer(best_lgbm)
shap_values = explainer.shap_values(X_val)  # 二分类返回长度为2的列表,shap_values[1]对应类别1(生存)# 提取类别1的SHAP值(形状:(n_samples, n_features))
shap_values_class1 = shap_values[1]# 1. 特征重要性汇总(柱状图)
plt.figure(figsize=(10, 6))  
shap.summary_plot(shap_values_class1, X_val, feature_names=X_train.columns, plot_type="bar",show=False  
)
plt.title("SHAP特征重要性排名", fontsize=14)  
plt.tight_layout()  # 自动调整子图参数,避免重叠
plt.savefig("shap_feature_importance.png", dpi=300, bbox_inches='tight')  
plt.show()# 2. 特征影响汇总(蜂群图)
plt.figure(figsize=(12, 8))  # 增大画布尺寸,适应更多元素
shap.summary_plot(shap_values_class1, X_val, feature_names=X_train.columns,show=False
)
plt.title("SHAP特征影响方向与强度", fontsize=14)
plt.tight_layout() 
plt.savefig("shap_summary_plot.png", dpi=300, bbox_inches='tight')
plt.show()# 3. 单个特征依赖图(前6个特征)
plt.figure(figsize=(16, 12))  for i, feature in enumerate(X_train.columns[:6]): plt.subplot(2, 3, i + 1)  shap.dependence_plot(feature, shap_values_class1, X_val, feature_names=X_train.columns, show=False,  ax=plt.gca()  )plt.title(f"{feature} 对生存概率的影响", fontsize=12)  # 添加子图标题plt.xlabel(feature)  # 显式设置x轴标签plt.tight_layout(pad=4)  # 增加子图间距,防止标题重叠
plt.savefig("shap_dependence_plots.png", dpi=300, bbox_inches='tight')
plt.show()

shap图分析

1. SHAP 特征重要性排名(柱状图)

  • 横轴mean(|SHAP value|),表示特征对模型输出影响的平均绝对值,值越大说明特征越重要。
  • 关键结论
    • Sex:重要性最高,说明性别对生存概率影响最大。
    • Pclass:次之,客舱等级影响显著。
    • FareAge:也有较高影响,票价和年龄对模型决策有重要作用。
    • 其他特征(如 FamilySizeSibSp 等)影响较小。

2. SHAP 特征影响方向与强度(蜂群图)

  • 横轴:SHAP 值,正表示促进生存,负表示抑制生存。
  • 点颜色:红色代表特征值高,蓝色代表特征值低。
  • 关键结论
    • Sex:红色点(特征值高)多在正 SHAP 值区域,说明该特征值高(如女性)时,显著促进生存;蓝色点(特征值低)在负区域,抑制生存。
    • Pclass:部分红色点在负 SHAP 值区域,表明客舱等级高(特征值高)可能抑制生存;蓝色点分布较分散,需结合具体值分析。
    • Fare:高值(红色)点多在正 SHAP 值区域,说明票价高促进生存。
    • Age:特征值与 SHAP 值无明显单调关系,但整体分布显示其对生存有复杂影响。

3. 单个特征依赖图(前 6 个特征)

  • 横轴:特征值;纵轴:SHAP 值;点颜色:通常表示特征值高低(红色高,蓝色低)。
  • 关键结论
    • Pclass:低 Pclass 值(如 1 级舱位)对应正 SHAP 值,促进生存;高值(如 3 级)可能抑制生存。
    • Sex:特征值高(如女性)对应高正 SHAP 值,强烈促进生存。
    • Age:年轻乘客(低年龄值)SHAP 值多为正,促进生存;年长者 SHAP 值分散,影响复杂。
    • Fare:票价越高,SHAP 值越正,对生存促进作用越明显。
    • SibSpParch:值较低时,SHAP 值多为负,可能抑制生存;值较高时影响不明显。

综合总结

  • 核心影响特征Sex(性别)是决定生存概率的最关键因素,女性更易生存;Fare(票价)高、Age(年龄)小也显著促进生存。
  • 客舱等级矛盾Pclass 高(舱位等级低,如 3 级舱)反而可能抑制生存,与常识中 “高舱位更易生存” 看似矛盾,需结合数据具体分布进一步验证(如高舱位是否有更多特殊情况)。
  • 家庭关系影响弱SibSp(兄弟姐妹 / 配偶数)、Parch(父母 / 子女数)对生存影响较小,仅在特定值时表现出一定规律。

@浙大疏锦行

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

相关文章:

  • Java SSM 框架(详解)
  • Java 多态:原理与实例深度剖析
  • 【Java学习日记36】:javabeen学生系统
  • [思维模式-30]:《本质思考力》-30- 计划经济与市场经济结合中的“自顶向下”与“自底向上”思维模式。
  • PXE安装Ubuntu系统
  • 免安装 + 快速响应Photoshop CS6 精简版低配置电脑修图
  • 计算机网络笔记(二十二)——4.4网际控制报文协议ICMP
  • # Anaconda3 常用命令
  • Grafana v12.0 引入了多项新功能和改进
  • KAG:通过知识增强生成提升专业领域的大型语言模型(四)
  • 【LeetCode Hot100 | 每日刷题】排序数组
  • 内存泄露,如何判断是资源泄露还是堆栈泄露?
  • Telnetlib 库完全指南
  • MySQL 索引与事务详解
  • 巧用promise.race实现nrm镜像源切换----nbsl
  • 冒泡排序的原理
  • 数据指标和数据标签
  • 「银河通用」创始人王鹤:人形机器人跳舞是预先编程,马拉松是遥控操作!
  • C语言文件读写函数详解与示例(fread、fgets、fgetc、fscanf、fwrite、fputs 和 fputc比较)
  • 专业课复习笔记 5
  • 可视化赋能电子围栏:开启智能安防新视界
  • 9.1.领域驱动设计
  • 大模型应用中常说的Rerank是什么技术?
  • 第26节:卷积神经网络(CNN)-数据增强技术(PyTorch)
  • URP - 能量罩实现
  • Scala 中累加器的创建与使用格式详解
  • 【面板数据】省级农业及农村现代化指标数据(2011-2022年)
  • C++初阶-string类的增删的模拟实现
  • C# 通过ConfigurationManager读写配置文件App.Config
  • 如何实现并运用责任链模式