怎样选择一个最佳的 k呢?
在这里我们要使用机器学习中的神器:参数学习曲线。
参数学习曲线是一条以不同的参数取值为横坐标,不同参数取值下的模型结果为纵坐标的曲线

# 1. 导入所需要的模块和库
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 2. 建立数据集
data = load_breast_cancer()
X = data.data
y = data.target
X_train,X_test,y_train,y_test = train_test_split(X,y,# 特征和标签test_size=0.3,random_state=420)  # 测试集所占的比例
# 3. 绘制学习曲线
# 设置两个列表保存生成的评估结果
train_score_list = []
test_score_list = []
# 循环不断改变k值, 重新建模, 重新训练, 然后评估
# k = 1- 20
for k in range(1, 21):# 实例化knn = KNeighborsClassifier(n_neighbors=k)# 采用训练集进行训练knn.fit(X_train, y_train)# 评估模型# 可以评估模型在训练集上的表现情况train_score_list.append(knn.score(X_train, y_train))# 评估在测试集上的表现情况test_score_list.append(knn.score(X_test, y_test))
# 4. 绘制成折线图
plt.figure(dpi=200)
plt.plot(range(1, 21), train_score_list, label='train_score');
plt.plot(range(1, 21), test_score_list, label='test_score');
plt.xlabel('k_value')
plt.ylabel('socre')
plt.legend();
# 5. 评估模型在测试集的最优得分
max(test_score_list)
# 6. 求最大值对应的k值
print(np.argmax(test_score_list)+1) # argmax找出最大值的索引值

KNN最优k的选取【交叉验证】
一、K折交叉验证

最常用的交叉验证是 K 折交叉验证。我们知道训练集和测试集的划分会干扰模型的结果,因此用交叉验证 K 次的结果求出的均值,是对模型效果的一个更好的度量。

其中:是每次的模型评分。绿块表示的是测试数据,灰块表示的是训练数据。
图中直观地展示了K折交叉验证的整个过程:将数据集拆成了10个小块(9灰块+1绿块),这里每一小块作为一个数据子集,所以K=10,这是一个10折交叉验证的过程。

(1)第一次测试中:取倒数第一个子集(第一行中的绿块)作为测试数据,其余9块(第一行中的灰块)的子集作为训练数据,用来训练模型。并且得到第一次测试的模型评分。
(2)第二次测试中:取倒数第二个子集(第二行中的绿块)作为测试数据,其余9块(第二行中的灰块)的子集用来训练模型,得到第二次测试的模型评分E2。
(3)以此类推,直到把10个数据集用完,这样我们就会得到10个模型的评分,求10次评分的平均值即为交叉验证结果。

二、随机种子的问题 [补充]

思考: 确定了KNN算法的超参数之后,你会发现, 如果不固定随机数种子random_state的话, 每次运行的时候学习曲线都在变化,模型的效果时好时坏,这是为什么呢?

原因: 实际上,这是由于「训练集」和「测试集」的划分不同造成的。不设置随机种子的话,模型每次都会随机选取等比例的训练集和测试集,也就是说模型每次都使用不同的训练集进行训练,不同的测试集进行测试,自然也就会有不同的模型结果。
采用交叉验证方法确定KNN最优k
(1)导入所需要的模块和库

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score

(2)建立数据集

data = load_breast_cancer()
X = data.data
y = data.target
X_train,X_test,y_train,y_test = train_test_split(X,y,# 特征和标签test_size=0.3,random_state=420)  # 测试集所占的比例

(3)实例化

knn = KNeighborsClassifier(n_neighbors=8)

(4)计算交叉验证得分

val_scores = cross_val_score(knn, X_train, y_train, cv=5)#cv: 几折交叉验证.
val_scores
# 交叉验证平均分数
cross_val_score(knn, X_train, y_train, cv=5).mean()

一、带交叉验证的学习曲线的代码实操:
(1)导入所需要的模块和库

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score

(2)建立数据集

data = load_breast_cancer()
X = data.data
y = data.target
X_train,X_test,y_train,y_test = train_test_split(X,y,# 特征和标签test_size=0.3,random_state=420)  # 测试集所占的比例

(3)绘制学习曲线

# 设置两个列表保存生成的评估结果
train_score_list = []
test_score_list = []
score = []
var = []
# 循环不断改变k值, 重新建模 , 重新训练, 然后评估
# k = 1- 20
for k in range(1, 21):# 实例化knn = KNeighborsClassifier(n_neighbors=k)# 采用训练集进行训练knn.fit(X_train, y_train)# 评估模型# 可以评估模型在训练集上的表现情况train_score_list.append(knn.score(X_train, y_train))# 评估在测试集上的表现情况test_score_list.append(knn.score(X_test, y_test))# 交叉验证平均分数cross = cross_val_score(knn, X_train, y_train, cv=5)score.append(cross.mean()) # 每次交叉验证返回的得分数组,再求数组均值var.append(cross.var())

(4)绘制成折线图

plt.figure(dpi=200)
plt.plot(range(1, 21), train_score_list, label='train_score');
plt.plot(range(1, 21), test_score_list, label='test_score');
plt.plot(range(1, 21), score, color='g',label='cross_score');
plt.plot(range(1, 21),np.array(score)+np.array(var)*2,c='red',linestyle='--')
plt.plot(range(1, 21),np.array(score)-np.array(var)*2,c='red',linestyle='--')
plt.xlabel('k_value')
plt.ylabel('socre')
plt.legend();

(5)最大分数对应的k值

np.argmax(score)+1

(6)最高分数值

max(score)

数据归一化概念

当数据(x)按照最小值中心化后,再按极差(最大值-最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就称作数据归一化(Normalization,又称Min-Max Scaling)。

注意: Normalization是归一化,不是正则化,真正的正则化是regularization,不是数据预处理的一种手段。

0-1归一化的公式:

在sklearn当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有一个重要参数,feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]。

KNN最优k的选取【学习曲线】相关推荐

  1. knn 邻居数量k的选取_选择K个最近的邻居

    knn 邻居数量k的选取 Classification is more-or-less just a matter of figuring out to what available group so ...

  2. knn中k的选取策略

    K值较小,则模型复杂度较高,容易发生过拟合,学习的估计误差会增大,预测结果对近邻的实例点非常敏感. K值较大可以减少学习的估计误差,但是学习的近似误差会增大,与输入实例较远的训练实例也会对预测起作用, ...

  3. KNN中的k如何选择?

    答:KNN中的K值选取对K近邻算法的结果会产生重大影响.如李航博士的一书「统计学习方法」上所说:如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,"学习"近似误差会减小 ...

  4. knn k的选取_KNN - 初窥K近邻算法

    1>算法概述 KNN: 全名K-NearestNeighbor,K近邻算法,简单讲就是每个样本都可以用最接近的k个邻居表示,或者说共享同一个标签.KNN是一种分类(classification) ...

  5. knn k的选取_经典算法(四):KNN

    一.算法概述 KNN也称为K近邻或最近邻(nearest neighbor),从字面来理解就是根据测试样本相对最近(属性相对最近)的K个训练样本的类别来决定该测试样本的类别(少数服从多数).KNN是一 ...

  6. K-means聚类最优k值的选取

    最近做了一个数据挖掘的项目,挖掘过程中用到了K-means聚类方法,但是由于根据行业经验确定的聚类数过多并且并不一定是我们获取到数据的真实聚类数,所以,我们希望能从数据自身出发去确定真实的聚类数,也就 ...

  7. 【转】K-means聚类最优k值的选取

    以下博文转自:https://blog.csdn.net/qq_15738501/article/details/79036255  感谢 最近做了一个数据挖掘的项目,挖掘过程中用到了K-means聚 ...

  8. 计算机视觉——KNN算法(k近邻)

    一.KNN算法是什么? k近邻算法是一种基本分类和回归方法. 简单来说,k近邻原理表示为,在给定一个训练集中,输入一个新数据,然后找寻新的输入实例在训练集中最邻近的k个实例.这个k个实例的多数属于某个 ...

  9. R语言︱LDA主题模型——最优主题数选取(topicmodels)+LDAvis可视化(lda+LDAvis)

    笔者寄语:在自己学LDA主题模型时候,发现该模型有这么几个未解决的问题: 1.LDA主题数量,多少个才是最优的. 2.作出主题之后,主题-主题,主题与词语之间关联如何衡量. 于是在查阅几位老师做的成果 ...

最新文章

  1. 吴恩达机器学习入门2018高清视频公开,还有习题解答和课程拓展,网友:找不到理由不学!...
  2. 结合video.js播放rtmp格式、flv格式、mp4等格式的视频
  3. Docker的简单介绍与安装(Windows10)
  4. 做运营,你需要“一张画布绘到底”
  5. [转载] 交互式数据可视化在Python中用Bokeh实现
  6. window安装python3后怎么用pyspark_pyspark:连接spark集群Windows环境搭建
  7. CS 635: Advanced Systems Programming
  8. 基于消息的软件架构模型演变
  9. 190104每日一句
  10. SPI通信协议_02
  11. javascript表单提交的内容显示在表格中
  12. 小程序步数解密php,微信小程序--获取微信运动步数的实例代码
  13. 打印机如何双面打印、复印?
  14. ubuntu解决浏览器不支持HTML5播放器的方法
  15. [GO语言基础] 四.算术运算、逻辑运算、赋值运算、位运算及编程练习
  16. 2021-11-10
  17. 通过Cli方式创建uni-app常见错误整理
  18. JavaWeb图书管理系统
  19. Intel(R) Xeon(R) CPU E5-2678 v3
  20. 内网渗透-横向渗透2

热门文章

  1. 动态路由协议—EIGRP
  2. 【CakePHP】几个CakePHP知识点
  3. Could not find method uploadArchives() for arguments [build_9y1ozxjm08lb8wodb59629wm8$_run_closure3
  4. office去除盗版提示
  5. The authenticity of host ‘‘ can‘t be established.
  6. imacros自动跑代码_如何使用iMacros自动执行重复的Web浏览器任务
  7. 脉冲雷达数据采集基础
  8. c语言字符串递归例子,c语言函数递归(简单的递归例子c语言)
  9. XCP协议基础知识 - 协议层
  10. VS2019 VC++ MFC CEF(Chrome)开发环境搭建及相关功能demo(附源码)