【问题标题】:Behaviour of train_test_split() from Scikit-learn来自 Scikit-learn 的 train_test_split() 的行为
【发布时间】:2018-05-18 00:10:40
【问题描述】:

我很好奇 Scikit-learn 的 train_test_split() 方法在以下场景中会如何表现:

一个虚构的数据集:

id, count, size
1, 4, 8
2, 5, 9
3, 6, 0

说我会像这样把它分成两个独立的集合(在两个中都保留“id”):

id, count      |       id, size
1, 4           |       1, 8
2, 5           |       2, 9
3, 6           |       3, 0

然后用train_test_split()0 的相同random_state 将它们分开。两者的顺序是否相同以'id'作为参考? (因为您正在改组相同的数据集,但省略了不同的部分)

我很好奇这是如何工作的,因为我有两个模型。第一个使用数据集进行训练并将其结果添加到数据集中,然后将其中的一部分用于训练第二个模型。

这样做时,重要的是在测试第二个模型的泛化时,不使用也用于训练第一个模型的数据点。这是因为数据“以前见过”并且模型将知道如何处理它,因此您不再测试对新数据的泛化。

如果train_test_split() 将它改组,那就太好了,因为这样就不需要跟踪用于训练第一个算法的数据,以防止测试结果受到污染。

【问题讨论】:

    标签: scikit-learn train-test-split


    【解决方案1】:

    如果您在每次调用中使用相同的random_state 参数,它们应该具有相同的结果索引。

    但是,您也可以颠倒您的操作顺序。在父数据集上调用 test/train split,然后从产生的测试集和训练集创建两个子集。

    例子:

    print(df)
       id  count  size
    0   1      4     8
    1   2      5     9
    2   3      6     0
    
    from sklearn.model_selection import train_test_split
    dfa = df[['id', 'count']].copy()
    dfb = df[['id', 'size']].copy()
    rstate = 123
    traina, testa = train_test_split(dfa, random_state=123)
    trainb, testb = train_test_split(dfb, random_state=123)
    assert traina.index.equals(trainb.index)
    # True
    

    【讨论】:

    • 在我的情况下更改顺序是不可能的,因为模型不一定同时或通过相同的代码进行训练。但是,这仍然是我的问题的答案。
    猜你喜欢
    • 2023-03-06
    • 2020-01-05
    • 2020-07-14
    • 2015-07-14
    • 2016-04-22
    • 2018-09-30
    • 2019-06-28
    相关资源
    最近更新 更多