Qual é uma boa maneira de dividir um array NumPy aleatoriamente em um conjunto de dados de treinamento e teste / validação? Algo semelhante ao cvpartition
ou crossvalind
funciona no Matlab.
fonte
Qual é uma boa maneira de dividir um array NumPy aleatoriamente em um conjunto de dados de treinamento e teste / validação? Algo semelhante ao cvpartition
ou crossvalind
funciona no Matlab.
Se quiser dividir o conjunto de dados em duas metades, você pode usar numpy.random.shuffle
, ou numpy.random.permutation
se precisar acompanhar os índices:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
numpy.random.shuffle(x)
training, test = x[:80,:], x[80:,:]
ou
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
indices = numpy.random.permutation(x.shape[0])
training_idx, test_idx = indices[:80], indices[80:]
training, test = x[training_idx,:], x[test_idx,:]
Existem muitas maneiras de particionar repetidamente o mesmo conjunto de dados para validação cruzada . Uma estratégia é fazer uma nova amostra do conjunto de dados, com repetição:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
training_idx = numpy.random.randint(x.shape[0], size=80)
test_idx = numpy.random.randint(x.shape[0], size=20)
training, test = x[training_idx,:], x[test_idx,:]
Finalmente, sklearn contém vários métodos de validação cruzada (k-fold, leave-n-out, ...). Também inclui métodos de "amostragem estratificada" mais avançados que criam uma partição dos dados que é balanceada em relação a alguns recursos, por exemplo, para garantir que haja a mesma proporção de exemplos positivos e negativos no conjunto de treinamento e teste.
Existe outra opção que envolve apenas o uso do scikit-learn. Conforme descreve o wiki do scikit , você pode simplesmente usar as seguintes instruções:
Dessa forma, você pode manter em sincronia os rótulos dos dados que está tentando dividir em treinamento e teste.
fonte
Apenas uma nota. Caso queira treinar, testar e conjuntos de validação, você pode fazer o seguinte:
Esses parâmetros darão 70% para o treinamento e 15% para cada um dos conjuntos de teste e val. Espero que isto ajude.
fonte
from sklearn.cross_validation import train_test_split
para deixar claro qual módulo você está usandoa=0.7
,b=0.15
,c=0.15
, ed = dataset
,N=len(dataset)
e, em seguidax_train = dataset[0:int(a*N)]
,x_test = dataset[int(a*N):int((a+b)*N)]
, ex_val = dataset[int((a+b)*N):]
.from sklearn.model_selection import train_test_split
Como o
sklearn.cross_validation
módulo foi descontinuado, você pode usar:fonte
Você também pode considerar a divisão estratificada em conjunto de treinamento e teste. A divisão Startified também gera conjuntos de treinamento e teste aleatoriamente, mas de forma que as proporções originais das classes sejam preservadas. Isso faz com que os conjuntos de treinamento e teste reflitam melhor as propriedades do conjunto de dados original.
Este código resulta em:
fonte
value_inds
são realmente índices, mas a saída não são índices, apenas máscaras.Eu escrevi uma função para meu próprio projeto para fazer isso (mas não usa numpy):
Se você quiser que os blocos sejam randomizados, apenas embaralhe a lista antes de passá-la.
fonte
Aqui está um código para dividir os dados em n = 5 dobras de maneira estratificada
fonte
Obrigado pberkes pela sua resposta. Acabei de modificá-lo para evitar (1) substituição durante a amostragem (2) ocorrências duplicadas no treinamento e no teste:
fonte
Depois de fazer algumas leituras e levar em consideração as (muitas ..) formas diferentes de dividir os dados para treinar e testar, decidi cronometrar!
Usei 4 métodos diferentes (nenhum deles está usando a biblioteca sklearn, que tenho certeza que dará os melhores resultados, já que é um código bem desenhado e testado):
o método 3 venceu de longe com o menor tempo, depois o método 1, e os métodos 2 e 4 descobriram ser realmente ineficientes.
O código para os 4 métodos diferentes que marquei:
E para os tempos, o tempo mínimo para executar as 3 repetições de 1000 loops é:
Espero que isso seja útil!
fonte
Provavelmente, você não só precisará dividir em treinamento e teste, mas também validação cruzada para garantir que seu modelo seja generalizado. Aqui estou assumindo 70% de dados de treinamento, 20% de validação e 10% de validação / dados de teste.
Confira o np.split :
fonte
Dividir em teste de trem e válido
fonte