如何在已拆分的Train、Test1、Test2数据集上实现交叉验证?
预拆分数据集下的交叉验证实现方案
核心逻辑
你的数据集已固定拆分为Train、Test1、Test2,交叉验证仅能在训练集(Train)上执行——这是为了避免测试集数据泄露,确保最终模型泛化能力评估的真实性。交叉验证的作用包括:
- 评估模型在训练集内部的稳定性
- 辅助调优模型超参数(比如KNN的
n_neighbors) - 最终用Test1/Test2验证模型的真实泛化性能
具体实现步骤(以KNN为例)
1. 导入依赖库
import pandas as pd from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import KFold, cross_val_score
2. 加载并预处理数据(沿用你的现有代码)
train = pd.read_csv('train-alldata.csv', sep=";") test = pd.read_csv('test1-alldata.csv', sep=";") test2 = pd.read_csv('test2-alldata.csv', sep=";") # 基于你已完成的PCA处理结果提取特征与标签 X_train = train_pca_son.drop('churn_yn', axis=1) y_train = train_pca_son['churn_yn'] X_test = test_pca_son.drop('churn_yn', axis=1) y_test = test_pca_son['churn_yn'] X_test_2 = test2_pca_son.drop('churn_yn', axis=1) y_test_2 = test2_pca_son['churn_yn']
3. 在训练集上执行K折交叉验证
# 初始化KNN分类器(使用你指定的参数) knn_classifier = KNeighborsClassifier(n_neighbors=7, metric='euclidean') # 设置5折交叉验证,建议开启shuffle打乱数据,避免训练集分布不均 k_folds = KFold(n_splits=5, shuffle=True, random_state=42) # 仅传入训练集的特征与标签执行交叉验证 cv_scores = cross_val_score(knn_classifier, X_train, y_train, cv=k_folds) # 输出交叉验证结果 print("交叉验证得分:", cv_scores) print("平均交叉验证得分:", cv_scores.mean()) print("参与平均的得分数量:", len(cv_scores))
4. 用交叉验证调优超参数(可选)
如果需要优化KNN的n_neighbors,可以遍历不同取值,用交叉验证得分筛选最优参数:
best_score = 0 best_k = 0 # 遍历k值范围 for k in range(1, 20): knn = KNeighborsClassifier(n_neighbors=k, metric='euclidean') fold_scores = cross_val_score(knn, X_train, y_train, cv=k_folds) avg_score = fold_scores.mean() if avg_score > best_score: best_score = avg_score best_k = k print(f"最优k值:{best_k},对应平均交叉验证得分:{best_score}")
5. 用最优模型测试最终泛化能力
选好参数后,用完整训练集训练模型,再在Test1和Test2上验证真实性能:
# 用最优参数初始化模型 best_knn = KNeighborsClassifier(n_neighbors=best_k, metric='euclidean') best_knn.fit(X_train, y_train) # 分别在两个测试集上评估 test1_acc = best_knn.score(X_test, y_test) test2_acc = best_knn.score(X_test_2, y_test_2) print(f"Test1数据集准确率:{test1_acc}") print(f"Test2数据集准确率:{test2_acc}")
关键注意事项
- 绝对不能将Test1/Test2纳入交叉验证流程,否则会导致数据泄露,模型泛化能力评估完全失效。
- 若你的数据集存在类别不平衡问题,建议用
StratifiedKFold替代KFold,它会保证每折中各类别的比例与原始训练集一致。
内容的提问来源于stack exchange,提问作者gamedeveloper
相关产品推荐
相关产品推荐

