Eu tenho um conjunto de dados bastante grande na forma de um quadro de dados e queria saber como seria capaz de dividir o quadro de dados em duas amostras aleatórias (80% e 20%) para treinamento e teste.
Obrigado!
python
python-2.7
pandas
dataframe
tooty44
fonte
fonte
msk
é de dtipobool
,df[msk]
,df.iloc[msk]
edf.loc[msk]
sempre retornam o mesmo resultado.rand
para< 0.8
fazer sentido porque ele retorna uniformemente distribuído números aleatórios entre 0 e 1.in[12]
,in[13]
,in[14]
? Eu quero entender o próprio código python aquinp.random.rand(len(df))
é uma matriz de tamanholen(df)
com valores flutuantes distribuídos aleatoriamente e uniformemente no intervalo [0, 1]. O< 0.8
aplica a comparação elemento a elemento e armazena o resultado no local. Assim valores <0,8 tornouTrue
eo valor> = 0,8 tornarFalse
o scikit learn's
train_test_split
é bom.fonte
kf = KFold(n, n_folds=folds) for train_index, test_index in kf: X_train, X_test = X.ix[train_index], X.ix[test_index]
veja exemplo completo aqui: quantstart.com/articles/…from sklearn.model_selection import train_test_split
alternativa.from sklearn.cross_validation import train_test_split
A amostra aleatória do Pandas também funcionará
fonte
random_state
arg está fazendo?test
conjunto aleatório for desejado, como indicado aqui stackoverflow.com/questions/29576430/shuffle-dataframe-rows .test=df.drop(train.index).sample(frac=1.0)
Eu usaria o training_test_split do scikit-learn e o geraria a partir do índice
fonte
cross_validation
módulo agora está obsoleto:DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
Existem várias maneiras de criar um trem / teste e até amostras de validação.
Caso 1: maneira clássica,
train_test_split
sem opções:Caso 2: caso de conjuntos de dados muito pequenos (<500 linhas): para obter resultados para todas as suas linhas com essa validação cruzada. No final, você terá uma previsão para cada linha do seu conjunto de treinamento disponível.
Caso 3a: Conjuntos de dados desequilibrados para fins de classificação. Seguindo o caso 1, aqui está a solução equivalente:
Caso 3b: Conjuntos de dados desequilibrados para fins de classificação. Seguindo o caso 2, aqui está a solução equivalente:
Caso 4: você precisa criar um conjunto de treinamento / teste / validação no big data para ajustar os hiperparâmetros (60% de treinamento, 20% de teste e 20% de val).
fonte
Você pode usar o código abaixo para criar amostras de teste e treinamento:
O tamanho do teste pode variar dependendo da porcentagem de dados que você deseja colocar no seu teste e treinar o conjunto de dados.
fonte
Existem muitas respostas válidas. Adicionando mais um ao grupo. de sklearn.cross_validation import train_test_split
fonte
Você também pode considerar a divisão estratificada em conjunto de treinamento e teste. A divisão iniciada também gera um conjunto de treinamento e teste aleatoriamente, mas de maneira que as proporções originais da classe sejam preservadas. Isso faz com que os conjuntos de treinamento e teste reflitam melhor as propriedades do conjunto de dados original.
df [train_inds] e df [test_inds] fornecem os conjuntos de treinamento e teste do seu DataFrame df original.
fonte
Se você precisar dividir seus dados com relação à coluna lables no seu conjunto de dados, poderá usar este:
e use-o:
você também pode passar random_state se desejar controlar a aleatoriedade de divisão ou usar alguma semente aleatória global.
fonte
fonte
Você pode usar ~ (operador til) para excluir as linhas amostradas usando df.sample (), permitindo que os pandas gerenciem sozinho a amostragem e a filtragem de índices para obter dois conjuntos.
fonte
Foi o que escrevi quando precisei dividir um DataFrame. Eu considerei usar a abordagem de Andy acima, mas não gostei de não poder controlar exatamente o tamanho dos conjuntos de dados (ou seja, às vezes seria 79, às vezes 81, etc.).
fonte
Basta selecionar a linha do intervalo de df assim
fonte
df
no seu snippet de código é (ou deveria ser) embaralhado, a resposta será melhorada.Há muitas ótimas respostas acima, então só quero adicionar mais um exemplo, caso você queira especificar o número exato de amostras para os conjuntos de trem e teste usando apenas a
numpy
biblioteca.fonte
Para dividir em mais de duas classes, como treinamento, teste e validação, é possível:
Isso colocará aproximadamente 70% dos dados em treinamento, 15% em teste e 15% em validação.
fonte
você precisa converter o quadro de dados do pandas em matriz numpy e, em seguida, converter a matriz numpy novamente em quadro de dados
fonte
Se seu desejo é ter um quadro de dados dentro e dois quadros de dados fora (não matrizes numpy), isso deve fazer o truque:
fonte
Você pode usar a função df.as_matrix () e criar Numpy-array e passá-la.
fonte
Um pouco mais elegante para o meu gosto é criar uma coluna aleatória e depois dividi-la, dessa forma, podemos obter uma divisão que atenda às nossas necessidades e que seja aleatória.
fonte
fonte
Não há necessidade de converter para numpy. Basta usar um pandas df para fazer a divisão e ele retornará um pandas df.
E se você quiser dividir x de y
fonte
Eu acho que você também precisa obter uma cópia e não uma fatia do dataframe, se quiser adicionar colunas mais tarde.
fonte
Que tal agora? df é meu dataframe
fonte