Jan*_*.M. 4 python validation python-3.x scikit-learn
我正在使用 sklearn 构建朴素贝叶斯分类器(nb)。
该数据集由 4 个受试者组成,每个受试者都有不同数量的标记数据。
我想应用留一主题交叉验证,但我在互联网上找不到类似的例子。
我的数据由以下部分组成:
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
但这在我的示例中不起作用,因为我想将整个主题的数据作为测试集。
有满足我需求的好产品吗?
sklearn 的方法LeaveOneGroupOut正是您所寻找的,只需传递一个group参数,该参数将定义要从训练集中剔除的每个主题。来自文档:
因此,每个训练集由除与特定组相关的样本之外的所有样本构成。
要使其适应您的数据,只需连接列表列表即可。
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 等等。
cross_val_score正如 @JanDM 所要求的,将其与参数一起使用时,groups应将其传递给split()交叉验证器的方法cv
import itertools
from sklearn.model_selection import cross_val_score
cross_val_score(estimator, joined_x, joined_y, cv=logo, groups=joined_y)
| 归档时间: | 
 | 
| 查看次数: | 4802 次 | 
| 最近记录: |