Python中无需交叉验证利用验证集训练KNN模型并绘制误差图的方法
实现方案(无需交叉验证)
你已经提前拆分好了固定的训练/验证集,直接遍历k值分别计算对应误差即可,不需要引入交叉验证流程,以下是基于scikit-learn的可运行实现:
步骤1:导入依赖库
from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt
步骤2:遍历1~25的k值计算误差
# 定义k的取值范围 k_range = range(1, 26) train_errors = [] val_errors = [] for k in k_range: # 初始化对应邻居数的KNN模型 knn = KNeighborsClassifier(n_neighbors=k) # 仅用训练集拟合模型 knn.fit(Xa, Ya) # 计算训练集分类误差 y_pred_train = knn.predict(Xa) train_error = 1 - accuracy_score(Ya, y_pred_train) train_errors.append(train_error) # 计算验证集分类误差 y_pred_val = knn.predict(Xv) val_error = 1 - accuracy_score(Yv, y_pred_val) val_errors.append(val_error)
步骤3:绘制训练/验证集误差对比图
plt.figure(figsize=(10,6)) # 绘制训练误差线 plt.plot(k_range, train_errors, label='训练集分类误差', marker='o') # 绘制验证集误差线 plt.plot(k_range, val_errors, label='验证集分类误差', marker='s') # 图表基础配置 plt.xlabel('KNN邻居数k') plt.ylabel('分类误差') plt.xticks(k_range) plt.legend() plt.grid(alpha=0.3) plt.show()
补充说明
- 分类误差默认用
1-分类准确率计算,也可根据需求替换为其他分类损失指标 - 全程仅使用你提前拆分好的固定训练/验证集,没有用到任何交叉验证逻辑
- 跑完后可直接根据验证集误差最低点选择最优k值,最后再用测试集(Xt,Yt)做最终效果评估即可
内容的提问来源于stack exchange,提问作者Nadjib Rahmani
相关产品推荐
相关产品推荐

