当前位置:   article > 正文

KNN算法实战,对糖尿病进行预测_如何训练cnn模型预测血糖

如何训练cnn模型预测血糖

算法原理:

KNN的输入是测试数据和训练样本数据集,输出是测试样本的类别。KNN没有显示的训练过程,在测试时,计算测试样本和所有训练样本的距离,根据最近的K个训练样本的类别,通过多数投票的方式进行预测。

数据集:

对Pima印第安人的糖尿病进行预测,数据来源于Kaggle,糖尿病数据集

对数据集的处理:

首先使用pandas加载数据集,并输出形状以及前五行吗,以及阳性和阴性的样本数量

  1. data = pd.read_csv("diabetes.csv")
  2. print("Data shape: {}".format(data.shape))
  3. print(data.head(5))
  4. print(data.groupby("Outcome").size())

输出结果如下:

阴性样本为500例,阳性样本268例。接着,需要对数据集进行简单的处理,把8个特征值分离出来,作为训练数据集,把Outcome列分离出来作为目标值。然后,把数据集划分为训练集和测试集

  1. X = data.iloc[:, 0:8]
  2. y = data.iloc[:, 8]
  3. print("Shape of X: {}, Shape of Y: {}".format(X.shape, y.shape))
  4. from sklearn.model_selection import train_test_split
  5. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

knn拟合数据集:

使用knn算法对数据进行拟合,并进行评分

  1. knn_clf = KNeighborsClassifier(n_neighbors=2)
  2. knn_clf.fit(X_train, y_train)
  3. train_score = knn_clf.score(X_train, y_train)
  4. test_score = knn_clf.score(X_test, y_test)
  5. print("train score=", train_score, "test score=", test_score)

输出结果如下

由于训练样本和测试样本是随机分配的,不同的训练样本和测试样本的组合可能导致最后计算出来的算法准确性存在差异,所以多次随机分配训练集和验证集,然后求模型准确性评分的平均值。我们可以利用scikit-learn提供的KFoldcross_val_score()函数来解决此问题:

  1. kfold = KFold(n_splits=10)
  2. cv_result = cross_val_score(knn_clf, X, y, cv=kfold)
  3. print("cross val score=", cv_result.mean())

输出结果如下:

我们可以进一步画出学习曲线以供更好的观察模型:

  1. def plot_learning_curve(estimator, title, X, y,
  2. ylim=None, cv=None,n_jobs=None,
  3. train_sizes=np.linspace(.1, 1.0, 5)):
  4. plt.figure()
  5. plt.title(title)
  6. if ylim is not None:
  7. plt.ylim(*ylim)
  8. plt.xlabel("Training examples")
  9. plt.ylabel("Score")
  10. train_sizes, train_scores, test_scores = learning_curve(estimator, X, y,
  11. cv=cv, n_jobs=n_jobs,
  12. train_sizes=train_sizes)
  13. train_scores_mean = np.mean(train_scores, axis=1)
  14. train_scores_std = np.std(train_scores, axis=1)
  15. test_scores_mean = np.mean(test_scores, axis=1)
  16. test_scores_std = np.std(test_scores, axis=1)
  17. plt.grid()
  18. plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
  19. train_scores_mean + train_scores_std,
  20. alpha=0.1, color="r")
  21. plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
  22. test_scores_mean + test_scores_std,
  23. alpha=0.1, color="g")
  24. plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
  25. label="Training score")
  26. plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
  27. label="Cross-validation score")
  28. plt.legend(loc="best")
  29. return plt
  30. knn_clf = KNeighborsClassifier(n_neighbors=2)
  31. cv = ShuffleSplit(n_splits=10, test_size=0.2, random_state=0)
  32. plot_learning_curve(knn_clf, "Learning Curve for KNN Diabetes",
  33. X, y, (0.0, 1.01), cv=cv)
  34. plt.show()

更多实验:

更换不同的neighbors观察结果:

neighbors = 1时:

可以观察到训练时预测精度很高,但是测试时就很低,是非常典型的过拟合现象。

neighbors = 3 时:

neighbors = 5时:

可以观察到当neighbors的值取得较高时,训练精度也欠佳,测试精度也不好,是非常典型都的欠拟合现象。

由于算法的局限性,knn并没有很好的措施能够解决上述两种问题。

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

闽ICP备14008679号