数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

这篇具有很好参考价值的文章主要介绍了数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、准备数据

1.查看数据

二、数据探索性分析

1.数据描述型分析

2.各特征值与结果的关系

a)研究各个特征值本身类别

b)研究怀孕次数特征值与结果的关系

c)其他特征值

3.研究各特征互相的关系

三、数据预处理

1.去掉唯一属性

2.处理缺失值

a)标记缺失值

b)删除缺失值行数

 c)用合理值代替缺失值

3.异常值处理

四、机器学习(分类模型)

1.决策树

a)建立决策树模型

b)模型评估

c)参数优化

d)重新建立模型

e)决策树可视化 

2.贝叶斯

 3.神经网络

a)sklearn神经网络

b)Tensorflow学习神经网络

c)准确率与损失值可视化

4.三个模型总体一览

五、错误与总结

1.相关性分析

2.异常值处理问题

3.贝叶斯与神经网络模型的优化问题

六、参考资料

 七、源码


一、准备数据

1.查看数据

皮马印第安人糖尿病数据集(Pima Indians Diabetes Dataset)

https://blog.csdn.net/weixin_39877898/article/details/110690932

皮马印第安人糖尿病数据集涉及基于给定的医疗措施预测皮马印第安人5年内糖尿病的发病情况。这是一个二分类问题,每一类对应的观测值数量并不均衡。该数据集共有768组观测值,每组观测值有8个输入变量和1个输出变量。变量名称及含义如下所示:

0列为怀孕次数;

1列为口服葡萄糖耐量试验中2小时后的血浆葡萄糖浓度;

2列为舒张压(单位:mm Hg)

3列为三头肌皮褶厚度(单位:mm)

4列为餐后血清胰岛素(单位:mm)

5列为体重指数(体重(公斤)/ 身高(米)^2)

6列为糖尿病家系作用

7列为年龄

8列为分类变量(0或1)

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

二、数据探索性分析

1.数据描述型分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

从最小值可以判断出肯定存在无意义的零值作为缺失值处理

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

2.各特征值与结果的关系

a)研究各个特征值本身类别

研究各个特征值类别,遍历数据集每个特征值

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

b)研究怀孕次数特征值与结果的关系

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

本来应该生成17个图,但由于缺失值未处理,以及怀孕次数特征值中有部分类别完全为1或者0,因此有部分饼图绘制不出。因此会有报错,但是没有问题的特征值图照常显示。

c)其他特征值

由于该数据类型大部分为数值型数据,因此其他特征值的饼图不具备参考意义所以没有进行绘制饼图实验。

3.研究各特征互相的关系

a)相关性研究

根据相关性图的研究,不难看出各个指标相关性并未重复相关,因此在这里不选择去掉某一属性

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

b)关系矩阵图

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

三、数据预处理

1.去掉唯一属性

无唯一属性值

2.处理缺失值

a)标记缺失值

 查看是否存在缺失值

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

具体来说,以下列具有无效的零最小值,输出无效零值

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

标记缺失值

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

查看是否已标记缺失值

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

标记成功

b)删除缺失值行数

对于缺失值少的删除其所在行(Glucose)(BMI)

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

得到如下结果:

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

 c)用合理值代替缺失值

对于缺失值较多的用合理值代替缺失值(Pregnancies)(BloodPressure(SkinThickness)(Insulin)

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

最终处理结果(data1)

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

3.异常值处理

查看是否存在异常值

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

判断应该不存在异常值,原因是该数据集中异常值判断需要专业的医学知识,因此判断不出异常值

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

四、机器学习(分类模型)

1.决策树

a)建立决策树模型

首先先将数据集分为训练集与测试集,按照七比三分

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

接着开始建立决策树模型

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

b)模型评估

参数评估得到准确率

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

c)参数优化

通过网格搜索函数

可以看见最优准确率为:0.8256813602634037

最优参数为:

{'criterion': 'gini',

'max_depth': 6,

'min_impurity_decrease': 0.0,

 'min_samples_leaf': 26,

 'splitter': 'best'}

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

d)重新建立模型

参数优化了0.03

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

e)决策树可视化 

导入相关函数,可视化决策树

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

在小黑框中将dot文件解码成png文件

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

结果如下

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

2.贝叶斯

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

 3.神经网络

a)sklearn神经网络

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

b)Tensorflow学习神经网络

(此处属于进一步学习,参照了B站基于神经网络的垃圾分类 v.2021 - 人工智能垂直领域工程项目案例库)

训练过程

第一步开始进行100次训练

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

结果展示

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

第100次训练的时候准确率为0.7243,测试集的准确率为0.7345

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

c)准确率与损失值可视化

测试集准确率与训练集准确率相差不大,因此模型训练没有出现问题

先绘制可视化训练集和测试集准确率变化情况图

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

        结果如下图所示:

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

再绘制可视化训练集和测试集损失值变化情况图

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

结果如下图所示:

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

4.三个模型总体一览

数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析

五、错误与总结

1.相关性分析

相关性这里其实是有少数几个属性相关性达到了0.60以上,严谨做法应该删掉其中一个属性,但由于时间关系并未进行深入研究,因此并未对这几个属性进行深入研究

2.异常值处理问题

从学术意义上来讲,异常值的判定要与数据基本属性匹配,在该糖尿病数据集中作为非医学类学生不具备相应的知识储备,因此异常值仅仅只能表示出来,无法判断数据中异常值的存在。所以下一个实验也会有倾向性的选择数据集

3.贝叶斯与神经网络模型的优化问题

没有找到相关资料去优化贝叶斯与神经网络模型,因此无法将该两个模型做进一步准确率优化

六、参考资料

决策树参考:决策树系列(四)——基于决策树算法实现员工离职率预测_初一的博客-CSDN博客

鸢尾花示例:鸢尾花(iris)数据集分析 - 简书

数据预处理:How to Handle Missing Data with Python

神经网络深度学习:

【开源】基于神经网络的垃圾分类 v.2021 - 人工智能垂直领域工程项目案例库_哔哩哔哩_bilibili

 七、源码

# 导入相关包

import numpy as np

import pandas as pd

from numpy import nan

#%matplotlib inline

import matplotlib.pyplot as plt

plt.style.use('seaborn')

import seaborn as sns

sns.set_style("whitegrid")

#决策树

from sklearn.tree import DecisionTreeClassifier as DTC

from sklearn.tree import export_graphviz

#贝叶斯

from sklearn.naive_bayes import  GaussianNB

#神经网络

from sklearn.neural_network import MLPClassifier

#统计

from sklearn.impute import SimpleImputer

from sklearn.model_selection import GridSearchCV

from sklearn import metrics

from sklearn.model_selection import train_test_split

#Tensorflow神经网络

from keras.models import Sequential

from keras.layers.core import Dense, Activation

# 导入数据集

#查看数据

diabetes = pd.read_csv('D:\数据挖掘\实验一\diabets.csv')

diabetes.info()

#print(diabetes.describe())

#数据探索

#直方图

for k in ['Pregnancies','Glucose','BloodPressure','SkinThickness','Insulin','BMI']:

    plt.figure(figsize=(15,5))

    sns.barplot(diabetes[k]. value_counts().index,diabetes[k].value_counts().values)

    plt.title(k)

   

#饼图

#绘制饼图

#此处由于数据特性需要手动设置断点

#怀孕次数与是否患糖尿病的关系

fig = plt.figure(figsize=(25,15))#建立图像

l1 = list(diabetes['Pregnancies'].unique())

for i,j in enumerate(l1):

    ax = fig.add_subplot(5,4,i+1)

    p = diabetes[diabetes['Pregnancies'] == j]['Outcome'] .value_counts() #计算怀孕次数J特征值所对应的目标特征outcome的特征值数量

    ax.pie(p,labels=['no','yes'],autopct='%0.2f%%',explode=(0,0.2)) #绘画怀孕次数各个特征值

    ax.set_title(j)

plt.show()文章来源地址https://www.toymoban.com/news/detail-503211.html

   

 #各特征值与结果的关系

# 设置颜色主题

antV = ['#1890FF', '#2FC25B', '#FACC14', '#223273', '#8543E0', '#13C2C2', '#3436c7', '#F04864']

#生成各特征之间的关系矩阵图

g = sns.pairplot(data=diabetes, palette=antV)

# 查看特征间的相关性

pearson_mat = diabetes.corr(method='spearman')

plt.figure(figsize=(15,15))

ax = sns.heatmap(pearson_mat,square=True,annot=True,cmap='YlGnBu')

bottom, top = ax.get_ylim()

ax.set_ylim(bottom + 0.5, top - 0.5)

plt.show()

  

#数据预处理

#缺失值处理

# 按列统计零的值

num_missing = (diabetes == 0).astype(int).sum(axis=0)

# 输出结果

print(num_missing)

#用NAN标记0值

diabetes[['Pregnancies','Glucose','BloodPressure','SkinThickness','Insulin','BMI']] = diabetes[['Pregnancies','Glucose','BloodPressure','SkinThickness','Insulin','BMI']].replace(0, nan)

print(diabetes.head(20))

#处理缺失值少的特征值删除这两列中缺失值对应的行数

data = diabetes.dropna(axis=0,subset = ["Glucose", "BMI"])

print(data)

#查看删除缺失值后的缺失值统计

print(data.isnull().sum())

# 用平均列值填充缺少的值

values = data.values

#定义插补器

imputer = SimpleImputer(missing_values=nan, strategy='mean')

#转换数据集

datas = imputer.fit_transform(values)

data1 = pd.DataFrame(datas)

#查看补足缺失值后的缺失值统计

data1_num_missing = (data1 == 0).astype(int).sum(axis=0)

print(data1_num_missing)

data1.info()

#异常值处理

# 异常值处理

numeric_columns = []

object_columns = []

for c in data1.columns[0:-1]:

    if data1[c].dtype == 'object':

        object_columns.append(c)

    else:

        numeric_columns.append(c)

fig = plt.figure(figsize=(20,20))

for i,col in enumerate(numeric_columns):

    ax = fig.add_subplot(5,3,i+1)

    sns.boxplot(data1[col],orient='v',ax=ax)

    plt.xlabel(col)

plt.show()

#数据挖掘

#数据拆分为测试集与训练集

# 载入特征和标签集

X = data1[[0,1,2,3,4,5,6,7]]

y = data1[8]

#将数据集按照7:3的比例进行拆分

train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.3, random_state = 101)

print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)

#检测不同模型的准确性

#决策树

#建立决策树模型,基于信息熵

dtc = DTC(criterion='entropy')

dtc.fit(train_X, train_y) #训练模型

prediction = dtc.predict(test_X)

#此模型计算的准确率

print('The accuracy of the Decision Tree is: {0}'.format(metrics.accuracy_score(prediction,test_y)))

l2 = ['Pregnancies','Glucose','BloodPressure','SkinThickness','Insulin','BMI','DiabetesPedigreeFunction','Age']

#[*zip(l2,dtc.feature_importances_)]#显示每个特征值的重要性

# 使用网格搜索寻找最优参数对模型进行优化

gini_thresholds = np.linspace(0,0.5,20)

parameters = {

    'splitter':('best','random')

    ,'criterion':("gini","entropy")

    ,"max_depth":[*range(1,10)]

    ,'min_samples_leaf':[*range(1,50,5)]

    ,'min_impurity_decrease':[*np.linspace(0,0.5,20)]

}

clf = DTC(random_state=25)

GS = GridSearchCV(clf, parameters, cv=10,scoring='roc_auc')

GS.fit(train_X, train_y)

print(GS.best_score_)

print(GS.best_params_)

#重新建立模型

dtc_1 = DTC(

criterion ='gini',

max_depth = 6,

min_impurity_decrease=0.0,

min_samples_leaf = 26,

splitter = 'best'

)

dtc_1.fit(train_X, train_y) #训练模型

prediction = dtc_1.predict(test_X)

#此模型计算的准确率

print('The accuracy of the Decision Tree is: {0}'.format(metrics.accuracy_score(prediction,test_y)))

#导入相关函数,可视化决策树

x = pd.DataFrame(data1)

with open('D:/数据挖掘/实验一/diabetes.dot','w',encoding='utf-8')as f:

    f = export_graphviz(dtc,feature_names=l2,class_names=['0', '1'],out_file=f,rounded=True)

#贝叶斯

clf = GaussianNB()

clf.fit(train_X, train_y)

prediction = clf.predict(test_X)

#获取两个类别的先验概率

print('两个类别的先验概率:',clf.class_prior_ ) 

#此模型计算的准确率

print('The accuracy of the NaiveBayes is{0}'.format(metrics.accuracy_score(prediction,test_y)))

#神经网络

#sklearn学习神经网络

mlp=MLPClassifier(solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(10,5))

mlp.fit(train_X, train_y)

prediction = mlp.predict(test_X)

print('The accuracy of the neural network is{0}'.format(metrics.accuracy_score(prediction,test_y)))

#Tensorflow学习神经网络

#建立模型

mlp1 = Sequential()

# 通过.add()方法一个个的将layer(层)加入模型中

mlp1.add(Dense(input_dim = 8,units = 7))  # Dense表示全连接层 units为隐藏层的单元数

mlp1.add(Activation('relu'))  # 用relu函数作为激活函数,能够大幅度提高准确度

mlp1.add(Dense(input_dim = 7,units = 1))

mlp1.add(Activation('sigmoid'))  # 由于所示0-1输出,用sigmoid函数作为激活函数

# 编译 优化器optimizer,损失函数loss,指标列表metrics(性能评估)

mlp1.compile(loss = 'binary_crossentropy',optimizer = 'adam',metrics = ['accuracy'])

#准确率与损失值可视化

# 训练模型,学习100次  batch_size就是每批处理的样本的个数

history_fit = mlp1.fit(train_X, train_y,epochs = 100,batch_size = 10,validation_data = (test_X,test_y))

# 将训练过程的中间信息保留为json文件

with open(r'D:/数据挖掘/实验一/history_fit.json',"w") as json_file:

    json_file.write(str(history_fit))

# 查看训练集准确率变化

acc = history_fit.history['accuracy']

# 查看测试集准确率变化

val_acc = history_fit.history['val_accuracy']

# 查看训练集损失值变化

loss = history_fit.history['loss']

# 查看测试集损失值变化

val_loss = history_fit.history['val_loss']

# 可视化训练集和测试集准确率变化情况

epochs = range(1,len(acc) + 1)

plt.figure("acc")

plt.plot(epochs,acc,'r-',label = 'Training acc')

plt.plot(epochs,val_acc,'b',label = 'validation acc')

plt.title("The comparision of train_acc and val_acc")

plt.legend()

plt.show()

# 可视化训练集和测试集损失值变化情况

plt.figure("loss")

plt.plot(epochs,loss,'r-',label = 'Training loss')

plt.plot(epochs,val_loss,'b',label = 'validation loss')

plt.title("The comparision of train_loss and val_loss")

plt.legend()

plt.show()

到了这里,关于数据挖掘-实战记录(一)糖尿病python数据挖掘及其分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据分析案例-基于Adaboost算法构建糖尿病预测模型

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集

    2024年02月06日
    浏览(77)
  • 糖尿病预测模型-Pima印第安人数据集-论文_企业科研

    糖尿病概述 糖尿病有一型和二型,是由于胰腺分泌胰岛素紊乱或人体无法有效利用其产生的胰岛素而发生的一种慢性疾病,是21世纪人类面临的健康问题之一.糖尿病伴有弥漫性并发症,其包括心血管病变、肾脏疾病、高血压、中风等、眼部疾病、下肢截肢上百种,由此增

    2024年02月09日
    浏览(44)
  • 大数据分析案例-基于LightGBM算法构建糖尿病确诊预测模型

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集

    2024年02月11日
    浏览(49)
  • 互联网加竞赛 基于机器学习与大数据的糖尿病预测

    🔥 优质竞赛项目系列,今天要分享的是 基于机器学习与大数据的糖尿病预测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-

    2024年01月16日
    浏览(48)
  • 计算机毕设 基于机器学习与大数据的糖尿病预测

    # 1 前言 🚩 基于机器学习与大数据的糖尿病预测 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 本项目的目的主要是对糖尿病进行预测。主要依托某医院体检数据(处理后),首先进行了数据的描述性统计。后续针对数据的特征进行特

    2024年02月11日
    浏览(45)
  • 机器学习基础14-算法调参(基于印第安糖尿病Pima数据集)

    机器学习的模型都是参数化的,可以通过调参来提高模型的准确度。 模型有很多参数,如何找到最佳的参数组合,可以把它当作一个查询问题来处理,但是调整参数到何时为止呢?应该遵循偏差和方差协调的原则。 接下来将介绍在 scikit-learn 中设置机器学习模型最佳参数的方

    2024年02月10日
    浏览(50)
  • 数据分析毕业设计 大数据糖尿病预测与可视化 - 机器学习 python

    # 1 前言 🚩 基于机器学习与大数据的糖尿病预测 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 选题指导,项目分享: https://gitee.com/yaa-dc/warehouse-1/blob/master/python/README.md 本项目的目的主要是对糖尿病进行预测。主要依托某医院体检数

    2024年02月08日
    浏览(55)
  • 机器学习基础11-算法比较(基于印第安糖尿病Pima Indians 数据集)

    比较不同算法的准确度,选择合适的算法,在处理机器学习的问题时是非常重要的。本节将介绍一种模式,在scikit-learn中可以利用它比较不同的算法,并选择合适的算法。你可以将这种模式作为自己的模板,来处理机器学习的问题;也可以通过对其他不同算法的比较,改进这

    2024年02月11日
    浏览(40)
  • 机器学习基础09-审查分类算法(基于印第安糖尿病Pima Indians数据集)

    算法审查是选择合适的机器学习算法的主要方法之一。审查算法前并 不知道哪个算法对问题最有效,必须设计一定的实验进行验证,以找到对问题最有效的算法。本章将学习通过 scikit-learn来审查六种机器学习的分类算法,通过比较算法评估矩阵的结果,选择合适的算法。 审

    2024年02月11日
    浏览(41)
  • 机器学习基础13-基于集成算法优化模型(基于印第安糖尿病 Pima Indians数据集)

    有时提升一个模型的准确度很困难。如果你曾纠结于类似的问题,那 我相信你会同意我的看法。你会尝试所有曾学习过的策略和算法,但模型正确率并没有改善。这时你会觉得无助和困顿,这也是 90%的数据科学家开始放弃的时候。不过,这才是考验真本领的时候!这也是普

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包