【问题标题】:Custom cross validation split sklearn自定义交叉验证拆分 sklearn
【发布时间】:2014-07-27 12:22:23
【问题描述】:

我正在尝试在 sklearn 中拆分数据集以进行交叉验证和 GridSearch。 我想定义自己的拆分,但 GridSearch 只采用内置的交叉验证方法。

但是,我不能使用内置的交叉验证方法,因为我需要将某些示例组放在同一个文件夹中。 所以,如果我有例子: [A1, A2, A3, A4, A5, B1, B2, B3, C1, C2, C3, C4, ...., Z1, Z2, Z3]

我想执行交叉验证,以便每个组 [A,B,C...] 中的示例仅存在于一个折叠中。

即K1包含[D,E,G,J,K...],K2包含[A,C,L,M,...],K3包含[B,F,I,...]等等

【问题讨论】:

    标签: python validation machine-learning scikit-learn cross-validation


    【解决方案1】:

    我知道这个问题很老了,但我遇到了同样的问题。看起来很快就会有一个贡献可以让你这样做:

    https://github.com/scikit-learn/scikit-learn/pull/4583

    【讨论】:

      【解决方案2】:

      这类事情通常可以用sklearn.cross_validation.LeaveOneLabelOut 来完成。您只需要构建一个对您的组进行编码的标签向量。即,K1 中的所有样本都将使用标签 1K2 中的所有样本都将使用标签 2,依此类推。

      这是一个完全可运行的假数据示例。重要的几行是创建cv 对象的那一行,以及对cross_val_score 的调用

      import numpy as np
      
      n_features = 10
      
      # Make some data
      A = np.random.randn(3, n_features)
      B = np.random.randn(5, n_features)
      C = np.random.randn(4, n_features)
      D = np.random.randn(7, n_features)
      E = np.random.randn(9, n_features)
      
      # Group it
      K1 = np.concatenate([A, B])
      K2 = np.concatenate([C, D])
      K3 = E
      
      data = np.concatenate([K1, K2, K3])
      
      # Make some dummy prediction target
      target = np.random.randn(len(data)) > 0
      
      # Make the corresponding labels
      labels = np.concatenate([[i] * len(K) for i, K in enumerate([K1, K2, K3])])
      
      from sklearn.cross_validation import LeaveOneLabelOut, cross_val_score
      
      cv = LeaveOneLabelOut(labels)
      
      # Use some classifier in crossvalidation on data
      from sklearn.linear_model import LogisticRegression
      
      lr = LogisticRegression()
      scores = cross_val_score(lr, data, target, cv=cv)
      

      但是,您当然可能会遇到想要完全手动定义弃牌的情况。在这种情况下,您需要创建一对(train, test)iterable(例如list),通过索引指示将哪些样本带入您的训练集和每个折叠的测试集。让我们检查一下:

      # create train and test folds from our labels:
      cv_by_hand = [(np.where(labels != label)[0], np.where(labels == label)[0])
                     for label in np.unique(labels)]
      
      # We check this against our existing cv by converting the latter to a list
      cv_to_list = list(cv)
      
      print cv_by_hand
      print cv_to_list
      
      # Check equality
      for (train1, test1), (train2, test2) in zip(cv_by_hand, cv_to_list):
          assert (train1 == train2).all() and (test1 == test2).all()
      
      # Use the created cv_by_hand in cross validation
      scores2 = cross_val_score(lr, data, target, cv=cv_by_hand)
      
      
      # assert equality again
      assert (scores == scores2).all()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-01
        • 2016-04-13
        • 2012-12-31
        • 2018-08-16
        • 2019-10-22
        • 2017-03-15
        • 2018-04-26
        • 2016-10-01
        相关资源
        最近更新 更多