Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scikit学习,分组分组分组?_Python_Scikit Learn_Shuffle_Cross Validation - Fatal编程技术网

Python Scikit学习,分组分组分组?

Python Scikit学习,分组分组分组?,python,scikit-learn,shuffle,cross-validation,Python,Scikit Learn,Shuffle,Cross Validation,我使用的是scikit learn中的StratifiedKFold,但现在我还需要关注“组”。有很好的函数GroupKFold,但是我的数据非常依赖于时间。与帮助中的情况类似,即周数是分组索引。但每周应该只有一次 假设我需要10倍。我需要的是先洗牌数据,然后才能使用GroupKFold 洗牌是在小组赛中进行的,所以整个小组应该互相洗牌 有没有办法用scikit学习优雅?在我看来,GroupKFold对于先洗牌数据非常健壮 如果没有办法用scikit来实现,那么有人能为此编写一些有效的代码吗?我

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

假设我需要10倍。我需要的是先洗牌数据,然后才能使用GroupKFold

洗牌是在小组赛中进行的,所以整个小组应该互相洗牌

有没有办法用scikit学习优雅?在我看来,GroupKFold对于先洗牌数据非常健壮

如果没有办法用scikit来实现,那么有人能为此编写一些有效的代码吗?我有大量的数据集


矩阵、标签、组作为输入编辑:此解决方案不起作用

我认为使用是一个优雅的解决方案

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

from sklearn.utils import shuffle
X_shuffled, y_shuffled, groups_shuffled = shuffle(X, y, groups, random_state=0)
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)
然后使用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次):


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

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

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

from sklearn.utils import shuffle
X_shuffled, y_shuffled, groups_shuffled = shuffle(X, y, groups, random_state=0)
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)

不幸的是,这一策略似乎不起作用。看,这里显示它只是重新排列每个折叠的元素,但它不会产生新的拆分!