【问题标题】:scikit learn: 5 fold cross validation & train test splitscikit learn:5 折交叉验证和训练测试拆分
【发布时间】:2018-12-07 16:38:48
【问题描述】:

我想知道当我训练测试拆分(20% 测试,80% 80%)然后我应用 5 折交叉验证时,这是否意味着所有数据都已在测试集中一次?还是每次随机选择,在每个折叠中,相同的事件可能不止一次包含在测试中,有些可能从未包含在测试集中?

#20% of the data will be used as test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=seed) 

cv_results= cross_val_score(model, X_train, y_train, cv=kfold, scoring=scoring)

【问题讨论】:

    标签: python machine-learning scikit-learn data-science


    【解决方案1】:

    所有数据都在测试集中一次吗?是的,至少在您传递给交叉验证方法的数据中。例如:

    X = np.arange(10)
    y = np.concatenate((np.ones(5), np.zeros(5)))
    X
    array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    y
    array([1., 1., 1., 1., 1., 0., 0., 0., 0., 0.])
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=42)
    X_train
    array([5, 0, 7, 2, 9, 4, 3, 6])
    X_test
    array([8, 1])
    kf = Kfold(n_splits=5)
    for train, test in kf.split(X_train):
        print(train, test)
    [2 3 4 5 6 7] [0 1]
    [0 1 4 5 6 7] [2 3]
    [0 1 2 3 6 7] [4 5]
    [0 1 2 3 4 5 7] [6]
    [0 1 2 3 4 5 6] [7]
    

    您可以看到测试集的索引从 0 到 7 运行,这意味着 X_train 中的所有 8 个值都将出现在交叉验证测试中一次。无论您的样本大小如何,这种模式都会持续存在。

    交叉验证split 方法创建的拆分大小取决于您的数据与您选择的拆分数量的比率。例如,如果我设置了KFold(n_splits=8)(与我的X_train 数组大小相同),则每个拆分的测试集将包含一个数据点。

    【讨论】:

    • 非常感谢!!一个快速的问题,如果你能帮助我理解,在你的例子中,test_train split 的测试大小是 0.2。那么在 5 折之后,为什么其中两个的测试大小不等于 0.2 ? [0 1 2 3 4 5 7] [6] [0 1 2 3 4 5 6] [7] .... 为什么不是 [0 1 2 3 4 5 ] [6 7] & [0 2 3 4 5 6] [7 1]
    • 哦,请忽略我的问题,我想我现在明白了,非常感谢:)
    • x_test 的值永远不会进入你的交叉验证,因为你只是通过了 x_train。
    • @JennyLien 如果答案解决了您的问题,请接受 - 请参阅What should I do when someone answers my question?
    • 我看到它是双向的,并引起了激烈的争论。我被训练有一个从未通过交叉验证或其他方式训练过的测试集。
    猜你喜欢
    • 2017-04-11
    • 2021-07-26
    • 2020-12-15
    • 2015-06-08
    • 2016-05-12
    • 1970-01-01
    • 2019-04-10
    • 2021-03-04
    • 2014-05-01
    相关资源
    最近更新 更多