【问题标题】:Cross-validation: finding row indices for a test set that aren't part of a training set交叉验证:查找不属于训练集的测试集的行索引
【发布时间】:2016-02-06 18:09:12
【问题描述】:

我需要做的是从一个 numpy 矩阵中随机选择(替换)50 行,以训练线性分隔符。

然后,我需要使用我没有选择的行来测试线性分隔符。

对于第一部分,A 是我的完整数据矩阵,我这样做:

A_train = A[np.random.randint(A.shape[0],size=50),:]

但我目前没有有效的方法找到:

A_test = ...

其中A_test 不包含与A_train 相同的行。我该怎么做?

这个问题的关键是A 是一个 n x m 矩阵,而不是一维矩阵...

【问题讨论】:

    标签: python numpy matrix machine-learning cross-validation


    【解决方案1】:

    您可以使用np.setdiff1d 查找未包含在您的训练集中的行索引:

    import numpy as np
    
    gen = np.random.RandomState(0)
    
    n_total = 1000
    n_train = 800
    
    train_idx = gen.choice(n_total, size=n_train)
    test_idx = np.setdiff1d(np.arange(n_total), train_idx)
    

    带放回抽样的一个后果是,有资格包含在测试集中的示例数量将根据训练集中重复示例的数量而有所不同:

    print(test_idx.size)
    # 439
    

    如果您想确保测试集的大小是一致的,您可以从不在训练集中的一组索引中重新采样并替换:

    n_test = 200
    test_idx2 = gen.choice(test_idx, size=n_test)
    

    如果您实际上并不关心替换抽样,那么更简单的选择是生成所有索引的随机排列,然后将前 N 个作为训练示例,其余作为测试示例:

    idx = gen.permutation(n_total)
    train_idx, test_idx = idx[:n_train], idx[n_train:]
    

    或者您可以使用 np.random.shuffle 将数组的行随机排列。


    我还应该指出,scikit-learn 有 various convenience methods 用于将数据划分为训练集和测试集以进行交叉验证。

    【讨论】:

    • 啊,好的,我去看看 scipy。稍后我必须进行 10 倍交叉验证。在这一点上,A_test 的一致大小并不重要,因为我只执行一次以生成错误度量和一些图像。然后我做10倍交叉。我使用的第一个数据集有大约 80 个样本,所以,恕我直言,50 个随机子集,没有替换,在统计上是微不足道的......所以我不妨将它划分为 50,就像不替换一样......
    • 我在任务中可以做出这样的选择。无论如何,感谢您的提醒。还有指向 scipy 的指针...
    猜你喜欢
    • 2011-12-16
    • 2016-01-29
    • 2018-04-03
    • 2021-03-04
    • 2016-05-12
    • 1970-01-01
    • 2021-09-17
    • 2018-04-03
    • 2018-05-03
    相关资源
    最近更新 更多