sklearn.model_selection
имеет несколько других параметров, кроме train_test_split
. Один из них направлен на решение того, что вы просите. В этом случае вы можете использовать GroupShuffleSplit
, который, как упомянуто в документации, предоставляет рандомизированные индексы поезда / теста для разделения данных по сторонней группе. Это полезно, когда вы выполняете перекрестную проверку и хотите несколько раз разделить поезд-проверку, гарантируя, что наборы будут разделены полем group
. У вас также есть GroupKFold
для этих случаев, что очень полезно.
Итак, адаптируя ваш пример, вот что вы могли бы сделать.
Скажем, у вас есть, например:
from sklearn.model_selection import GroupShuffleSplit
cols = ['customer', 'calibrat', 'churn', 'churndep', 'revenue', 'mou',]
X = pd.DataFrame(np.random.rand(10, 6), columns=cols)
X['calibrat'] = np.random.choice([0,1], size=10)
print(X)
customer calibrat churn churndep revenue mou
0 0.523571 1 0.394896 0.933637 0.232630 0.103486
1 0.456720 1 0.850961 0.183556 0.885724 0.993898
2 0.411568 1 0.003360 0.774391 0.822560 0.840763
3 0.148390 0 0.115748 0.089891 0.842580 0.565432
4 0.505548 0 0.370198 0.566005 0.498009 0.601986
5 0.527433 0 0.550194 0.991227 0.516154 0.283175
6 0.983699 0 0.514049 0.958328 0.005034 0.050860
7 0.923172 0 0.531747 0.026763 0.450077 0.961465
8 0.344771 1 0.332537 0.046829 0.047598 0.324098
9 0.195655 0 0.903370 0.399686 0.170009 0.578925
y = X.pop('churn')
Теперь вы можете создавать экземпляр GroupShuffleSplit
и делать то же самое, что и с train_test_split
, с той лишь разницей, что указывается столбец group
, который будет использоваться для разделения X
и y
, поэтому группы разделяются в соответствии со значениями групп:
gs = GroupShuffleSplit(n_splits=2, train_size=.7, random_state=42)
Как уже упоминалось, это более удобно, когда вы хотите разделить на несколько групп, как правило, для перекрестной проверки. Вот только пример того, как вы получите два разделения, как упомянуто в вопросе:
train_ix, test_ix = next(gs.split(X, y, groups=X.calibrat))
X_train = X.loc[train_ix]
y_train = y.loc[train_ix]
X_test = X.loc[test_ix]
y_test = y.loc[test_ix]
Предоставление:
print(X_train)
customer calibrat churndep revenue mou
3 0.148390 0 0.089891 0.842580 0.565432
4 0.505548 0 0.566005 0.498009 0.601986
5 0.527433 0 0.991227 0.516154 0.283175
6 0.983699 0 0.958328 0.005034 0.050860
7 0.923172 0 0.026763 0.450077 0.961465
9 0.195655 0 0.399686 0.170009 0.578925
print(X_test)
customer calibrat churndep revenue mou
0 0.523571 1 0.933637 0.232630 0.103486
1 0.456720 1 0.183556 0.885724 0.993898
2 0.411568 1 0.774391 0.822560 0.840763
8 0.344771 1 0.046829 0.047598 0.324098