Scikit-learn,GroupKFold与洗牌组合?

时间:2016-11-26 14:52:38

标签: python scikit-learn shuffle cross-validation

我在scikit-learn中使用了StratifiedKFold,但现在我还要注意“团体”。有很好的功能GroupKFold,但我的数据非常依赖于时间。与帮助中的相似,即周数是分组索引。但每周应该只有一次。

假设我需要10次折叠。在我可以使用GroupKFold之前,我需要先将数据混洗。

改组是在群体中 - 因此整个群体应该互相洗牌。

有什么方法可以用scikit学习优雅吗?在我看来,GroupKFold首先可以自动改组数据。

如果没有办法用scikit做,有人可以写一些有效的代码吗?我有大量的数据集。

矩阵,标签,组作为输入

2 个答案:

答案 0 :(得分:6)

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

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

from sklearn.utils import shuffle
X_shuffled, y_shuffled, groups_shuffled = shuffle(X, y, groups, random_state=0)

然后使用X_shuffled,y_shuffled和groups_shuffled与GroupKFold:

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个shuffle(只有3个分裂而不是你需要的10个):

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

答案 1 :(得分:2)

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

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

对于X,y和组中的数据:

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)