基于m折交叉验证实现KNN模型超参数k的优选

首先将数据集划分为训练集和测试集

进一步划分出验证集

训练集:用于建立模型,训练模型的拟合能力

测试集:用来检验最终选择最优的模型的性能

验证集:用来确定网络结构或者控制模型复杂程度的参数,即用于参数的优选

1、首先将数据集划分为训练集和测试集

留出法:直接将数据集划分为两个互斥的集合,其中一个作为训练集,另一个作为测试集

train_test_split()函数的参数说明

train_test_split(X, y, random_state = , test_size = )

1)X:表示特征集

2)y:表示对应的类别

3)random_state:随机种子

如果是数字,则其他条件不变时,每次分类的情况都相同
如果不填,每次分类的结果都不同

扫描二维码关注公众号,回复: 10665261 查看本文章

4)train_size:表示训练集占比,默认为0.25

5)test_size:表示测试集占比,默认为0.75

详细说明:https://www.cnblogs.com/Yanjy-OnlyOne/p/11288098.html

示例:

import numpy as np
from sklearn.model_selection import train_test_split

X = np.array([[1, 1], [2, 2], [3, 3], [4, 4]])
y = np.array([1, 2, 3, 4])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
#训练集
print('X_train:')
print(X_train)
print('y_train:')
print(y_train)
#测试集
print('X_test:')
print(X_test)
print('y_test:')
print(y_test)

输出:
在这里插入图片描述
可以看出,划分后的X和y是对应的

2、基于训练集进行交叉验证

KNeighborsClassifier()函数的参数说明

KNeighborsClassifier(n_neighbors = , weights = )

1)n_neighbors:模型的k值,选取最近的k个邻居作为参考

2)weights:决策方式

有uniform(等权决策)、distance(基于距离的加权投票)

详细说明:https://blog.csdn.net/weixin_41990278/article/details/93169529

cross_val_score()函数的参数说明

cross_val_score(knn, X_train, y_train, cv = , scoring = )

1)第一个参数表示模型

2)接下来两个参数为X_train和y_train

3)cv:表示进行多少折交叉验证

4)scoring:表示评价指标

详细说明:https://blog.csdn.net/qq_36523839/article/details/80707678?utm_source=blogxgwz0

示例:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split,cross_val_score

#K的所有取值
K = [1, 4, 7, 10, 13, 16]
#K值对应的正确率平均值
acc = []
#K值对应的正确率标准差
std = []
#遍历可取的 k 值
for k in K:
    #获得k近邻基于距离加权分类模型
    knn = KNeighborsClassifier(k, weights = 'distance')
    #对训练集进行4折交叉验证,获得正确率数组
    score = cross_val_score(knn, X_train, y_train, cv = 5, scoring = 'accuracy')
    #计算正确率的平均值
    acc.append(score.mean())
    #计算正确率的标准差
    std.append(score.std())
#输出所有 K 值的正确率平均值
print('K值正确率平均值:', acc)

输出:
在这里插入图片描述

3、绘图

#添加误差线(即标准差)
for i in range(len(K)):
    plt.errorbar(K[i], acc[i], fmt="bo:", yerr = std[i], capsize = 5)
#添加 K 值和对应的正确率
plt.plot(K, acc)
#添加网格
plt.grid(linestyle=':')
#设置x轴的横坐标
plt.xticks(K)
#x轴名称
plt.xlabel('K-values')
#y轴名称
plt.ylabel('Accuracy')		
#绘制表格
plt.show()

在这里插入图片描述
因为k=1和k=10时的正确率平均值相等,此时比较标准差,选取标准差更小的10作为K值

详细说明:https://blog.csdn.net/weixin_41789707/article/details/81035997

发布了221 篇原创文章 · 获赞 38 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43772166/article/details/105026280