数据分析:基于K-近邻(KNN)对Pima人糖尿病预


专栏案例:数据分析
数据分析:某电商优惠卷数据分析
数据分析:旅游景点销售门票和消费情况分析
数据分析:消费者数据分析
数据分析:餐厅订单数据分析
数据分析:基于随机森林(RFC)对酒店预订分析预测

文章目录

  • 数据分析:基于K-近邻(KNN)对Pima人糖尿病预测分析
  • 一、前言
  • 二、数据准备
  • 三、数据预处理
  • 四、建立模型
  • 五、模型验证
  • 总结

一、前言

k-近邻算法是分类数据最简单最有效的算法,k-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数据。k-近邻算法必须保存全部数据集,如果训练数据集的很大,必须使用大量的存储空间。此外,由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时。k-近邻算法的另一个缺陷是它无法给出任何数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。

二、数据准备

1.数据准备
在这里插入图片描述
2.导入数据

import pandas as pd
import warnings
warnings.filterwarnings("ignore")

data = pd.read_csv("../input/Diabetes/pima-indians-diabetes.csv")
data.head()

在这里插入图片描述

data.shape

在这里插入图片描述

三、数据预处理

1.将每一列的标签重新命名

data.columns = ["Pregnancies","Glucose","BloodPressure","SkinThickness","Insulin","BMI","DiabetesPedigreeFunction","Age","Outcome"]

data.head()

在这里插入图片描述
2.查看有没有空值数据

data.isnull().any()

在这里插入图片描述

3.观察样本中阳性和阴性的个数

data.groupby("Outcome").size()

在这里插入图片描述

4.分离特征和标签

X=data.iloc[:,0:8]
Y=data.iloc[:,8]
X=np.array(X)
Y=np.array(Y)

print("X:",X)
print('\n')
print("Y",Y)

在这里插入图片描述
在这里插入图片描述

5.划分训练集和测试集

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier,RadiusNeighborsClassifier
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.2)

四、建立模型

models = []
models.append(("KNN",KNeighborsClassifier(n_neighbors=2)))
models.append(("KNN with weights",KNeighborsClassifier(n_neighbors=2,weights="distance")))
models.append(("Radius Neighbors",RadiusNeighborsClassifier(n_neighbors=2,radius=500.0)))
models

在这里插入图片描述
分别训练三个模型,计算平均评分

results = []
for name,model in models:
    model.fit(X_train,Y_train)
    results.append((name,model.score(X_test,Y_test)))

for i in range(len(results)):
    print("name:{},score:{}".format(results[i][0],results[i][1]))

在这里插入图片描述

利用交叉验证准确对比算法的精确性

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
results = []
for name,model in models:
    Kfold = KFold(n_splits=10)
    cv_result = cross_val_score(model,X_train,Y_train,cv=Kfold)
    results.append((name,cv_result))

for i in range(len(results)):
    print("name:{};cross_val_score:{}".format(results[i][0],results[i][1].mean()))

在这里插入图片描述

通过以上结果显示,普通KNN算法的性能更优一些,接下来用普通KNN进行训练

五、模型验证

knn =KNeighborsClassifier(n_neighbors=2)
knn.fit(X_train,Y_train)

在这里插入图片描述

train_score = knn.score(X_train,Y_train)
test_score = knn.score(X_test,Y_test)
print("train_score:{};test score:{}".format(train_score,test_score))

在这里插入图片描述

以上结果显示表明,训练样本的拟合情况不佳,模型的准确性欠佳
通过画学习率曲线来观察这一结论.

from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import learning_curve

import matplotlib.pyplot as plt
%matplotlib inline
knn = KNeighborsClassifier(n_neighbors=2)
cv= ShuffleSplit(n_splits=10,test_size=0.2,random_state=0)
plt.figure(figsize=(10,6),dpi=200)
plot_learning_curve(knn,"Learning Curve for KNN Diabetes",X,Y,ylim=(0.0,1.01),cv=cv)
plt.show()

在这里插入图片描述

学习曲线分析
从图中可以看出来,训练样本的评分较低,且测试样本与训练样本距离较大,这是典型的欠拟合现象,KNN算法没有更好的措施解决欠拟合的问题,可以尝试用其他的分类器。

总结

k-近邻算法是分类数据最简单最有效的算法,k-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数据。k-近邻算法必须保存全部数据集,如果训练数据集的很大,必须使用大量的存储空间。此外,由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时。k-近邻算法的另一个缺陷是它无法给出任何数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。