项目介绍

这次我们要学习的项目是糖尿病的预测,数据保存在diabetes.csv文件中。数据一共有8个特征和1个标签:

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

首先先载入一些常用模块

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

然后用pandas读入数据

diabetes_data = pd.read_csv('diabetes.csv')

diabetes_data.head()

# 查看数据信息

diabetes_data.info(verbose=True)

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

我们从上面可以看到一共有768个数据,并且所有的特征和标签都是768个值,所有没有缺失数据。并且所有数据都是数值类型(int64 or float64)的数据。

# 数据描述

diabetes_data.describe()

通过describe我们可以观察到数据的数量,平均值,标准差,最小值,最大值等数据。

# 数据形状

diabetes_data.shape

(768, 9)

# 查看标签分布

print(diabetes_data.Outcome.value_counts())

# 使用柱状图的方式画出标签个数统计

p=diabetes_data.Outcome.value_counts().plot(kind="bar")

0    500

1    268

Name: Outcome, dtype: int64

# 可视化数据分布

p=sns.pairplot(diabetes_data, hue = 'Outcome')

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

# 把葡萄糖,血压,皮肤厚度,胰岛素,身体质量指数中的0替换为nan

colume = ['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI']

diabetes_data[colume] = diabetes_data[colume].replace(0,np.nan)

# 查看数据空值情况

import missingno as msno

p=msno.bar(diabetes_data)

图中可以看到葡萄糖,血压,皮肤厚度,胰岛素,身体质量指数都是存在空值的,并且皮肤厚度和胰岛素中的空值特别多。

# 设定阀值

thresh_count = diabetes_data.shape[0]*0.8

# 若某一列数据缺失的数量超过20%就会被删除

diabetes_data = diabetes_data.dropna(thresh=thresh_count, axis=1)

p=msno.bar(diabetes_data)

把空值超过20%的特征都去除掉之后,只剩下6个特征。

# 导入插补库

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.figure(figsize=(12,10))

# 画热力图,数值为两个变量之间的相关系数

p=sns.heatmap(diabetes_data.corr(), annot=True)

热力图可能也需要放大来看,它是表示两个数据之间的相关性,数值范围是-1到1之间,大于0表示两个数据是正相关的,小于0表示两个数据是负相关的,等于0就是不相关。我们可以看到有一条对角线上的数值都是1,两个数据如果是相同的两个数据,那么他们的相关系数就是1。并且这个相关系数矩阵是对称的。

我们可以观察到一些比较明显的特征,比如Age年龄跟Pregnancies怀孕次数有比较强的相关性,也就是说年龄越大怀孕次数就越多,或者怀孕次数越多年龄就越大,这应该是比较合理的一个情况。

糖尿病的标签Outcome和Glucose葡萄糖测试值正相关系数比较大,也就是说葡萄糖测试值比较高的话,那么就很可能患有糖尿病。

# 把数据切分为特征x和标签y

x = diabetes_data.drop("Outcome",axis = 1)

y = diabetes_data.Outcome from sklearn.model_selection import train_test_split

# 切分数据集,test_size=0.3表示30%为测试集。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)

# 导入KNN算法

from sklearn.neighbors import KNeighborsClassifier

# 保存不同k值测试集准确率

test_scores = []

# 保存不同k值训练集准确率

train_scores = []

x_train_values = x_train.values

y_train_values = y_train.values

# 设置30个k值

k = 30

for i in range(1,k):

knn = KNeighborsClassifier(i)

knn.fit(x_train,y_train)

# 保存测试集准确率

test_scores.append(knn.score(x_test,y_test))

# 保存训练集准确率

train_scores.append(knn.score(x_train,y_train))

plt.title('k-NN Varying number of neighbors')

plt.plot(range(1,k),test_scores,label="Test")

plt.plot(range(1,k),train_scores,label="Train")

plt.legend()

plt.xticks(range(1,k))

plt.xlabel('k')

plt.ylabel('accuracy')

plt.show()

不同k值得到不同的准确率结果。

# 选择一个最好的k值作为模型参数

k = np.argmax(test_scores)+1

knn = KNeighborsClassifier(k)

knn.fit(x_train,y_train)

knn.score(x_test,y_test)

0.8138528138528138

from sklearn.metrics import confusion_matrix

from sklearn.metrics import classification_report

y_pred = knn.predict(x_test)

print(classification_report(y_pred, y_test))

precision    recall  f1-score   support

0       0.88      0.84      0.86       157

1       0.69      0.76      0.72        74

micro avg       0.81      0.81      0.81       231

macro avg       0.79      0.80      0.79       231

weighted avg       0.82      0.81      0.82       231

macro avg:宏平均,所有类的算数平均数micro avg:分母就是输入分类器的预测样本个数,分子就是预测正确的样本个数weighted avg:加权平均,每个类别的权值为:类别suppot/总suppot

confusion = confusion_matrix(y_pred, y_test)

df_cm = pd.DataFrame(confusion)

sns.heatmap(df_cm, annot=True)

混淆矩阵,测试集中非糖尿病被预测为非糖尿病有130例,糖尿病被预测为糖尿病有56例,非糖尿病被预测为糖尿病有25例,糖尿病被预测为非糖尿病有18例子。

项目打包

糖尿病预测项目

百度云:https://pan.baidu.com/s/1nscdWSkU3FqhyGbZAwH6bA

提取码:y91a

python预测糖尿病_实战 | 糖尿病预测项目相关推荐

  1. 精通Python网络爬虫_核心技术框架与项目实战_韦玮.pdf

    精通Python网络爬虫_核心技术框架与项目实战_韦玮 编辑推荐 从技术.工具.实战3个维度讲透Python网络爬虫各项核心技术和主流框架,深度讲解网络爬虫的抓取技术与反爬攻关技巧 内容简介 随着大数 ...

  2. python天气预测算法_使用机器学习预测天气(第二部分)

    概述 这篇文章我们接着前一篇文章,使用Weather Underground网站获取到的数据,来继续探讨用机器学习的方法预测内布拉斯加州林肯市的天气 上一篇文章我们已经探讨了如何收集.整理.清洗数据. ...

  3. python分析比赛_实战项目练习 ---- 【2018世界杯】用python分析夺冠球队

    2018世界杯 前言 在网上找到了个用Python分析2018世界杯夺冠热门的项目,感觉很有意思准备拿来练练手. 因为目前还没有学到图形可视化部分,所以这部分内容会完全借鉴网上的教程. 分析目的 通过 ...

  4. 时间序列预测 预测时间段_应用时间序列预测:美国住宅

    时间序列预测 预测时间段 1.简介 (1. Introduction) During these COVID19 months housing sector is rebounding rapidly ...

  5. 置信区间估计 预测区间估计_估计,预测和预测

    置信区间估计 预测区间估计 Estimation implies finding the optimal parameter using historical data whereas predict ...

  6. opta球员大数据预测胜负_大数据预测简介及使用流程

    中足网大数据预测,是基于中足网以及多家主流数据提供商的数据库,汇总数万场比赛的盘口和热度信息得出的人工智能预测模型,经过专家团数月研制,不断调整算法,命中率已经达到行业内相当高的水平. 1 目前预测玩 ...

  7. python财务报表预测股票价格_机器学习股票价格预测从爬虫到预测-数据爬取部分...

    声明:本文已授权公众号「AI极客研修站」独家发布 前言 各位朋友大家好,小之今天又来给大家带来一些干货了.上篇文章机器学习股票价格预测初级实战是我在刚接触量化交易那会,因为苦于找不到数据源,所以找的一 ...

  8. python预测股票价格_使用机器学习预测股票价格的愚蠢简便方法

    在这篇文章中,我展示了使用H2o.ai框架的机器学习,使用R语言进行股票价格预测的分步方法. 该框架也可以在Python中使用,但是,由于我对R更加熟悉,因此我将以该语言展示该教程. 您可能已经问过自 ...

  9. python神经网络预测股票_用神经网络预测股票市场

    作者:Vivek Palaniappan 编译:NumberOne 机器学习和深度学习已经成为定量对冲基金常用的新的有效策略,以最大化其利润.作为一名人工智能和金融爱好者,这是令人激动的消息,因为它结 ...

最新文章

  1. Arrays.sort 不区分大小写 排序
  2. 使用MNIST数据集,在TensorFlow上实现基础LSTM网络
  3. ARM linux的启动部分源代码简略分析【转】
  4. php使用常量cont,php常量介绍
  5. Python和js之间的转换
  6. 连续获两家乘用车前向定点, 又一家国产毫米波雷达企业欲“赶超”外资巨头
  7. 不同尺寸SMA头介绍以及之间的区别
  8. Otsu详细算法解析
  9. java素数判断1到100_Java 求1-100以内的所有素数,判断一个数是不是素数
  10. python参数类型为uint8_Python 改变数组类型为uint8的实现
  11. OpenCV——相当通俗易懂的SVD奇异值分解
  12. 关于神经网络和深度学习的资料
  13. 【博客话题】人在囧途之“运维囧”
  14. 微带线与带状线的区别
  15. 分布式强化学习方法汇总
  16. yarn unlink 简单使用
  17. 倒数第02周,入书的推荐名单【人人都是产品经理:9071】
  18. 前端Docker部署方案
  19. 当当李国庆谈“刘强东案”:虽煞风景,但划得来
  20. 找出数组中第k大小的数,输出数所在的位置

热门文章

  1. 手机与windows大文件高速传输方法 自用
  2. Ubuntu 各版本代号对照表
  3. exynos4412中断编程
  4. 360图书馆自动全文.
  5. uni-app开发小程序app页面中获取globalData
  6. 开源代码和软件汇总!激光雷达和相机联合标定(2004-2021)
  7. 无源晶振(crystal)和有源晶振(oscillator)的区别
  8. 2021年中国DR设备市场竞争格局分析,未来DR市场将进入发展平台期「图」
  9. 【展馆设计】互动多媒体投影有哪些实用价值
  10. 英文操作系统中,cmd显示中文乱码问题