【问题标题】:K-Fold Cross validation with different (merged) datasets使用不同(合并)数据集的 K 折交叉验证
【发布时间】:2022-01-15 21:07:23
【问题描述】:

我有 15 个不同的数据集(包含 15 个pandas.DataFrame)的相同问题,我想从单个分类器的角度进行 K-Fold CV 研究。目前,我正在使用以下结构进行一些实验:

# Manual 15-Fold CV
for i in range(len(datasets)):
   train_sets = [datasets[j] for j in range(len(datasets)) if j != i]
   test_set = datasets[i]

   train = pd.concat(train_sets)
   clf = ...
   clf.fit(...)
   ...

如您所见,我需要将每个数据集视为 K-Fold 的折叠,而不是简单地将所有数据集合并为一个并运行默认的 cross_val_score() 或类似的东西。

这在运行单一实验时效果很好,但我想使用GridSearchCV 来更好地探索我的模型。所以,问题是:有没有办法创建一个自定义的KFold,预先定义每个折叠的内容并将其传递给GridSearchCV

【问题讨论】:

    标签: python pandas machine-learning scikit-learn data-mining


    【解决方案1】:

    来自documentation

    cv: int,交叉验证生成器或可迭代的,默认=None

    一个可迭代的 yield (train, test) 拆分为索引数组。

    这样您就可以创建一个元组列表,并将所有数据合并到一个数据集中,同时保留可以在这些元组中使用的索引,

    因此,如果您在称为 indicies 的 numpy 数组列表中有索引。

    编辑:这是未经测试的,但它应该可以工作。

    indicies = []
    train_test_set = []
    last_element = 0
    for j in range(len(datasets)):
        train_test_set.append(datasets[j])
        indicies.append(np.arange(last_element,last_element+len(datasets[j])))
        last_element += len(datasets[j])
    
    cv_list = []
    for i in range(15):
        cv_train = np.hstack([indicies[x] for x in range(15) if x != i])
        cv_list.append((cv_train,indicies[i]))
    

    只需将 cv_list 传递给函数。

    Edit2:修正了代码中的拼写错误。

    【讨论】:

    • 所以,我可以使用 cv_list 为每次运行传递预定义的训练/验证数据集,对吗?
    • 是的,索引的每个条目应该是一个 numpy 数组,其中包含整个数据集中“折叠”的索引,这样它将根据条目创建正确的训练/测试拆分指标。
    • 然后将整个数据集作为一个巨大的矩阵传递给函数。
    • 我会试着回到这里告诉你它是否有效!感谢您的帮助!
    • 对不起,我意识到我不明白如何获取indicies 数组。你能扩展你的答案吗?
    猜你喜欢
    • 2018-05-03
    • 2016-01-15
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 2019-10-09
    • 2020-09-10
    • 2020-10-24
    • 2018-06-22
    相关资源
    最近更新 更多