我使用的是来自scikit learn的StratifiedKFold,但现在我还需要关注“组”。有一个很好的函数GroupKFold,但是我的数据非常依赖于时间。与help中的相似,即周数是分组索引。但是每周应该只有一个折叠页。
假设我需要10次折叠。在我使用GroupKFold之前,我需要的是首先对数据进行混洗。
洗牌是一种群体意义上的洗牌--所以整个组应该相互洗牌。
有没有办法使用scikit-以某种方式学习优雅?在我看来,GroupKFold是健壮的,可以先洗牌数据。
如果没有办法用scikit做到这一点,那么有谁能写出一些有效的代码呢?我有大量的数据集。
矩阵、标签、分组作为输入
发布于 2017-01-03 23:39:14
编辑:此解决方案不起作用。
我认为使用sklearn.utils.shuffle是一个优雅的解决方案!
对于X、Y和组中的数据:
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:
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发布于 2020-02-03 22:15:28
同一组不会出现在两个不同的折叠中(不同组的数量必须至少等于折叠的数量)
在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)https://stackoverflow.com/questions/40819598
复制相似问题