Eu tenho um dataframe de pandas e desejo dividi-lo em 3 conjuntos separados. Eu sei que usando train_test_split de sklearn.cross_validation
, é possível dividir os dados em dois conjuntos (train e test). No entanto, não consegui encontrar nenhuma solução para dividir os dados em três conjuntos. De preferência, eu gostaria de ter os índices dos dados originais.
Eu sei que uma solução alternativa seria usar train_test_split
duas vezes e de alguma forma ajustar os índices. Mas existe uma maneira mais padrão / interna de dividir os dados em 3 conjuntos em vez de 2?
Respostas:
Solução Numpy. Vamos embaralhar o conjunto de dados inteiro primeiro (df.sample (frac = 1)) e depois dividimos nosso conjunto de dados nas seguintes partes:
[int(.6*len(df)), int(.8*len(df))]
- é umaindices_or_sections
matriz para numpy.split () .Aqui está uma pequena demonstração para
np.split()
uso - vamos dividir a matriz de 20 elementos nas seguintes partes: 80%, 10%, 10%:fonte
frac=1
instruisample()
funcionar para retornar todos (100%
ou fração =1.0
) fileirasnp.random.seed(any_number)
antes da linha de divisão para obter o mesmo resultado a cada execução. Segundo, para criar uma proporção desigual como otrain:test:val::50:40:10
uso[int(.5*len(dfn)), int(.9*len(dfn))]
. Aqui, o primeiro elemento indica tamanho paratrain
(0,5%), o segundo elemento indica tamanho paraval
(1-0,9 = 0,1%) e a diferença entre os dois denota tamanho paratest
(0,9-0,5 = 0,4%). Corrija-me se eu estiver errado :)Nota:
A função foi escrita para lidar com a propagação da criação de conjuntos aleatórios. Você não deve confiar na divisão de conjuntos que não os randomiza.
Demonstração
fonte
No entanto, uma abordagem para dividir o conjunto de dados em
train
,test
,cv
com0.6
,0.2
,0.2
seria usar otrain_test_split
método duas vezes.fonte
np.split()
. Além disso, ele não requer dependência adicionalsklearn
.Aqui está uma função Python que divide um quadro de dados do Pandas em quadros de dados de treinamento, validação e teste com amostragem estratificada. Ele realiza essa divisão chamando a função scikit-learn
train_test_split()
duas vezes.Abaixo está um exemplo completo de trabalho.
Considere um conjunto de dados com um rótulo no qual você deseja executar a estratificação. Esse rótulo tem sua própria distribuição no conjunto de dados original, digamos 75%
foo
, 15%bar
e 10%baz
. Agora vamos dividir o conjunto de dados em treinamento, validação e teste em subconjuntos usando uma proporção 60/20/20, em que cada divisão retém a mesma distribuição dos rótulos. Veja a ilustração abaixo:Aqui está o exemplo do conjunto de dados:
Agora, vamos chamar a
split_stratified_into_train_val_test()
função de cima para obter quadros de dados de trem, validação e teste seguindo uma proporção de 60/20/20.Os três dataframes
df_train
,df_val
edf_test
conter todas as linhas originais, mas seus tamanhos seguirá a relação acima.Além disso, cada uma das três divisões terá a mesma distribuição do rótulo, ou seja, 75%
foo
, 15%bar
e 10%baz
.fonte
É muito conveniente usar
train_test_split
sem executar a reindexação após dividir em vários conjuntos e sem escrever algum código adicional. A melhor resposta acima não menciona que, ao separar duas vezes,train_test_split
sem alterar os tamanhos das partições, você não fornecerá a partição pretendida inicialmente:Em seguida, a parte dos conjuntos de validação e teste no x_remain muda e pode ser contada como
Nesta ocasião, todas as partições iniciais são salvas.
fonte