sklearn中的预定义Split函数

clo*_*g14 8 python scikit-learn

我正在尝试使用我提供的拆分cross_val_score来运行。sklearnsklearn文档给出了以下示例:

>>> from sklearn.model_selection import PredefinedSplit
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 1, 1])
>>> test_fold = [0, 1, -1, 1]
>>> ps = PredefinedSplit(test_fold)
>>> ps.get_n_splits()
2
>>> print(ps)       
PredefinedSplit(test_fold=array([ 0,  1, -1,  1]))
>>> for train_index, test_index in ps.split():
...    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 2 3] TEST: [0]
TRAIN: [0 2] TEST: [1 3]
Run Code Online (Sandbox Code Playgroud)

我在理解这个例子时遇到了困难。尤其,

  1. ps.get_n_splits()在这个例子中为什么返回 2?和
  2. 为什么test_fold数组会导致代码片段底部显示的拆分?

另外,我想问一下,在这种情况下,如果我将 ps 对象传递给cross_val_score中的函数sklearn,它是否会与这两个分割进行交叉验证?

Hai*_*hen 5

分割数是 test_folder 中排除的唯一值 (-1)。

使用此示例使用 test_fold = [0, 1, -1, 1],

  • 零索引为0,表示测试集为0,其余1、2、3为训练集。

  --- > TRAIN: [1 2 3] TEST: [0]
Run Code Online (Sandbox Code Playgroud)

- 第一个和第三个索引为1,表示测试集为1、3,其余的0、2为训练集


  ---> TRAIN: [0 2] TEST: [1 3]
Run Code Online (Sandbox Code Playgroud)
  • 第二个索引是-1,表示没有训练/测试分割。
  • 请注意,整数值本身确实有所不同,因此如果 test_folder = [5, 0, -1, 0],则分割是相同的

  --- > TRAIN: [1 2 3] TEST: [0]
Run Code Online (Sandbox Code Playgroud)

最后,对于典型的 k 文件夹分割,可以使用 test_fold = [0, 1, 2, 3]

  • 您能否更好地格式化您的答案以使其更清晰? (6认同)
  • 这应该添加到 Sklearn 文档中。 (2认同)