python scikit learn 中的 Stratified 和 StratifiedKFold 有什么区别?

what is the differene between Stratify and StratifiedKFold in python scikit learn?

我的数据由 99% 的目标变量 = 1 和 1% 的目标变量 =“0”组成。分层是否保证训练测试和测试集在目标变量方面具有相等的数据比例。如在 containts 中,等量的“1”和“0”?

请参阅下面的代码进行说明

 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,stratify=y,random_state=42)

第一个区别是 train_test_split(X, y, test_size=0.2, stratify=y) 只会拆分一次数据,其中 80% 将在训练中,20% 将在测试中。

StratifiedKFold(n_splits=2) 会将数据拆分为 50% 的训练和 50% 的测试。

其次,可以指定n_splits大于2,达到交叉验证折叠效果,其中数据会拆分n_split次。所以会有多次数据划分train和test。

更多关于K折可以看这个问题:

这个想法是一样的。 train_test_split 将在内部使用 StratifiedShuffleSplit

分层只会 return 一部分数据,这些数据可能会根据您传递给它的参数进行混洗或不混洗。假设您的数据集由 100 个 class 1 实例和 10 个 class 0 实例组成,您决定对 70:30 进行拆分,假设您传递了适当的参数来拆分训练集中 63-class1 个实例和 7-class0 个实例,测试集中 27-class1 个实例和 3-class0 个实例。显然,这是不可能平衡的。您训练的 classifier 将有很大的偏差,并且与将每个输入预测为 class1.

的虚拟 classifier 一样好

更好的方法是,要么尝试收集更多 class-0 的数据,要么对数据集进行过采样以人为生成更多 class0 个实例,或者对其进行欠采样以减少 class1 个实例。 python imblearn 是 python 中的一个图书馆,可以为您提供帮助