当前位置:   article > 正文

深度学习零基础实践(多层神经网络)--Pima印第安人糖尿病数据分析(Pima Indians Diabetes Analysis)_pima-indians-diabetes

pima-indians-diabetes

1.数据集来源


需要自己注册一个Kaggle账号才能获取:Pima Indians Diabetes Database | Kaggle

或者从我的百度网盘中获取:

链接:https://pan.baidu.com/s/11HAgMGGHXIUZPZJTPUAKkA 
提取码:wjjd 

2.数据分析

从csv文件中可以看到,最后一列是“是否患病”,前边几列都是影响是否患病的因素。在进行深度学习模型搭建之前,需要进行数据预处理工作,这是非常必要的。

3.代码

本文基于Pytorch框架编程。作者自认为有难度的代码部分都进行了注释,读者可以自行参考。由于作者本人也是一名新手,欢迎大家随时来访,共同交流学习。

  1. import torch
  2. import numpy as np
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. import seaborn as sns
  6. import torch.nn.functional as F
  7. doc = pd.read_csv('G:/diabetes.csv') # 读取数据集信息,改成自己的csv文件所在的目录,不能有中文
  8. # print(doc.head()) # 显示导入的数据前5行 此处必须加print 否则不显示不报错
  9. print(doc.shape[0], doc.shape[1]) # 查看数据集行数和列数 大小为768*9
  10. # 查看是否有空缺值 两种方法 发现没有
  11. # print(doc.isnull().sum())
  12. # print(doc.isna().sum())
  13. # 分别检查数据中有存在零的情况 (怀孕次数不需要检查)如下:
  14. print("Glucose=0: ", doc[doc.Glucose == 0].shape[0]) # 血糖有5例为零,不符合实际情况
  15. print("BloodPressure=0:", doc[doc.BloodPressure == 0].shape[0]) # 血压有35例为零
  16. print("SkinThickness=0:", doc[doc.SkinThickness == 0].shape[0]) # 皮肤厚度有227例为零
  17. print("Insulin=0:", doc[doc.Insulin == 0].shape[0]) # 胰岛素有374例为零
  18. print("BMI=0:", doc[doc.BMI == 0].shape[0]) # BMI有11例为零
  19. print("DiabetesPedigreeFunction=0:", doc[doc.DiabetesPedigreeFunction == 0].shape[0]) # 糖尿病谱系功能无异常
  20. print("Age=0:", doc[doc.Age == 0].shape[0]) # 年龄无异常
  21. # 处理无效值
  22. # 删除 Glucose 和 BMI 中无效的行
  23. doc_next = doc[(doc.Glucose != 0) & (doc.BMI !=0)]
  24. print(doc_next.shape) # 此时数据大小变为 752*9
  25. # 对于确实量大的用平均值填充
  26. def mean_column(feature):
  27. temp = doc_next[doc_next[feature] != 0]
  28. temp = temp[[feature, 'Outcome']].groupby(['Outcome'])[[feature]].mean().reset_index() # 重置索引
  29. return temp
  30. print(mean_column('BloodPressure'))
  31. # 血压数据填充
  32. doc_next.loc[(doc_next['Outcome'] == 0) & (doc_next['BloodPressure'] == 0), 'BloodPressure'] = \
  33. mean_column('BloodPressure')['BloodPressure'][0]
  34. doc_next.loc[(doc_next['Outcome'] == 1) & (doc_next['BloodPressure'] == 0), 'BloodPressure'] = \
  35. mean_column('BloodPressure')['BloodPressure'][1]
  36. # 皮肤厚度数据填充
  37. doc_next.loc[(doc_next['Outcome'] == 0) & (doc_next['SkinThickness'] == 0), 'SkinThickness'] = \
  38. mean_column('SkinThickness')['SkinThickness'][0]
  39. doc_next.loc[(doc_next['Outcome'] == 1) & (doc_next['SkinThickness'] == 0), 'SkinThickness'] = \
  40. mean_column('SkinThickness')['SkinThickness'][1]
  41. # 胰岛素数据填充
  42. doc_next.loc[(doc_next['Outcome'] == 0) & (doc_next['Insulin'] == 0), 'Insulin'] = \
  43. mean_column('Insulin')['Insulin'][0]
  44. doc_next.loc[(doc_next['Outcome'] == 1) & (doc_next['Insulin'] == 0), 'Insulin'] = \
  45. mean_column('Insulin')['Insulin'][1]
  46. # 检验是否还有零值
  47. """
  48. print("Glucose=0: ", doc_next[doc_next.Glucose == 0].shape[0]) # 血糖有5例为零,不符合实际情况
  49. print("BloodPressure=0:", doc_next[doc_next.BloodPressure == 0].shape[0]) # 血压有35例为零
  50. print("SkinThickness=0:", doc_next[doc_next.SkinThickness == 0].shape[0]) # 皮肤厚度有227例为零
  51. print("Insulin=0:", doc_next[doc_next.Insulin == 0].shape[0]) # 胰岛素有374例为零
  52. print("BMI=0:", doc_next[doc_next.BMI == 0].shape[0]) # BMI有11例为零
  53. print("DiabetesPedigreeFunction=0:", doc_next[doc_next.DiabetesPedigreeFunction == 0].shape[0]) # 糖尿病谱系功能无异常
  54. print("Age=0:", doc_next[doc_next.Age == 0].shape[0]) # 年龄无异常
  55. """
  56. # 全部列显示出来
  57. # pd.set_option('display.max_columns', 10)
  58. # print(doc_next.head(10))
  59. # 特征选取
  60. inputs, outputs = doc_next.iloc[:, 0:8], doc_next.iloc[:, 8]
  61. # 归一化
  62. # 输入归一化
  63. inputs_mean = inputs.mean()
  64. inputs_std = inputs.std()
  65. inputs = (inputs - inputs_mean) / inputs_std
  66. # print(inputs.shape, outputs.shape)
  67. # training set and testing set
  68. in_train = inputs.iloc[0:602, :]
  69. in_train = in_train.values # 想转为tensor类型,得把数值提取出来
  70. in_train = torch.tensor(in_train).to(torch.float32) # 将DataFrame类型转换为Tensor类型,然后再转为float32类型,否则无法输入到网络中
  71. out_train = outputs.iloc[0:602]
  72. out_train = out_train.values
  73. out_train = torch.tensor(out_train).to(torch.float32).reshape(602, 1)
  74. in_test = inputs.iloc[602:, :]
  75. in_test = in_test.values
  76. in_test = torch.tensor(in_test).to(torch.float32)
  77. out_test = outputs.iloc[602:]
  78. out_test = out_test.values
  79. out_test = torch.tensor(out_test).to(torch.float32)
  80. # print(in_test.shape, out_test.shape)
  81. # 定义网络
  82. class Net(torch.nn.Module):
  83. def __init__(self):
  84. super(Net, self).__init__()
  85. self.linear1 = torch.nn.Linear(8, 72)
  86. self.linear2 = torch.nn.Linear(72, 64)
  87. self.linear3 = torch.nn.Linear(64, 1)
  88. def forward(self, x):
  89. x = F.relu(self.linear1(x))
  90. x = F.relu(self.linear2(x))
  91. x = F.relu(self.linear3(x))
  92. return x
  93. model = Net()
  94. # 定于损失函数和优化器
  95. criterion = torch.nn.MSELoss(size_average=None)
  96. optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
  97. loss_store = [] # 用于存储每一步的loss值,用于之后的plt绘制
  98. iter = [] # 每执行一步,iter都会加一,否则如果在plt.plot()中直接用epoch或者len(str(loss_store)会出现维度不匹配
  99. def train():
  100. acc = 0
  101. for epoch in range(1001):
  102. iter.append(epoch) # iter空间加一
  103. out_pred = model(in_train) # 将training set输入到网络中,得到输出的predication
  104. # print(out_pred)
  105. loss = criterion(out_pred, out_train) # 计算损失(目标真实值和预测值)
  106. # print(epoch, loss.item())
  107. optimizer.zero_grad() # 梯度清零
  108. loss.backward() # 反向传播
  109. optimizer.step() # 梯度更新
  110. loss_store.append(loss.item()) # 存储loss值
  111. if epoch % 10 == 0:
  112. out_pred_lable = torch.where(out_pred >= 0.5, torch.tensor([1.0]), torch.tensor([0.0])) # condition (bool型张量) :当condition为真,返回x的值,否则返回y的值
  113. # print(out_train)
  114. acc = torch.eq(out_pred_lable, out_train.reshape(602, 1)).sum().item()
  115. print(epoch, loss.item(), 'accuracy: ', 100 * acc / len(in_train))
  116. plt.plot(iter, loss_store)
  117. plt.xlabel('epoch')
  118. plt.ylabel('Loss')
  119. plt.grid() # 显示网格
  120. plt.show() # 这一步必须加,没有就不会出图
  121. def test():
  122. acc = 0
  123. # 测试无需计算梯度
  124. with torch.no_grad():
  125. out_test_pre = model(in_test)
  126. print(out_test_pre.shape)
  127. # predicted = out_test_pre.argmax(dim=0, keepdim=True)
  128. # print(predicted)
  129. out_pred_test_lable = torch.where(out_test_pre >= 0.5, torch.tensor([1.0]), torch.tensor([0.0]))
  130. acc = torch.eq(out_pred_test_lable, out_test.reshape(150, 1)).sum().item()
  131. print('accuracy: ', 100*acc/len(in_test))
  132. if __name__ == '__main__':
  133. train()
  134. # test()

 4.代码运行结果

(1)Loss损失函数曲线

51d80060f2f543e598a5168e2855fcb2.png

(2)损失函数和准确率展示

26131ea2480749499f6b5a1050766aeb.jpeg

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/671175
推荐阅读
相关标签
  

闽ICP备14008679号