糖尿病风险预测模型分析与构建

导包

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

数据概览

file_path = '/home/mw/input/tnb9321/diabetes.csv'
diabetes_data = pd.read_csv(file_path)

diabetes_data.head()

在这里插入图片描述
数据集包含以下列:

  • Pregnancies:怀孕次数
  • Glucose:血糖水平
  • BloodPressure:血压
  • SkinThickness:皮肤厚度
  • Insulin:胰岛素
  • BMI:体重指数
  • DiabetesPedigreeFunction:糖尿病遗传函数
  • Age:年龄
  • Outcome:结果(1表示有糖尿病,0表示没有)

基本统计分析

diabetes_data.describe()

在这里插入图片描述
从统计数据中,我们可以看到一些现象:

  • 孕娠次数的范围是0到17次,平均值为3.85次。
  • 血糖水平的平均值约为120.89,但标准差较大,达到31.97,表明数据分布较广。
  • 血压的平均值为69.11,标准差为19.36。
  • 皮肤厚度的最小值为0,这可能意味着有缺失值或测量误差。
  • 胰岛素的范围很广,从0到846,平均值约为79.80。
  • 体重指数(BMI)的平均值为31.99,标准差为7.88。
  • 糖尿病遗传函数的平均值为0.47,标准差为0.33。
  • 年龄的范围是21到81岁,平均值为33.24岁。
  • 结果(Outcome)列表示患者是否患有糖尿病,其中1表示有糖尿病,0表示没有。数据集中大约有34.90%的样本患有糖尿病。

检查数据集中是否存在缺失值

missing_values = diabetes_data.isnull().sum()
missing_values

在这里插入图片描述
数据集中没有缺失值,我们可以直接进行分析而无需进行缺失值处理。

数据的分布和特征之间的关系

diabetes_data.hist(figsize=(10, 10))
plt.suptitle('特征分布直方图')
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()

在这里插入图片描述


plt.figure(figsize=(8, 6))
sns.scatterplot(data=diabetes_data, x='Glucose', y='BMI', hue='Outcome', palette=['blue', 'red'])
plt.title('血糖水平 vs 体重指数 (BMI)')
plt.xlabel('血糖水平')
plt.ylabel('体重指数 (BMI)')
plt.show()

在这里插入图片描述

plt.figure(figsize=(10, 8))
correlation_matrix = diabetes_data.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('特征相关性热力图')
plt.show()

在这里插入图片描述

  1. 从直方图中,我们可以观察到以下特点:
    • 孕娠次数分布:大多数患者的妊娠次数在0到6次之间。
    • 血糖水平分布:血糖水平的分布呈现出右偏态,大多数患者的血糖水平在100以下,但也有一部分患者的血糖水平较高。
    • 血压分布:血压的分布相对均匀,大多数患者的血压在60到80之间。
    • 皮肤厚度分布:大部分患者的皮肤厚度在0到40之间,但也有一些极端值。
    • 胰岛素分布:胰岛素的分布呈现出明显的右偏态,大多数患者的胰岛素水平在0到200之间,但也有一部分患者的胰岛素水平较高。
    • BMI分布:BMI的分布相对均匀,大多数患者的BMI在20到40之间。
    • 糖尿病遗传函数分布:糖尿病遗传函数的分布呈现出右偏态,大多数患者的遗传函数值在0到1之间。
    • 年龄分布:年龄的分布呈现出右偏态,大多数患者的年龄在20到40岁之间。
  2. 从血糖水平与BMI的散点图中,我们可以看到:
    • 血糖水平较高的患者往往具有更高的BMI。
    • 红色点表示患有糖尿病的患者,蓝色点表示没有糖尿病的患者。从这个图中可以看出,血糖水平较高且BMI较高的患者更有可能患有糖尿病。
  3. 从特征相关性热力图中,我们可以观察到以下特点:
    • 血糖水平与BMI、年龄和糖尿病遗传函数之间存在较强的正相关关系。
    • 血压与皮肤厚度、年龄之间存在较强的正相关关系。
    • 胰岛素与血糖水平、BMI之间存在较强的正相关关系。

机器学习模型的选择

选择适合的机器学习模型通常取决于数据集的特性以及我们想要解决的问题。对于这个糖尿病数据集,可以考虑以下几种模型:

  1. 逻辑回归(Logistic Regression)
    • 适用于二分类问题,如本数据集的糖尿病预测(有糖尿病或没有糖尿病)。
    • 简单、易于实现,且结果易于解释。
  2. 决策树(Decision Tree)
    • 可以处理非线性关系,易于理解。
    • 但可能容易过拟合,需要适当的剪枝。
  3. 随机森林(Random Forest)
    • 是决策树的集成方法,可以减少过拟合,通常性能较好。
    • 但模型相对复杂,计算成本较高。
  4. 支持向量机(SVM)
    • 在高维空间中寻找最佳分离超平面,适用于中小型数据集。
    • 需要选择合适的核函数和惩罚参数。
  5. 梯度提升机(Gradient Boosting Machine, GBM)
    • 是一种强大的集成学习算法,通常性能很好。
    • 但需要调优多个参数,且训练时间可能较长。
  6. 神经网络(Neural Networks)
    • 适用于复杂的数据分布,可以通过添加隐藏层来捕捉复杂的特征关系。
    • 需要大量的数据来训练,且训练过程可能较慢。

对于这个数据集,由于它相对较小且特征数量不多,我们可以先尝试使用逻辑回归和决策树作为初步的模型,然后根据性能考虑是否需要使用更复杂的模型。

逻辑回归和决策树模型的使用’

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 将数据集拆分为训练集和测试集
X = diabetes_data.drop('Outcome', axis=1)
y = diabetes_data['Outcome']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化模型
logistic_regression_model = LogisticRegression()
decision_tree_model = DecisionTreeClassifier(random_state=42)

# 训练模型
logistic_regression_model.fit(X_train, y_train)
decision_tree_model.fit(X_train, y_train)

# 进行预测
logistic_regression_predictions = logistic_regression_model.predict(X_test)
decision_tree_predictions = decision_tree_model.predict(X_test)

# 评估模型
logistic_regression_accuracy = accuracy_score(y_test, logistic_regression_predictions)
decision_tree_accuracy = accuracy_score(y_test, decision_tree_predictions)

logistic_regression_cm = confusion_matrix(y_test, logistic_regression_predictions)
decision_tree_cm = confusion_matrix(y_test, decision_tree_predictions)

logistic_regression_report = classification_report(y_test, logistic_regression_predictions)
decision_tree_report = classification_report(y_test, decision_tree_predictions)


print("逻辑回归模型评估结果:")
print(f"准确率: {logistic_regression_accuracy:.2f}")
print("混淆矩阵:")
print(logistic_regression_cm)
print("分类报告:")
print(logistic_regression_report)

print("\n决策树模型评估结果:")
print(f"准确率: {decision_tree_accuracy:.2f}")
print("混淆矩阵:")
print(decision_tree_cm)
print("分类报告:")
print(decision_tree_report)

在这里插入图片描述

  1. 从模型评估结果来看,逻辑回归和决策树模型在这个数据集上的性能相似,准确率都约为75%。
  2. 混淆矩阵显示,两种模型在预测没有糖尿病的样本时表现较好,但在预测有糖尿病的样本时性能相对较差。
  3. 分类报告提供了更详细的评估指标,包括精确度、召回率和F1分数。逻辑回归和决策树在这些指标上的表现也相似。
  4. 考虑到模型的简洁性和易于解释性,逻辑回归可能是一个更好的选择,尤其是对于临床应用来说。

注意

# 若需要完整数据集以及代码请点击以下链接
https://mbd.pub/o/bread/mbd-Z5ycm5dq
<think>好的,用户想要一个在诊断模型中进行多重插补的具体事例,包括代码和解释。首先,我需要明确多重插补的基本概念和应用场景,确保自己理解正确。多重插补常用于处理缺失数据,通过生成多个完整数据集来减少偏差,提高统计结果的可靠性。 接下来,用户可能需要一个实际的例子,最好是医学诊断相关的,比如使用年龄、血压血糖等指标预测疾病。这样贴近实际,容易理解。然后,我需要考虑使用哪个Python库,应该是statsmodels或sklearn,但更常见的是用statsmodels中的MICE(多重插补链式方程)方法。 然后,生成数据集的步骤。需要创建有缺失值的数据,可能随机在某个变量中引入缺失,比如血糖。接着,应用MICE进行插补,生成多个数据集。之后,构建诊断模型,比如逻辑回归,并汇总结果。 代码部分需要分步骤:生成数据、插补、建模、结果汇总。要确保代码正确,并且有注释解释每一步的作用。同时,需要解释为什么用MICE,以及pooling的过程,如何整合多个模型的结果。 用户可能对代码中的某些部分不熟悉,比如MICE的参数,或者如何汇总结果,所以需要逐一解释,用简单的语言。比如,解释n_imputations是生成的数据集数量,m=5,然后每个数据集训练模型,取系数和p值的平均值。 还要注意可能的误区,比如多重插补后如何正确分析,不能单独分析每个数据集,而是需要合并结果。另外,要提到缺失机制,比如MCAR或MAR,影响插补方法的选择。 最后,检查代码是否可运行,是否有安装库的提示,比如需要安装statsmodels,可能在例子中提醒用户。同时,结果的可视化或解释需要清晰,比如系数和p值的意义,帮助用户理解模型结果。 总结来说,整个思考过程要覆盖示例构建、代码正确性、解释的易懂性,以及潜在问题的提醒,确保用户能够按照步骤操作并理解背后的原理。</think>好的!以下是一个基于Python的完整多重插补示例,结合诊断模型构建过程。我将使用`statsmodels`和`sklearn`库,并采用乳腺癌数据集进行演示。 ```python # 环境准备(需要先安装相关库) # pip install statsmodels numpy pandas sklearn import numpy as np import pandas as pd from statsmodels.imputation.mice import MICEData from statsmodels.regression.linear_model import OLS from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # ---------- 步骤1:创建有缺失的数据集 ---------- # 加载乳腺癌数据集(二分类问题) data = load_breast_cancer() df = pd.DataFrame(data.data, columns=data.feature_names) df['target'] = data.target # 人为制造20%的缺失值(在'mean radius'和'worst texture'列) np.random.seed(42) df.loc[df.sample(frac=0.2).index, 'mean radius'] = np.nan df.loc[df.sample(frac=0.2).index, 'worst texture'] = np.nan # ---------- 步骤2:多重插补处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bony-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值