【问题标题】:what is the differene between Stratify and StratifiedKFold in python scikit learn?python scikit learn中的Stratified和StratifiedKFold有什么区别?
【发布时间】:2018-07-02 08:42:07
【问题描述】:

我的数据由 99% 的目标变量 = 1 和 1% 的目标变量 = '0' 组成。分层是否保证训练测试和测试集在目标变量方面具有相等的数据比率。就像在容器中一样,'1' 和 '0' 的数量相等吗?

请看下面的代码进行说明

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

【问题讨论】:

    标签: python machine-learning scikit-learn oversampling


    【解决方案1】:

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

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

    第二个是可以指定n_splits大于2来达到交叉验证折叠的效果,其中数据会拆分n_split的次数。所以会有多个数据划分为训练和测试。

    有关 K-fold 的更多信息,您可以查看以下问题:

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

    【讨论】:

    • 在您回答的第一句话中,“stratify=y”是否保证对数据进行平均分割以应对不平衡类?
    • @MajidHelmy “等分”是什么意思?数据的比例将根据类别进行维护。
    • 其实这是我的主要问题,我的数据由 99% 的目标变量 = 1 和 1% 的目标变量 = '0' 组成。分层保证训练测试和测试集在目标变量方面具有相等的数据比率。与容器一样,“1”和“0”的数量相等。 @Vivek
    • @MajidHelmy 如果相等意味着两个类的样本数量相同,则否。新拆分部分中的类比率将等于拆分前整个数据的类比率。
    【解决方案2】:

    分层只会返回一部分数据,这些数据可能会根据您传递给它的参数而被打乱或不打乱。假设您的数据集由 100 个 1 类实例和 10 个 0 类实例组成,您决定在 70:30 进行拆分,假设您传递适当的参数以拆分 63-class1 实例和 7-class0 实例训练集和测试集中的27-class1 实例和3-class0 实例。显然,它是不平衡的。您训练的分类器将具有高度偏差,并且与将每个输入预测为 class1 的虚拟分类器一样好。

    更好的方法是,要么尝试收集更多的 0 类数据,要么对数据集进行过采样以人为地生成更多的 0 类实例,或者对其进行欠采样以获得更少的 1 类实例。 python imblearn 是 python 中的一个库,可以帮助你

    【讨论】:

    • 链接已损坏,请您仔细检查@pratik
    • 加了链接看看
    猜你喜欢
    • 2016-08-01
    • 2015-03-10
    • 2017-08-06
    • 2018-03-18
    • 2020-07-13
    • 2021-03-26
    • 2015-04-21
    • 2021-07-03
    相关资源
    最近更新 更多