【问题标题】:Scikit-learn, GroupKFold with shuffling groups?Scikit-learn,GroupKFold 与洗牌组?
【发布时间】:2017-04-10 17:12:38
【问题描述】:

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

假设我需要 10 折。我需要先打乱数据,然后才能使用 GroupKFold。

洗牌是在群体意义上的——所以整个群体应该相互洗牌。

有没有办法以某种方式使用 scikit-learn 优雅?在我看来,GroupKFold 可以先对数据进行洗牌。

如果没有办法用 scikit 做到这一点,任何人都可以编写一些有效的代码吗?我有大型数据集。

矩阵、标签、组作为输入

【问题讨论】:

    标签: python scikit-learn shuffle cross-validation


    【解决方案1】:

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

    我认为使用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 次随机播放(并且只有 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
    

    【讨论】:

    • 不幸的是,这种策略似乎行不通。请参阅stackoverflow.com/q/41859613/1551810,它显示它只是重新排列每个折叠的元素,但它没有给出新的拆分!
    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 2018-11-01
      • 2015-01-31
      • 2015-04-15
      • 2013-07-01
      • 2021-03-26
      • 2019-09-04
      相关资源
      最近更新 更多