【问题标题】:How to apply Leave-one-Group-out cross validation in sklearn?如何在 sklearn 中应用 Leave-one-Group-out 交叉验证?
【发布时间】:2021-06-18 09:27:05
【问题描述】:

我正在使用 sklearn 构建一个朴素贝叶斯分类器 (nb)。

该数据集由 4 个主题组成,每个主题都有不同数量的标记数据。

我想应用 leave-one-subject-out 交叉验证,但我在 Internet 上找不到可比较的示例。

我的数据包括以下内容:

x = [[2,0],[3,1],[2,1],[3,2]], [[4,2],[5,3],[5,2],[5,3]], [[7,3],[6,2],[7,1],[6,2]], [[2,3],[2,4],[3,4],[2,3]]]
y = [[0,1,3,2],[1,2,3,2],[0,1,1,1],[0,1,2,1]]

所以每个主题的数据是x中的一个子数组和y对应的子数组。输入特征各包含 2 个元素(例如加速度计的平均值和标准差)。

我在网上找到了这个例子

sklearn.model_selection.LeaveOneOut

但这在我的示例中不起作用,因为我想将整个主题的数据作为测试集。

是否有适合我的需求的等价物?

【问题讨论】:

    标签: python python-3.x validation scikit-learn


    【解决方案1】:

    sklearn 的方法LeaveOneGroupOut 是您要寻找的,只需传递一个group 参数,该参数将定义从训练集中忽略的每个主题。来自docs

    因此,每个训练集都由除了与特定组相关的样本之外的所有样本构成。

    要使其适应您的数据,只需连接列表列表。

    import itertools
    from sklearn.model_selection import LeaveOneGroupOut
    
    joined_x = list(itertools.chain.from_iterable(x))
    joined_y = list(itertools.chain.from_iterable(y))
    
    logo = LeaveOneGroupOut()
    for train, test in logo.split(joined_x, joined_y, groups=joined_y):
        print("%s %s" % (train, test))
    >>>
    [ 1  2  3  4  5  6  7  9 10 11 13 14 15] [ 0  8 12]
    [ 0  2  3  5  6  7  8 12 14] [ 1  4  9 10 11 13 15]
    [ 0  1  2  4  6  8  9 10 11 12 13 15] [ 3  5  7 14]
    [ 0  1  3  4  5  7  8  9 10 11 12 13 14 15] [2 6]
    

    在第一个训练集中第 0 组是测试,第二组 1 以此类推。

    编辑

    根据@JanDM 的要求,要将其与cross_val_score 一起使用,应该传递groups 参数,因为它是交叉验证器cvsplit() 方法pass to

    import itertools
    from sklearn.model_selection import cross_val_score
    cross_val_score(estimator, joined_x, joined_y, cv=logo, groups=joined_y)
    

    【讨论】:

    • 您能否更新有关如何将其与 sklearn.model_selection.cross_val_score() 结合使用的答案?我不知道它会如何协同工作
    • @JanD.M.请查看编辑,只需将groups 参数传递给cross_val_score
    猜你喜欢
    • 2023-03-05
    • 2019-11-19
    • 2016-01-19
    • 2021-04-03
    • 2020-04-09
    • 2012-12-31
    • 2018-08-16
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多