赞
踩
利用机器学习算法实现糖尿病数据集的二分类问题。
Pregnancies | 怀孕次数 |
Glucose | 葡萄糖测试值 |
BloodPressure | 血压 |
SkinThickness | 皮肤厚度 |
Insulin | 胰岛素 |
BMI | 身体质量指数 |
DiabetesPedigreeFunction | 糖尿病遗传函数 |
Age | 年龄 |
Outcome | 糖尿病标签,1表示有糖尿病,0表示没有糖尿病 |
- import numpy as py
- import pandas as pd
- import matplotlib.pyplot as plt
- import seaborn as sns
-
- diabetes_data = pd.read_csv('diabetes.csv')
- print(diabetes_data.head())
-
- # 查看数据信息
- print(diabetes_data.info(verbose=True))
- # 设置参数verbose为True,允许冗长信息
-
- # 数据描述
- print(diabetes_data.describe())
- # 通过describe可以观察到数据的数量,平均值,标准差,最小值,最大值等数据
-
- #数据形状
- print("dimension of diabetes data: {}".format(diabetes_data.shape))
-
- #查看标签分布
- print(diabetes_data.Outcome.value_counts())
-
- #使用柱状图的方式画出标签个数统计
- plt.figure()
- diabetes_data.Outcome.value_counts().plot(kind="bar")
-
- plt.figure()
- sns.countplot(diabetes_data['Outcome'], label="Count")
- plt.savefig("0_1_graph")
-
-
- # 可视化数据分布
- # 对角线上是各个属性的直方图(分布图)
- # 而非对角线上是两个不同属性之间的相关图
- plt.figure()
- sns.pairplot(diabetes_data)
- plt.savefig("0_2_graph")
- '''
- sns.pairplot(diabetes_data, hue="Outcome");
- plt.savefig("0_3_grap")
- '''
- # 画热力图,数值为两个变量之间的相关系数
- # annot: 默认为False,为True,在格子上显示数字
- plt.figure()
- sns.heatmap(diabetes_data.corr(), annot=True)
- plt.savefig("0_4_grap")
-
- # KNN算法
- from sklearn.model_selection import train_test_split
-
- X_train,X_test,y_train,y_test=train_test_split(\
- diabetes_data.loc[:,diabetes_data.columns !='Outcome'],\
- diabetes_data['Outcome'],stratify=diabetes_data['Outcome'],random_state=66)
-
- # 把数据切分为特征X和标签y
- # 切分数据集,test_size=0.3表示30%为测试集。
- # stratify=y表示切分后训练集和测试集中的数据类型的比例跟切分前y中的比例一致
- # 如切分前y中0和1的比例为1:2,切分后y_train和y_test中0和1的比例也都是1:2
- #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.3, stratify=y)
-
- from sklearn.neighbors import KNeighborsClassifier
- # 保存不同k值测试集准确率
- training_accuracy = []
- # 保存不同k值训练集准确率
- test_accuracy = []
- # try n_neighbors from 1 to 10
- neighbors_settings = range(1,11)
-
- for n_neighbors in neighbors_settings:
- # build the model
- knn = KNeighborsClassifier(n_neighbors = n_neighbors)
- knn.fit(X_train,y_train)
- #record training set accuracy 保存训练集准确率
- training_accuracy.append(knn.score(X_train,y_train))
- #record test set accuracy 保存测试集准确率
- test_accuracy.append(knn.score(X_test,y_test))
- plt.figure()
- plt.plot(neighbors_settings,training_accuracy,label="training accuracy")
- plt.plot(neighbors_settings,test_accuracy,label="test accuracy")
- plt.ylabel("Accuracy")
- plt.xlabel("n_neighbors")
- plt.legend() # 给图像加上图例
- plt.savefig('knn_compare_model')
-
- knn = KNeighborsClassifier(n_neighbors=9)
- knn.fit(X_train,y_train)
-
- print('Accuracy of K-NN classifier on training set:{:.2f}'.format(\
- knn.score(X_train,y_train)))
- print('Accuracy of K-NN classifier on training set:{:.2f}'.format(\
- knn.score(X_test,y_test)))
-
- 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))
-
- confusion = confusion_matrix(y_pred, y_test)
- df_cm = pd.DataFrame(confusion)
- plt.figure()
- sns.heatmap(df_cm, annot=True)
- plt.savefig('confusion_matrix')
- plt.show()
-
从上述热力图可以看出一些明显的特征,如糖尿病的标签Outcome和葡萄糖测试值Glucose正相关系数比较大,说明葡萄糖测试值高的话,有可能患有糖尿病。同理,年龄Age和怀孕次数Pregnancies之间的相关性也比较强。
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None):其中,y_true:是样本真实分类结果,y_pred 是样本预测分类结果 ,labels是所给出的类别,通过这个可对类别进行选择 ,sample_weight 是样本权重。
混淆矩阵可以看出,测试集中非糖尿病被预测为非糖尿病有100例,糖尿病被预测为糖尿病有44例,非糖尿病被预测为糖尿病有23例,糖尿病被预测为非糖尿病有20例。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。