Как разделить данные на основе значения столбца в sklearn - PullRequest
1 голос
/ 09 апреля 2020

У меня есть файл данных со следующими столбцами

'customer', 'calibrat' - калибровочный образец = 1; Образец проверки = 0; 'churn', 'churndep', 'yield', 'mou',

Файл данных содержит около 40000 строк, из которых 20000 имеют значение для калибровки как 1. Я хочу разделить эти данные на

X1 = data.loc[:, data.columns != 'churn']
y1 = data.loc[:, data.columns == 'churn']
from imblearn.over_sampling import SMOTE
os = SMOTE(random_state=0)
X1_train, X1_test, y1_train, y1_test = train_test_split(X1, y1, test_size=0.3, random_state=0)

я хочу, чтобы в моем X1_train приходили данные для калибровки с calibrat = 1, а в X1_test - все данные для проверки с calibrat = 0

1 Ответ

1 голос
/ 09 апреля 2020

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
...