You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在已拆分的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:45:37