Como o parâmetro validation_split da função de ajuste de Keras funciona?

17

A divisão de validação na função de ajuste do modelo sequencial Keras está documentada da seguinte maneira em https://keras.io/models/sequential/ :

validation_split: flutua entre 0 e 1. Fração dos dados de treinamento a serem usados ​​como dados de validação. O modelo separará essa fração dos dados de treinamento, não treinará nele e avaliará a perda e quaisquer métricas de modelo nesses dados no final de cada época. Os dados de validação são selecionados das últimas amostras nos dados x e y fornecidos, antes da reprodução aleatória.

Observe a última linha:

Os dados de validação são selecionados das últimas amostras nos dados x e y fornecidos, antes da reprodução aleatória.

Isso significa que os dados de validação são sempre fixos e retirados da parte inferior do conjunto de dados principal?

Existe alguma maneira de selecionar aleatoriamente uma fração de dados do conjunto de dados principal?

rnso
fonte

Respostas:

17

Na verdade, você não gostaria de reexaminar seu conjunto de validação após cada época. Se você fizesse isso, seu modelo seria treinado em todas as amostras em seu conjunto de dados e, portanto, isso causará super ajuste. Você sempre deseja dividir seus dados antes do processo de treinamento e, em seguida, o algoritmo deve ser treinado apenas usando o subconjunto dos dados para treinamento.

A função projetada garante que os dados sejam separados de forma que eles sempre treinem na mesma parte dos dados para cada época. Todo o embaralhamento é realizado na amostra de treinamento entre as épocas, se essa opção for escolhida.

No entanto, para alguns conjuntos de dados, obter as últimas instâncias não é útil, especificamente se o conjunto de dados for reagrupado com base na classe. Em seguida, a distribuição de suas aulas será distorcida. Portanto, você precisará de algum tipo de maneira aleatória para extrair um subconjunto dos dados para obter distribuições de classe equilibradas no conjunto de treinamento e validação. Para isso, eu sempre gosto de usar a função sklearn da seguinte maneira

from sklearn.model_selection import train_test_split

# Split the data
x_train, x_valid, y_train, y_valid = train_test_split(data, labels, test_size=0.33, shuffle= True)

É uma função fácil de usar que faz o que você deseja. As variáveis datae labelssão matrizes numpy padrão, com a primeira dimensão sendo as instâncias.

JahKnows
fonte
1
Não quis dizer testes diferentes após cada época. Eu estava perguntando sobre como obter dados do final do conjunto de dados, pois muitos conjuntos de dados podem ser organizados de acordo com a classe (como você mencionou). Eu sei train_test_splite agora você confirma que este é um método melhor, pois ele obterá aleatoriamente dados de teste / validação do conjunto de dados.
rnso
@ rnso, infelizmente o Keras não oferece essa opção. Eu acho que não está realmente dentro do escopo do que eles querem oferecer. Isso tornaria a implementação um pouco confusa, com duas entradas de método diferentes com aleatório no nome.
JahKnows
Você não misturou a definição de validação e dados de teste usando esse train_test_spli?
303519 bagustris
Se você usasse o shuffleparâmetro, também usaria shuffleno .fitmodelo para um keras?
Shamoon