У меня есть датафрейм pandas, и я хочу разделить его на 3 отдельных набора. Я знаю , что с помощью train_test_split из sklearn.cross_validation
, можно разделить данные в двух сетах (поезд и тест). Тем не менее, я не смог найти никакого решения о разделении данных на три набора. Желательно, чтобы у меня были индексы исходных данных.
Я знаю, что обходной путь будет использовать train_test_split
два раза и как-то скорректировать индексы. Но есть ли более стандартный / встроенный способ разбить данные на 3 набора вместо 2?
Ответы:
Numpy решение. Сначала мы перетасуем весь набор данных (df.sample (frac = 1)), а затем разделим наш набор данных на следующие части:
[int(.6*len(df)), int(.8*len(df))]
- этоindices_or_sections
массив для numpy.split () .Вот небольшая демонстрация для
np.split()
использования - давайте разделим массив из 20 элементов на следующие части: 80%, 10%, 10%:источник
frac=1
инструктируетsample()
функцию возвращать все (100%
или дробные =1.0
) строкиnp.random.seed(any_number)
перед линией разделения, чтобы получить одинаковый результат при каждом запуске. Во-вторых, чтобы сделать неравное соотношение, какtrain:test:val::50:40:10
использование[int(.5*len(dfn)), int(.9*len(dfn))]
. Здесь первый элемент обозначает размер дляtrain
(0,5%), второй элемент обозначает размер дляval
(1-0,9 = 0,1%), а разница между двумя значениями обозначает размер дляtest
(0,9-0,5 = 0,4%). Поправь меня, если я ошибаюсь :)Примечание:
Была написана функция для обработки заполнения создания случайного набора. Вы не должны полагаться на разбиение множества, которое не рандомизирует множества.
демонстрация
источник
Тем не менее, один из подходов к разделению набора данных в
train
,test
,cv
с0.6
,0.2
,0.2
будут использоватьtrain_test_split
метод дважды.источник
np.split()
. Кроме того, он не требует дополнительной зависимости отsklearn
.Вот функция Python, которая разбивает фрейм данных Pandas на обучающие, проверочные и тестовые фреймы данных со стратифицированной выборкой. Он выполняет это разделение, дважды вызывая функцию scikit-learn
train_test_split()
.Ниже приведен полный рабочий пример.
Рассмотрим набор данных с меткой, на которой вы хотите выполнить стратификацию. Эта метка имеет свое собственное распространение в исходном наборе данных, скажем, 75%
foo
, 15%bar
и 10%baz
. Теперь давайте разделим набор данных на тренировку, проверку и тестирование на подмножества, используя соотношение 60/20/20, где каждое разделение сохраняет одинаковое распределение меток. Смотрите иллюстрацию ниже:Вот пример набора данных:
Теперь давайте вызовем
split_stratified_into_train_val_test()
функцию сверху, чтобы получить обучающие, проверочные и тестовые кадры данных в соотношении 60/20/20.Три dataframes
df_train
,df_val
иdf_test
содержит все исходные строки , но их размеры будут следовать выше соотношению.Кроме того, каждое из трех разделений будет иметь одинаковое распределение метки, а именно 75%
foo
, 15%bar
и 10%baz
.источник
Это очень удобно использовать
train_test_split
без переиндексации после разделения на несколько наборов и без написания дополнительного кода. В вышеприведенном наилучшем ответе не упоминается, что разделение два раза с использованиемtrain_test_split
неизменяемых размеров разделов не даст изначально предполагаемый раздел:Тогда часть проверочных и тестовых наборов в x_remain изменится и может быть посчитана как
В этом случае все начальные разделы сохраняются.
источник