糖尿病预测模型

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

Pregnancies:怀孕次数
Glucose:葡萄糖测试值
BloodPressure:血压
SkinThickness:皮肤厚度
Insulin:胰岛素
BMI:身体质量指数
DiabetesPedigreeFunction:糖尿病遗传函数
Age:年龄
Outcome:糖尿病标签

# 载入数据
diabetes_data = pd.read_csv('diabetes.csv')
diabetes_data.head()
PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAgeOutcome
061487235033.60.627501
11856629026.60.351310
28183640023.30.672321
318966239428.10.167210
40137403516843.12.288331
# 数据信息
diabetes_data.info(verbose=True)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
Pregnancies                 768 non-null int64
Glucose                     768 non-null int64
BloodPressure               768 non-null int64
SkinThickness               768 non-null int64
Insulin                     768 non-null int64
BMI                         768 non-null float64
DiabetesPedigreeFunction    768 non-null float64
Age                         768 non-null int64
Outcome                     768 non-null int64
dtypes: float64(2), int64(7)
memory usage: 54.1 KB
# 数据描述
diabetes_data.describe()
PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAgeOutcome
count768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000768.000000
mean3.845052120.89453169.10546920.53645879.79947931.9925780.47187633.2408850.348958
std3.36957831.97261819.35580715.952218115.2440027.8841600.33132911.7602320.476951
min0.0000000.0000000.0000000.0000000.0000000.0000000.07800021.0000000.000000
25%1.00000099.00000062.0000000.0000000.00000027.3000000.24375024.0000000.000000
50%3.000000117.00000072.00000023.00000030.50000032.0000000.37250029.0000000.000000
75%6.000000140.25000080.00000032.000000127.25000036.6000000.62625041.0000001.000000
max17.000000199.000000122.00000099.000000846.00000067.1000002.42000081.0000001.000000
# 数据形状
diabetes_data.shape
(768, 9)
# 查看标签分布
print(diabetes_data.Outcome.value_counts())
# 使用柱状图的方式画出标签个数统计
p=diabetes_data.Outcome.value_counts().plot(kind="bar")
plt.show()
0    500
1    268
Name: Outcome, dtype: int64

# 可视化数据分布
p=sns.pairplot(diabetes_data, hue = 'Outcome')
plt.show()

在这里插入图片描述

这里画的图主要是两种类型,直方图和散点图。单一特征对比的时候用的是直方图,不同特征对比的时候用的是散点图,显示两个特征的之间的关系。观察数据分布我们可以发现一些异常值,比如Glucose葡萄糖,BloodPressure血压,SkinThickness皮肤厚度,Insulin胰岛素,BMI身体质量指数这些特征应该是不可能出现0值的。

# 把葡萄糖,血压,皮肤厚度,胰岛素,身体质量指数中的0替换为nan
colume = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']
diabetes_data[colume] = diabetes_data[colume].replace(0,np.nan)
# pip install missingno
import missingno as msno
p=msno.bar(diabetes_data)
plt.show()

在这里插入图片描述

# 设定阀值
thresh_count = diabetes_data.shape[0]*0.8
# 若某一列数据缺失的数量超过20%就会被删除
diabetes_data = diabetes_data.dropna(thresh=thresh_count, axis=1) 
p=msno.bar(diabetes_data)
plt.show()

# 导入插补库
from sklearn.preprocessing import Imputer 
# 对数值型变量的缺失值,我们采用均值插补的方法来填充缺失值
imr = Imputer(missing_values='NaN', strategy='mean', axis=0) 
colume =  ['Glucose', 'BloodPressure', 'BMI']
# 进行插补
diabetes_data[colume] = imr.fit_transform(diabetes_data[colume]) 
p=msno.bar(diabetes_data)
plt.show()

在这里插入图片描述

plt.figure(figsize=(12,10))  
# 画热力图,数值为两个变量之间的相关系数
p=sns.heatmap(diabetes_data.corr(), annot=True) 
plt.show()

# 把数据切分为特征x和标签y
x = diabetes_data.drop("Outcome",axis = 1)
y = diabetes_data.Outcome
from sklearn.model_selection import train_test_split
# 切分数据集,stratify=y表示切分后训练集和测试集中的数据类型的比例跟切分前y中的比例一致
# 比如切分前y中0和1的比例为1:2,切分后y_train和y_test中0和1的比例也都是1:2
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3, stratify=y)
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

LR = LogisticRegression()
LR.fit(x_train,y_train)

predictions = LR.predict(x_test)
print(classification_report(y_test, predictions))
             precision    recall  f1-score   support

          0       0.80      0.93      0.86       150
          1       0.82      0.56      0.66        81

avg / total       0.80      0.80      0.79       231
KNN(K-最近邻算法)是一种常用的机器学习算法,可以用于糖尿病预测模型糖尿病是一种与血糖代谢紊乱相关的慢性疾病,而KNN模型可以利用已知病例的特征和类别标签,通过计算新的观察样本与已知样本之间的距离,从而预测新样本的分类。 在糖尿病预测模型中,我们首先需要收集大量的糖尿病患者的相关数据,包括年龄、BMI指数、血压、血糖水平等特征。然后,我们将这些特征作为KNN模型的输入特征。 接下来,我们需要选择一个合适的距离度量方法,常用的有欧氏距离、曼哈顿距离等。对于每个新的观察样本,KNN模型将计算该样本与已知样本的距离,并选择距离最近的K个已知样本作为参考。 最后,根据K个最近邻样本的类别标签,通过多数表决的方式确定新样本的分类。例如,如果K个最近邻样本中大多数为糖尿病患者,则将新样本分类为糖尿病。 KNN模型的一个重要参数是K值的选择,合适的K值可以对模型性能产生重要影响。较小的K值可能会导致过拟合,而较大的K值可能会导致欠拟合。因此,在选择K值时需要通过交叉验证等方法进行调优。 总的来说,KNN糖尿病预测模型是一种简单而有效的机器学习方法。它可以根据已有的糖尿病患者的数据,通过计算新样本与已知样本之间的距离,预测出新样本的分类。但是,KNN模型也有其局限性,例如对于特征间相关性较高的数据,需要额外的处理。因此,在应用KNN模型时,需要综合考虑数据特点及模型的优缺点,做出合适的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mrrunsen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值