【问题标题】:how to split a dataset into training and validation set keeping ratio between classes?如何将数据集拆分为训练集和验证集类之间的保持比率?
【发布时间】:2015-05-18 20:56:53
【问题描述】:

我有一个多类分类问题,我的数据集有偏差,我有 100 个特定类的实例,说 10 个不同类的实例,所以我想在类之间分割我的数据集保持率,如果我有 100 个实例一个特定的类,我希望 30% 的记录进入训练集中我希望有 30 个代表我的 100 个记录的类的实例和代表我的 10 个记录的类的 3 个实例,依此类推。

【问题讨论】:

    标签: python numpy pandas machine-learning scikit-learn


    【解决方案1】:

    您可以使用在线文档中的 sklearn 的 StratifiedKFold

    分层K-Folds交叉验证迭代器

    提供训练/测试 在训练测试集中分割数据的索引。

    这个交叉验证对象 是返回分层折叠的 KFold 的变体。褶皱是 通过保留每个类的样本百分比来制作。

    >>> from sklearn import cross_validation
    >>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
    >>> y = np.array([0, 0, 1, 1])
    >>> skf = cross_validation.StratifiedKFold(y, n_folds=2)
    >>> len(skf)
    2
    >>> print(skf)  
    sklearn.cross_validation.StratifiedKFold(labels=[0 0 1 1], n_folds=2,
                                             shuffle=False, random_state=None)
    >>> for train_index, test_index in skf:
    ...    print("TRAIN:", train_index, "TEST:", test_index)
    ...    X_train, X_test = X[train_index], X[test_index]
    ...    y_train, y_test = y[train_index], y[test_index]
    TRAIN: [1 3] TEST: [0 2]
    TRAIN: [0 2] TEST: [1 3]
    

    这将保留您的班级比例,以便拆分保留班级比例,这将适用于 pandas dfs。

    根据@Ali_m 的建议,您可以使用StratifiedShuffledSplit,它接受分流比参数:

    sss = StratifiedShuffleSplit(y, 3, test_size=0.7, random_state=0)

    会产生 70% 的分裂。

    【讨论】:

      【解决方案2】:

      就这么简单:

      from sklearn.model_selection import train_test_split
      X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                      stratify=y, 
                                                      test_size=0.25)
      

      【讨论】:

        猜你喜欢
        • 2016-09-13
        • 2020-10-01
        • 2019-05-01
        • 2013-09-27
        • 1970-01-01
        • 2016-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多