wzy-1642 2024-04-15 11:04 采纳率: 16.7%
浏览 3

怎么使用划分后的测试集和训练集?其代码是什么?

代码:


#可视化层次k折划分,k=3
#层次k折划分,每次选其中一折作为测试集,其它为训练集,确保在每次划分时不同类别的样本在测试集与训练集中比例划分,分层根据标签y实现,y为类别标签。
skf_cv=skf.split(X_oversampled,y_oversampled)
kk=[k*j for k,j in enumerate(y_oversampled) if j!=0]
k=1
plt.figure(figsize=(16,3))
for train_indices, test_indices in skf_cv:
    plt.scatter(train_indices,[k]*len(train_indices),marker=".",c="r")
    plt.scatter(test_indices,[k]*len(test_indices),marker="v",c="b")
    print("训练集索引-%d"%k,train_indices)
    print("测试集索引-%d"%k,test_indices)
    k=k+1
plt.scatter(kk,[k]*len(kk),marker="+",c="b")
plt.yticks([1,2,3,4,5,6],["1","2","3","4","5","label"])
plt.ylabel("iteration")
plt.xlabel("index")

输出:

img


问题:1、这个图片应该怎么解释?为什么label中0和1的比例看起来是1:1?(该数据集不平衡率1:100)
2、怎么使用划分后的测试集和训练集?其代码是什么?(因为感觉看上去并没有像X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)一样输出了数据集)

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-15 11:04
    关注

    引自免费微信小程序:皆我百晓生

    首先,让我们逐个解答您的问题。

    1、关于图片的解释: 您提供的代码是用于可视化层次K折交叉验证(Stratified K-Fold Cross-Validation)的过程。在这个例子中,k=3,这意味着将数据集分成3个部分进行训练和测试。在层次K折中,我们保证每个子集中的类别分布与原始数据集相同,这有助于防止在不平衡的数据集中,某一类别过度出现在测试集或训练集中,从而影响模型评估的准确性。

    在图像中,“label”表示类别标签,而“iteration”表示不同的折叠次数。从图中我们可以看到,对于每一次迭代(k值),红色点代表训练集中的样本索引,蓝色三角形代表测试集中的样本索引。当您说“label中0和1的比例看起来是1:1”,可能是因为在这个可视化的例子中,虽然原始数据集的不平衡率是1:100,但为了简化视觉效果,只展示了部分数据点。实际上,在每一层(即每次折叠)中,都会按照类别比例分配样本到训练集和测试集,以保持类别平衡。

    2、如何使用划分后的测试集和训练集: 在Python中,sklearn.model_selection.StratifiedKFold提供了层次K折划分功能。下面是一个完整的示例,演示如何使用划分后的训练集和测试集来训练和评估一个模型:

    from sklearn.datasets import load_iris
    from sklearn.model_selection import StratifiedKFold
    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import classification_report
    
    # 加载数据集
    iris = load_iris()
    X = iris.data
    y = iris.target
    
    # 定义模型
    model = LogisticRegression()
    
    # 定义层次K折
    skf_cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
    
    # 遍历每一轮的训练和测试
    for fold, (train_index, test_index) in enumerate(skf_cv.split(X, y)):
        # 分割数据
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
    
        # 训练模型
        model.fit(X_train, y_train)
    
        # 预测并评估
        predictions = model.predict(X_test)
        print(f"Fold {fold + 1} - Classification Report:")
        print(classification_report(y_test, predictions))
    
    

    这段代码会使用逻辑回归模型对鸢尾花数据集进行层次K折交叉验证。在每次循环中,它都会分割数据为训练集和测试集,然后训练模型,并使用测试集上的预测结果计算分类报告,展示模型在各个类别的性能。

    请注意,实际应用中,您可能会想要保存每个折的评估指标(例如准确率、AUC等),以便在所有折叠完成后进行平均,得到最终的模型性能估计。这里只是为了演示如何使用划分后的训练集和测试集进行单次训练和评估。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月15日

悬赏问题

  • ¥20 求下下面这个数据结构代码
  • ¥15 路由器考试怎么办,有懂行的吗 ,eNSP
  • ¥20 前端 二进制文件流图片转化异常
  • ¥15 github上的这个C语言项目如何跑起来
  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice
  • ¥15 谁会做这个啊#ensp#Boson NetSim
  • ¥15 如何编写针对TPS6503320FRGE型号的电源管理芯片的编程代码?
  • ¥15 设计简单目录管理系统,要满足以下内容