KNN最优k的选取【学习曲线】

KNN最优k的选取【学习曲线】
怎样选择⼀个最佳的 k呢?
在这⾥我们要使⽤机器学习中的神器:参数学习曲线。
参数学习曲线是⼀条以不同的参数取值为横坐标,不同参数取值下的模型结果为纵坐标的曲线
# 1.导⼊所需要的模块和库
import numpy as np
ighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
del_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))
# 评估在测试集上的表现情况
2009年nba全明星赛
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
ighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
del_selection import train_test_split
import matplotlib.pyplot as plt
del_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,# 特征和标签
2012诺贝尔生理学奖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
ighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
del_selection import train_test_split
import matplotlib.pyplot as plt
del_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.an()) # 每次交叉验证返回的得分数组,再求数组均值    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]。

本文发布于:2024-09-23 03:27:10,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/326084.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:训练   验证   交叉   模型   数据   测试
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议