Kaggle心脏病数据集实战:用Python从EDA到建模的保姆级教程(附完整代码)
Kaggle心脏病数据集实战用Python从EDA到建模的保姆级教程当你第一次接触Kaggle上的心脏病数据集时可能会被它庞大的信息量所震撼。这个数据集包含了40多万条记录涵盖了从基础生理指标到生活习惯的多个维度。但别担心今天我将带你从零开始一步步完成从数据探索到建模的完整流程。1. 环境准备与数据加载在开始之前确保你已经安装了必要的Python库。我推荐使用Anaconda创建独立环境conda create -n heartdisease python3.8 conda activate heartdisease pip install pandas numpy matplotlib seaborn scikit-learn imbalanced-learn数据集可以从Kaggle直接下载文件名为heart_2020_cleaned.csv。让我们先加载数据并快速浏览import pandas as pd # 加载数据 df pd.read_csv(heart_2020_cleaned.csv) # 查看前5行 print(df.head()) # 检查数据基本信息 print(df.info())注意Kaggle数据集通常需要先接受竞赛规则才能下载。如果遇到权限问题请确保已登录Kaggle账号。数据集中有几个关键变量需要特别关注HeartDisease: 目标变量表示是否患有心脏病BMI: 身体质量指数Smoking: 吸烟史PhysicalHealth: 过去30天身体健康状况不佳的天数MentalHealth: 过去30天心理健康状况不佳的天数2. 探索性数据分析(EDA)2.1 数据概览与缺失值检查首先检查数据完整性和基本统计量# 检查缺失值 print(df.isnull().sum()) # 数值型变量描述统计 print(df.describe()) # 类别型变量统计 cat_cols df.select_dtypes(includeobject).columns for col in cat_cols: print(f\n{col}分布:) print(df[col].value_counts(normalizeTrue))你会发现这个数据集已经被很好地清理过几乎没有缺失值。这是Kaggle数据集的一个优点。2.2 目标变量分布可视化心脏病预测是一个典型的分类问题我们先看看目标变量的分布import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize(8,6)) sns.countplot(xHeartDisease, datadf) plt.title(心脏病分布情况) plt.show()这个图表会显示一个严重的问题数据不平衡。大约只有8%的样本标记为患有心脏病。这种不平衡会影响模型训练我们稍后会专门处理。2.3 关键特征分析让我们看看几个重要特征与心脏病的关系# 年龄与心脏病关系 plt.figure(figsize(12,6)) sns.countplot(xAgeCategory, hueHeartDisease, datadf) plt.xticks(rotation45) plt.title(不同年龄段心脏病分布) plt.show() # BMI分布与心脏病 plt.figure(figsize(10,6)) sns.boxplot(xHeartDisease, yBMI, datadf) plt.title(BMI与心脏病关系) plt.show()这些可视化能帮助我们直观理解数据中的模式。例如你会明显看到年龄越大心脏病发病率越高。3. 数据预处理与特征工程3.1 类别变量编码许多机器学习算法不能直接处理文本类别我们需要进行编码# 对二元类别变量进行编码 binary_map {Yes:1, No:0} df[HeartDisease] df[HeartDisease].map(binary_map) df[Smoking] df[Smoking].map(binary_map) df[AlcoholDrinking] df[AlcoholDrinking].map(binary_map) # 对多类别变量使用独热编码 df pd.get_dummies(df, columns[AgeCategory, Race, Diabetic, GenHealth], drop_firstTrue)3.2 处理数据不平衡如前所述数据存在严重不平衡。我们使用SMOTE技术来平衡数据集from imblearn.over_sampling import SMOTE from sklearn.model_selection import train_test_split # 分离特征和目标 X df.drop(HeartDisease, axis1) y df[HeartDisease] # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 应用SMOTE smote SMOTE(random_state42) X_train_res, y_train_res smote.fit_resample(X_train, y_train)提示SMOTE会在少数类样本之间生成合成样本而不是简单复制这能有效避免过拟合。3.3 特征缩放某些算法对特征尺度敏感我们进行标准化处理from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train_res) X_test_scaled scaler.transform(X_test)4. 模型构建与评估4.1 逻辑回归模型让我们从简单的逻辑回归开始from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score lr LogisticRegression(max_iter1000) lr.fit(X_train_scaled, y_train_res) # 预测 y_pred lr.predict(X_test_scaled) # 评估 print(classification_report(y_test, y_pred)) print(ROC AUC:, roc_auc_score(y_test, y_pred))4.2 随机森林模型随机森林通常能提供更好的性能from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier(n_estimators100, random_state42) rf.fit(X_train_res, y_train_res) # 预测 y_pred_rf rf.predict(X_test_scaled) # 评估 print(classification_report(y_test, y_pred_rf)) print(ROC AUC:, roc_auc_score(y_test, y_pred_rf))4.3 模型优化与特征重要性查看哪些特征对预测最重要# 获取特征重要性 feature_importance pd.DataFrame({ Feature: X.columns, Importance: rf.feature_importances_ }).sort_values(Importance, ascendingFalse) # 可视化 plt.figure(figsize(12,8)) sns.barplot(xImportance, yFeature, datafeature_importance.head(15)) plt.title(随机森林特征重要性) plt.show()5. 模型部署与应用5.1 保存模型训练好的模型可以保存供以后使用import joblib # 保存模型和缩放器 joblib.dump(rf, heart_disease_rf_model.pkl) joblib.dump(scaler, scaler.pkl)5.2 构建预测函数创建一个简单的预测函数示例def predict_heart_disease(input_data): input_data: 字典形式包含所有必要特征 返回预测结果和概率 # 加载模型和缩放器 model joblib.load(heart_disease_rf_model.pkl) scaler joblib.load(scaler.pkl) # 转换输入数据 input_df pd.DataFrame([input_data]) # 进行与训练时相同的预处理 input_df[HeartDisease] input_df[HeartDisease].map(binary_map) # ...其他预处理步骤 # 缩放 input_scaled scaler.transform(input_df) # 预测 pred model.predict(input_scaled) proba model.predict_proba(input_scaled) return pred[0], proba[0][1]在实际项目中你可能需要将这个函数集成到Web应用或API中。Flask或FastAPI都是不错的选择。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2574975.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!