为什么拆分前的交叉验证结果与拆分后的结果不同?

数据挖掘 分类 交叉验证
2022-02-27 02:55:22

我的二元分类问题中的所有数据都由X和表示y现在,我对这些数据进行分层交叉验证,如下所示:

scoring = {'accuracy' : make_scorer(accuracy_score), 
           'precision' : make_scorer(precision_score),
           'recall' : make_scorer(recall_score), 
           'f1_score' : make_scorer(f1_score)}

model=RandomForestClassifier(n_estimators=50,random_state=10) 

results = cross_validate(estimator=model, X=X, y=y, cv=10, scoring=scoring)

如果运行代码,我将得到以下结果:

Accuracy : 0.5436815489342804
Precision : 0.020165565854870747
Recall : 0.11013513513513513
F1_score : 0.03315023853741518

X现在,我拆分y如下:

#Test, training data split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, stratify = y)

#Split the training data into validation set 
X_val_train, X_val_test, y_val_train, y_val_test = train_test_split(X_train, y_train, test_size = 0.1, random_state=0, stratify=y_train )

X_train现在,如果我像以前一样在and上执行相同的交叉验证过程X_train,我将得到以下结果:

Accuracy : 0.8424393681243558
Precision : 0.47658195862621017
Recall: 0.1964997354963851
F1_score : 0.2773991741912054

我不明白为什么结果如此不同以及为什么会发生这种情况。

2个回答

在没有更多信息的情况下,我假设您的模型的复杂性。

我认为您可能有一个如此复杂的模型,以至于它需要“大量”数据才能获得良好的性能(第一个场景,对完整数据进行交叉验证)

然后,当您在训练-测试集中拆分数据并重复交叉验证时,数据量自然会减少,因此导致您的模型没有足够的样本进行泛化。

这可以通过学习曲线来证实:

在此处输入图像描述


如果随着更多数据的添加,训练和交叉验证分数会收敛(如左图所示),那么模型可能不会从更多数据中受益。如果训练分数远大于验证分数,那么模型可能需要更多的训练样本才能更有效地泛化。

在第一种方式中,您正在查看所有数据。

第二种拆分方式使用固定种子进行拆分。看起来数据片段恰好与所有数据有很大不同。