Pode ser desafiador desenvolver um modelo preditivo de rede neural para um novo conjunto de dados.
Uma abordagem é primeiro inspecionar o conjunto de dados e desenvolver ideias para quais modelos podem funcionar, em seguida, explorar a dinâmica de aprendizagem de modelos simples no conjunto de dados e, finalmente, desenvolver e ajustar um modelo para o conjunto de dados com um robusto equipamento de teste.
Este processo pode ser usado para desenvolver modelos de rede neural eficazes para problemas de modelagem preditiva de classificação e regressão.
Neste tutorial, você descobrirá como desenvolver um modelo de rede neural Multilayer Perceptron para o conjunto de dados de classificação binária da ionosfera.
Depois de concluir este tutorial, você saberá:
- Como carregar e resumir o conjunto de dados da ionosfera e usar os resultados para sugerir preparações de dados e configurações de modelo a serem usadas.
- Como explorar a dinâmica de aprendizagem de modelos MLP simples no conjunto de dados.
- Como desenvolver estimativas robustas de desempenho do modelo, ajustar o desempenho do modelo e fazer previsões sobre novos dados.
Vamos começar.

Como desenvolver uma rede neural para prever distúrbios na ionosfera
Foto de Sergey Pesterev, alguns direitos reservados.
Visão geral do tutorial
Este tutorial é dividido em quatro partes; eles estão:
- Conjunto de dados de classificação binária da Ionosphere
- Dinâmica de aprendizagem de rede neural
- Avaliação e ajuste de modelos de MLP
- Modelo final e fazer previsões
Conjunto de dados de classificação binária da Ionosphere
A primeira etapa é definir e explorar o conjunto de dados.
Estaremos trabalhando com o “Ionosfera”Conjunto de dados de classificação binária padrão.
Este conjunto de dados envolve prever se uma estrutura está na atmosfera ou não com retornos de radar.
Você pode aprender mais sobre o conjunto de dados aqui:
Você pode ver as primeiras linhas do conjunto de dados abaixo.
1,0,0.99539, -0.05889,0.85243,0.02306,0.83398, -0.37708,1,0.03760,0.85243, -0.17755,0.59755, -0.44945,0.60536, -0.38223,0,84356, -0.38542.0.58212, --0.32192.58212 0,29674,0,36946, -0,47357,0,56811, -0,51171,0,41078, -0,46168,0,21266, -0,34090,0.42267, -0,54487,0.18641, -0.45300, g 1,0,1, -0.18829,0.93035, -0.36156, -0.10868, -0.93597,1, -0.04549,0.50874, -0.67743,0.34432, -0.69707, -0.51685, -0.97515,0.05499, -0.62237,0.33109, -1 , -0,13151, -0,45300, -0,18056, -0,35734, -0,20332, -0,26569, -0,20468, -0,18401, -0,19040, -0,111593, -0,16626, -0,06288, -0,13738, -0,02447, b 1,0,1, -0.03365,1,0.00485,1, -0.12062,0.88965,0.01198,0.73082,0.05346,0.85443,0.00827,0.54591,0.00299,0.83775, -0.13644,0.75535, -0.08540,0.70887, -0.27502,0.43385 , -0.12062,0.57528, -0.40220,0.58984, -0.22145,0.43100, -0.17365,0.60436, -0.24180,0.56045, -0.38238, g 1,0,1, -0.45161,1,1,0.71216, -1,0,0,0,0,0,0, -1,0.14516,0.54094, -0.39330, -1, -0.54467, -0.69975,1 , 0,0,1,0.90695,0.51613,1,1, -0.20099,0.25682,1, -0.32382,1, b 1,0,1, -0,02401,0.94140,0.06531,0.92106, -0,23255,0.77152, -0,16399,0.52798, -0,20275,0.56409, -0,00712,0.34395, -0,27457,0.52940, -0,21780,0.45107, -0,17813,05982 -0.35575,0.02309, -0.52879,0.03286, -0.65158,0.13290, -0.53206,0.02431, -0.62197, -0.05707, -0.59573, -0.04608, -0.65697, g ... |
Podemos ver que os valores são todos numéricos e talvez na faixa [-1, 1]. Isso sugere que provavelmente algum tipo de escala não seria necessário.
Também podemos ver que o rótulo é uma string (“g" e "b“), Sugerindo que os valores precisarão ser codificados para 0 e 1 antes de ajustar um modelo.
Podemos carregar o conjunto de dados como um DataFrame do pandas diretamente da URL; por exemplo:
# carregue o conjunto de dados da ionosfera e resuma a forma a partir de pandas importar leitura_csv # define a localização do conjunto de dados url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv' # carregue o conjunto de dados df = read_csv(url, cabeçalho=Nenhum) # forma de resumo imprimir(df.forma) |
A execução do exemplo carrega o conjunto de dados diretamente do URL e relata a forma do conjunto de dados.
Neste caso, podemos ver que o conjunto de dados possui 35 variáveis (34 entradas e uma saída) e que o conjunto de dados possui 351 linhas de dados.
Não são muitas linhas de dados para uma rede neural e sugere que uma pequena rede, talvez com regularização, seria apropriada.
Também sugere que o uso de validação cruzada k-fold seria uma boa ideia, dado que dará uma estimativa mais confiável do desempenho do modelo do que uma divisão de treinamento / teste e porque um único modelo caberá em segundos em vez de horas ou dias com o maiores conjuntos de dados.
A seguir, podemos aprender mais sobre o conjunto de dados observando as estatísticas de resumo e um gráfico dos dados.
# mostra estatísticas resumidas e gráficos do conjunto de dados da ionosfera a partir de pandas importar read_csv a partir de matplotlib importar pyplot # define a localização do conjunto de dados url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv' # carregue o conjunto de dados df = read_csv(url, cabeçalho=Nenhum) # mostrar estatísticas resumidas imprimir(df.descrever()) # plotar histogramas df.hist() pyplot.mostrar() |
A execução do exemplo carrega primeiro os dados antes e depois imprime as estatísticas de resumo para cada variável.
Podemos ver que os valores médios de cada variável estão na casa das dezenas, com valores variando de -1 a 1. Isso confirma que provavelmente não é necessário dimensionar os dados.
0 1 2 ... 31 32 33 contagem 351,000000 351,0 351,000000 ... 351,000000 351,000000 351,000000 média 0,891738 0,0 0,641342 ... -0,003794 0,349364 0,014480 std 0,311155 0,0 0,497708 ... 0,513574 0,522663 0,468337 min 0,000000 0,0 -1,000000 ... -1,000000 -1,000000 -1,000000 25% 1,000000 0,0 0,472135 ... -0,242595 0,000000 -0,165350 50% 1,000000 0,0 0,871110 ... 0,000000 0,409560 0,000000 75% 1.000000 0.0 1.000000 ... 0.200120 0.813765 0,171660 máx 1.000000 0.0 1.000000 ... 1.000000 1.000000 1.000000 |
Um gráfico de histograma é então criado para cada variável.
Podemos ver que muitas variáveis têm uma distribuição gaussiana ou semelhante a gaussiana.
Podemos ter alguns benefícios em usar uma transformação de potência em cada variável para tornar a distribuição de probabilidade menos distorcida, o que provavelmente melhorará o desempenho do modelo.

Histogramas do conjunto de dados de classificação da ionosfera
Agora que estamos familiarizados com o conjunto de dados, vamos explorar como podemos desenvolver um modelo de rede neural.
Dinâmica de aprendizagem de rede neural
Desenvolveremos um modelo Multilayer Perceptron (MLP) para o conjunto de dados usando TensorFlow.
Não podemos saber qual arquitetura de modelo de hiperparâmetros de aprendizado seria boa ou melhor para esse conjunto de dados, portanto, devemos experimentar e descobrir o que funciona bem.
Dado que o conjunto de dados é pequeno, um tamanho de lote pequeno é provavelmente uma boa ideia, por exemplo, 16 ou 32 linhas. Usar a versão Adam da descida gradiente estocástica é uma boa ideia ao começar, pois ela se adapta automaticamente à taxa de aprendizado e funciona bem na maioria dos conjuntos de dados.
Antes de avaliarmos os modelos a sério, é uma boa ideia revisar a dinâmica de aprendizado e ajustar a arquitetura do modelo e a configuração de aprendizado até que tenhamos uma dinâmica de aprendizado estável e, em seguida, observe como obter o máximo do modelo.
Podemos fazer isso usando uma divisão simples de treinamento / teste dos dados e gráficos de revisão das curvas de aprendizado. Isso nos ajudará a ver se estamos aprendendo demais ou subaprendendo; então podemos adaptar a configuração de acordo.
Primeiro, devemos garantir que todas as variáveis de entrada sejam valores de ponto flutuante e codificar o rótulo de destino como valores inteiros 0 e 1.
... # garantir que todos os dados sejam valores de ponto flutuante X = X.astype('float32') # codifica strings para inteiro y = LabelEncoder().fit_transform(y) |
Em seguida, podemos dividir o conjunto de dados em variáveis de entrada e saída e, em seguida, em conjuntos de treinamento e teste 67/33.
... # dividido em colunas de entrada e saída X, y = df.valores[:, :-1], df.valores[:, -1] # dividido em conjuntos de dados de treinamento e teste X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0,33) |
Podemos definir um modelo MLP mínimo. Nesse caso, usaremos uma camada oculta com 10 nós e uma camada de saída (escolhida arbitrariamente). Usaremos a função de ativação ReLU na camada oculta e o “he_normal”Inicialização de peso, pois juntos, eles são uma boa prática.
O...