绘制火车和测试集一次,或者在sklearn中为每个折叠绘制新集合?

时间:2016-11-02 15:12:44

标签: python scikit-learn cross-validation

我有两个scikit-learn模型,有两个不同的生成列车和测试集的程序。从我的角度来看,他们应该得到相同的分数。

方法1:

kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=1)
for train, test in kfold.split(X, Y):
       model = create_model(X[train], Y[train], X[test], Y[test])
       score.append(model.score())
score_mean = mean(score)

方法2:

for i in range(1, 6):
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=1, stratify=Y)    
    model = create_model(X_train, Y_train, X_test, Y_test)
    score.append(model.score())
score_mean = mean(score)

我的分数函数是MCC。第一种方法使用函数进行交叉验证,第二种方法明确地进行。在方法2中,我得到的MCC大约比方法1大10倍。

在这两种解释不同结果的方法中是否存在根本不同的东西,或者它们是否正式等效?在其余代码中是否还有其他责任?

想法:如果我使用StratifiedKFold方法,它会绘制如下样本:鉴于我在第2类中有5个1类样本和5个样本,该方法以不使样本被取两次的方式准备折叠(例如[0,4],[3,9],[8,2],[1,6],[5,7],所有数字都选择一次)。我认为在使用train_test_split()的第二种方法中,可以多次出现相同的样本。不确定这是否会使MCC如此扭曲。

1 个答案:

答案 0 :(得分:-1)

方法1更好,因为它是在每个折叠中使用不同的测试数据集进行交叉验证。方法2采用随机样本,但需要更换。

但是你也有一个bug。方法2在每个循环上使用相同的随机种子。所以你运行相同的模型5次。