数据挖掘常用的心脏病数据(From UCI)

此博客介绍了来自 UCI 的一个经典数据集,用于数据挖掘示例,包含有关年龄、性别、胸部疼痛类型等13个属性的心脏病患者信息。数据集分为实数、有序和二进制类型,用于预测心脏疾病的存在或缺失,并附带了成本矩阵。
<think>我们正在处理一个数据挖掘分类任务,目标是分析心脏病患病概率。我们将使用PyCharm作为开发环境,选择合适的分类算法(如逻辑回归、决策树、随机森林等)来构建模型。以下步骤将指导完成此任务:###步骤1:数据准备首先,我们需要一个关于心脏病数据集。这里假设我们使用UCI机器学习库中的心脏病数据集(例如Cleveland心脏病数据集)。数据集通常包含多个特征(如年龄、性别、胸痛类型等)和标签(是否患病)。###步骤2:安装必要的库在PyCharm中,创建一个新的Python项目,并安装以下库:-pandas:用于数据处理-numpy:用于数值计算-scikit-learn:用于机器学习算法-matplotlib和seaborn:用于数据可视化(可选)可以通过PyCharm的终端运行:```bashpipinstallpandasnumpyscikit-learnmatplotlibseaborn```###步骤3:加载和探索数据```pythonimportpandasaspd#加载数据集,假设数据集文件名为'heart.csv'data=pd.read_csv('heart.csv')#查看数据前五行print(data.head())#查看数据集信息print(data.info())#检查是否有缺失值print(data.isnull().sum())```###步骤4:数据预处理-处理缺失值(如果存在)-特征选择-将分类变量转换为数值变量(如果需要)-数据标准化/归一化(可选,有些算法需要)```pythonfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScaler#假设数据集中特征列名为'features',目标列为'target'X=data.drop('target',axis=1)#特征矩阵y=data['target']#目标变量#划分训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)#标准化特征(可选,逻辑回归、SVM等需要)scaler=StandardScaler()X_train=scaler.fit_transform(X_train)X_test=scaler.transform(X_test)```###步骤5:选择并训练分类模型这里以逻辑回归为例,也可以尝试其他分类算法(如随机森林、SVM等)。```pythonfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportaccuracy_score,classification_report,confusion_matrix#创建逻辑回归模型model=LogisticRegression(max_iter=1000)#max_iter参数确保收敛#训练模型model.fit(X_train,y_train)#预测测试集y_pred=model.predict(X_test)#评估模型accuracy=accuracy_score(y_test,y_pred)print(f"模型准确率:{accuracy:.2f}")print("\n分类报告:")print(classification_report(y_test,y_pred))print("\n混淆矩阵:")print(confusion_matrix(y_test,y_pred))```###步骤6:尝试其他算法(可选)例如,使用随机森林:```pythonfromsklearn.ensembleimportRandomForestClassifier#创建随机森林模型rf_model=RandomForestClassifier(n_estimators=100,random_state=42)rf_model.fit(X_train,y_train)rf_pred=rf_model.predict(X_test)#评估随机森林模型rf_accuracy=accuracy_score(y_test,rf_pred)print(f"随机森林准确率:{rf_accuracy:.2f}")```###步骤7:模型优化(超参数调优)使用网格搜索或随机搜索调优模型参数。```pythonfromsklearn.model_selectionimportGridSearchCV#定义参数网格param_grid={'C':[0.001,0.01,0.1,1,10,100],#正则化强度的倒数'penalty':['l1','l2'],#正则化类型'solver':['liblinear']#适用于小数据集的求解器}#网格搜索grid_search=GridSearchCV(LogisticRegression(max_iter=1000),param_grid,cv=5)grid_search.fit(X_train,y_train)#输出最佳参数和模型性能print("最佳参数:",grid_search.best_params_)best_model=grid_search.best_estimator_y_pred_best=best_model.predict(X_test)accuracy_best=accuracy_score(y_test,y_pred_best)print(f"优化后的模型准确率:{accuracy_best:.2f}")```###步骤8:结果分析-分析特征重要性(针对随机森林等模型)-绘制混淆矩阵、ROC曲线等-根据业务需求解释模型```python#以随机森林为例,查看特征重要性importmatplotlib.pyplotaspltfeature_importances=rf_model.feature_importances_features=X.columnsplt.barh(features,feature_importances)plt.xlabel("特征重要性")plt.ylabel("特征名称")plt.title("随机森林特征重要性")plt.show()```###注意事项:1.确保数据集路径正确,如果使用UCI数据集,可能需要下载并放在项目目录中。2.不同的算法对数据预处理的要求不同,需要根据算法特性进行适当处理。3.模型评估指标除了准确率,还应该考虑查准率、查全率、F1分数等,特别是当数据不平衡时。现在,您可以按照这些步骤在PyCharm中实现心脏病患病概率的预测。§§相关问题§§1.心脏病数据集中常用的特征有哪些?2.如何解决心脏病数据集中类别不平衡问题?3.除了逻辑回归和随机森林,还有哪些适合的分类算法?</think> 以下是使用 PyCharm 实现数据挖掘分类算法分析心脏病患病概率的完整方法和代码示例。我将分步骤指导您完成整个流程,使用经典的克利夫兰心脏病数据集(UCI Heart Disease Dataset)。 ### 方法步骤 1. **环境配置** 2. **数据获取与预处理** 3. **特征工程** 4. **模型选择与训练** 5. **模型评估与优化** 6. **概率预测分析** ### 完整代码实现 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix from sklearn.svm import SVC # ========== 1. 数据加载 ========== # 下载数据: https://archive.ics.uci.edu/ml/datasets/heart+disease # 保存为'heart.csv'放在项目目录中 heart_data = pd.read_csv('heart.csv') # ========== 2. 数据预处理 ========== # 检查缺失值 print("缺失值统计:\n", heart_data.isnull().sum()) # 处理缺失值(该数据集通常无缺失,这是通用处理逻辑) if heart_data.isnull().any().any(): heart_data.fillna(heart_data.median(), inplace=True) # 转换目标变量:0-健康,1-患病 heart_data['target'] = np.where(heart_data['target'] > 0, 1, 0) # ========== 3. 特征工程 ========== # 分割特征和目标 X = heart_data.drop('target', axis=1) y = heart_data['target'] # 标准化特征 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 特征重要度分析(随机森林) model_rf = RandomForestClassifier() model_rf.fit(X_scaled, y) feature_importance = pd.Series(model_rf.feature_importances_, index=X.columns) print("\n特征重要度排序:") print(feature_importance.sort_values(ascending=False).head(5)) # ========== 4. 模型训练 ========== # 数据集拆分 X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, test_size=0.2, random_state=42, stratify=y ) # 随机森林模型 rf_params = {'n_estimators': [100, 200], 'max_depth': [5, 10]} rf_model = GridSearchCV(RandomForestClassifier(), rf_params, cv=5) rf_model.fit(X_train, y_train) # SVM模型 svm_model = SVC(probability=True) svm_model.fit(X_train, y_train) # ========== 5. 模型评估 ========== def evaluate_model(model, X_test, y_test): y_pred = model.predict(X_test) probs = model.predict_proba(X_test)[:,1] print(f"\n{model.__class__.__name__}评估结果:") print(f"准确率: {accuracy_score(y_test, y_pred):.3f}") print(f"精确率: {precision_score(y_test, y_pred):.3f}") print(f"召回率: {recall_score(y_test, y_pred):.3f}") print(f"F1分数: {f1_score(y_test, y_pred):.3f}") print(f"AUC分数: {roc_auc_score(y_test, probs):.3f}") # 混淆矩阵可视化 cm = confusion_matrix(y_test, y_pred) sns.heatmap(cm, annot=True, fmt='d', cmap='Blues') plt.xlabel('预测值') plt.ylabel('真实值') plt.title('混淆矩阵') plt.show() evaluate_model(rf_model.best_estimator_, X_test, y_test) evaluate_model(svm_model, X_test, y_test) # ========== 6. 概率预测 ========== def predict_probabilities(model, patient_data): """预测单个患者的患病概率""" scaled_data = scaler.transform(patient_data.values.reshape(1, -1)) prob = model.predict_proba(scaled_data)[0][1] return prob # 示例:预测单个患者的患病概率 sample_patient = pd.DataFrame({ 'age': [52], 'sex': [1], 'cp': [2], 'trestbps': [125], 'chol': [212], 'fbs': [0], 'restecg': [1], 'thalach': [168], 'exang': [0], 'oldpeak': [1.0], 'slope': [2], 'ca': [0], 'thal': [3] }) rf_prob = predict_probabilities(rf_model.best_estimator_, sample_patient) svm_prob = predict_probabilities(svm_model, sample_patient) print(f"\n患者预测结果:") print(f"随机森林预测患病概率: {rf_prob*100:.2f}%") print(f"SVM预测患病概率: {svm_prob*100:.2f}%") # ========== 7. 概率分布分析 ========== # 计算所有测试样本的患病概率 test_probs = rf_model.best_estimator_.predict_proba(X_test)[:, 1] plt.figure(figsize=(10, 6)) sns.histplot(test_probs[y_test==0], bins=25, color='blue', kde=True, stat='probability', alpha=0.5, label='健康人群') sns.histplot(test_probs[y_test==1], bins=25, color='red', kde=True, stat='probability', alpha=0.5, label='患者') plt.title('患病概率分布') plt.xlabel('预测概率') plt.ylabel('比例') plt.legend() plt.show() ``` ### PyCharm实施指南 1. **创建新项目** - 新建Python项目并创建`heart_disease.py`文件 - 下载数据集放到项目根目录:[UCI心脏病数据集](https://archive.ics.uci.edu/ml/datasets/heart+disease) 2. **环境配置** ```bash pip install pandas numpy scikit-learn matplotlib seaborn ``` 3. **执行流程** - 运行脚本后检查控制台输出 - 查看自动生成的混淆矩阵图像 - 修改`sample_patient`值测试不同患者 4. **结果分析要点** - 患病概率分布图展示模型对不同人群的区分度 - 关键特征(如胸痛类型thalach)对预测的影响 - 健康人群概率集中在左侧(低概率),患者集中在右侧(高概率) ### 优化建议 1. **特征工程优化** ```python # 添加新特征:年龄分组 heart_data['age_group'] = pd.cut(heart_data['age'], bins=[0,40,55,100], labels=[0,1,2]) # 交互特征 heart_data['bp_chol'] = heart_data['trestbps'] * heart_data['chol'] / 100 ``` 2. **集成模型增强** ```python from sklearn.ensemble import VotingClassifier ensemble_model = VotingClassifier( estimators=[ ('rf', RandomForestClassifier(n_estimators=200)), ('svm', SVC(probability=True)) ], voting='soft' ) ``` 3. **概率校准** ```python from sklearn.calibration import CalibratedClassifierCV calibrated_model = CalibratedClassifierCV(svm_model, method='sigmoid', cv=5) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值