如何选择KNN的最合适的K值使⽤K折交叉验证评估最合适的K值 交叉验证是⼀个调参的过程,需要对提前给定的K值逐个去尝试,所以花费时间较长
交叉验证的第⼀步:把训练数据进⼀步分成训练集和验证集。 问:为什么不⽤测试集对模型进⾏验证和评估,⽽要拆分训练集呢? 答:测试数据是⽤来⼀次性测试的,⼀般⽤于项⽬上线时测试使⽤,⽽不能⽤于指导模型训练⼯作流程:
1. 将数据集分成K(折)段,并将每段拆分成训练集和验证集
2. 遍历所有指定的K(KNN)值对每段进⾏KNN模型训练
3. 将每段评估的准确率进⾏相加,并除以K(折),得出KNN模型为某K值时的最终准确率 4. 最终⽐较所有K(KNN)值的最终准确率,最⾼说明是这⼏个K(KNN)值中最合适的
现在开始使⽤K折交叉验证来挑选最合适的K值
导⼊相关库或模块
from sklearn import datasets
del_selection import KFold
ighbors import KNeighborsClassifier
导⼊iris数据集
iris = datasets.load_iris()
# X 为特征集,y 为标签集
X = iris['data']
y = iris['target']
然后开始写重要部分
# 这⾥定义6个候选值
fs =[1,3,5,7,9,11]
# 进⾏4折交叉验证,返回的是训练集和验证集的下标
fk = KFsold(n_splits=4, random_state=2001, shuffle=True)
# 先默认当前最好的k值
best_k = fs[0]
网络服务商# 先默认最好的准确率值
best_score =0
# 遍历所有的候选值
for k in fs:
# 记录五段的准确率之和
curr_score =0防老剂a
# 遍历五段的数据集
for train_index,valid_index in fk.split(X):
VAGUA# 实例化KNN模型
clf = KNeighborsClassifier(n_neighbors=k)
# 训练模型
clf.fit(X[train_index], y[train_index])
go to the goal# 计算当前的准确率
curr_score = curr_score + clf.score(X[valid_index], y[valid_index])
# 计算KNN模型的K值为k时的平均准确率值
avg_score = curr_score/4
print('平均准确率为:%.2f'% avg_score)
# 判断平均准确率值是否⼤于⽬前最好的准确率值
if avg_score > best_score:
# 将平均准确率值替代原先最好的准确率值
best_score = avg_score
# 将⽬前的K值替换原先最好的K值
best_k = k
print('⽬前最好的K值为:%d'%best_k,"⽬前最好的准确率值为:%.2f"%best_score) print("*"*50)
print('评估最合适的K值为:%d'%best_k,"其准确率为:%.2f"%best_score)
结果如下
第十届全运会还有⼀种更简单的⽅式:直接使⽤sklearn来实现
# 使⽤⽹格来搜索候选值
del_selection import GridSearchCV
from sklearn import datasets
ighbors import KNeighborsClassifier
iris = datasets.load_iris()
X = iris['data']
y = iris['target']
甲苯二异氰酸酯
parameter ={'n_neighbors':[1,3,5,7,9,11]}
knn = KNeighborsClassifier()
clf = GridSearchCV(knn,parameter,cv=5)
clf.fit(X,y)
print(f'评估最合适的K值为:{(clf.best_params_)["n_neighbors"]}',"其准确率为:%.2f"%clf.best_score_)效果如下
你学会了吗?