首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scikit-learn,GroupKFold with shuffling groups?

Scikit-learn,GroupKFold with shuffling groups?
EN

Stack Overflow用户
提问于 2016-11-26 22:52:38
回答 2查看 6.3K关注 0票数 11

我使用的是来自scikit learn的StratifiedKFold,但现在我还需要关注“组”。有一个很好的函数GroupKFold,但是我的数据非常依赖于时间。与help中的相似,即周数是分组索引。但是每周应该只有一个折叠页。

假设我需要10次折叠。在我使用GroupKFold之前,我需要的是首先对数据进行混洗。

洗牌是一种群体意义上的洗牌--所以整个组应该相互洗牌。

有没有办法使用scikit-以某种方式学习优雅?在我看来,GroupKFold是健壮的,可以先洗牌数据。

如果没有办法用scikit做到这一点,那么有谁能写出一些有效的代码呢?我有大量的数据集。

矩阵、标签、分组作为输入

EN

回答 2

Stack Overflow用户

发布于 2017-01-03 23:39:14

编辑:此解决方案不起作用。

我认为使用sklearn.utils.shuffle是一个优雅的解决方案!

对于X、Y和组中的数据:

代码语言:javascript
复制
from sklearn.utils import shuffle
X_shuffled, y_shuffled, groups_shuffled = shuffle(X, y, groups, random_state=0)

然后在GroupKFold中使用X_shuffled、y_shuffled和groups_shuffled:

代码语言:javascript
复制
from sklearn.model_selection import GroupKFold
group_k_fold = GroupKFold(n_splits=10)
splits = group_k_fold.split(X_shuffled, y_shuffled, groups_shuffled)

当然,您可能想要多次混洗,并在每次混洗时进行交叉验证。你可以把整个东西放在一个循环中--这是一个完整的例子,有5次洗牌(只有3次拆分,而不是你要求的10次):

代码语言:javascript
复制
X = np.arange(20).reshape((10, 2))
y = np.arange(10)
groups = [0, 0, 0, 1, 2, 3, 4, 5, 6, 7]

n_shuffles = 5
group_k_fold = GroupKFold(n_splits=3)

for i in range(n_shuffles):
    X_shuffled, y_shuffled, groups_shuffled = shuffle(X, y, groups, random_state=i)
    splits = group_k_fold.split(X_shuffled, y_shuffled, groups_shuffled)
    # do something with splits here, I'm just printing them out
    print 'Shuffle', i
    print 'groups_shuffled:', groups_shuffled
    for train_idx, val_idx in splits:
        print 'Train:', train_idx
        print 'Val:', val_idx
票数 10
EN

Stack Overflow用户

发布于 2020-02-03 22:15:28

同一组不会出现在两个不同的折叠中(不同组的数量必须至少等于折叠的数量)

在GroupKfold中,组的形状与数据形状相同

对于X、Y和组中的数据:

代码语言:javascript
复制
import numpy as np
import pandas as pd
from sklearn.model_selection import GroupKFold
from sklearn.model_selection import GridSearchCV
from xgboost import XGBClassifier
import datetime

X = np.array([[1,2,1,1], [3,4,7,8], [5,6,1,3], [7,8,4,7]])
y=np.array([0,2,1,2])
groups=np.array([2,1,0,1])  
group_kfold = GroupKFold(n_splits=len(groups.unique))
group_kfold.get_n_splits(X, y, groups)

 param_grid ={
        'min_child_weight': [50,100],
        'subsample': [0.1,0.2],
        'colsample_bytree': [0.1,0.2],
        'max_depth': [2,3],
        'learning_rate': [0.01],
        'n_estimators': [100,500],
        'reg_lambda': [0.1,0.2]        
        }

xgb = XGBClassifier()

grid_search = GridSearchCV(xgb, param_grid, cv=group_kfold.split(X, Y, groups), n_jobs=-1)

result = grid_search.fit(X,Y)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40819598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档