Predição de Regressão com Redes Neurais Profundas: Abordagem Prática em MATLAB
A tarefa de predição por regressão pode ser desafiadora, mas com as ferramentas adequadas, os resultados podem ser significativamente melhorados. Neste guia prático, exploraremos como utilizar a caixa de ferrramentas de deep learning do MATLAB para realizar predições de regressão, desde a importação dos dados até a avaliação do modelo. Códigos prontos estão disponíveis para cópia e adaptação com seus próprios dados.
Preparação dos Dados: Compreendendo o Formato
Considere que seus dados estão organizados em uma tabela com N linhas e M colunas, onde as primeiras M-1 colunas representam as características (features) e a última coluna contém o valor alvo (target). Por exemplo:
% Supondo que os dados estão armazenados em dados.csv
dadosBrutos = readmatrix('dados.csv');
X = dadosBrutos(:, 1:end-1); % Características
Y = dadosBrutos(:, end); % Valor alvo
Atenção crucial: a normalização dos dados. Redes neurais são sensíveis à escala dos dados, e sem normalização, o risco de explosão de gradientes é elevado!
[X_treino, X_teste, Y_treino, Y_teste] = dividirConjuntos(X, Y, 0.8); % Implemente sua própria função de divisão ou use cvpartition
% Normalização (recomenda-se usar parâmetros do conjunto de treino para processar o conjunto de teste)
[~, mediaX, desvioX] = zscore(X_treino);
X_treino = (X_treino - mediaX) ./ desvioX;
X_teste = (X_teste - mediaX) ./ desvioX;
mediaY = mean(Y_treino);
desvioY = std(Y_treino);
Y_treino = (Y_treino - mediaY) / desvioY;
Construção do Modelo: Simplicidade é Chave
Vamos começar com uma rede neural totalmente conectada de três camadas. A função trainNetwork do MATLAB, embora menos flexível que frameworks como PyTorch, oferece conveniência e simplicidade.
camadas = [
camadaEntradaCaracteristicas(size(X_treino,2)) % Camada de entrada
camadaTotalmenteConectada(64) % Primeira camada com 64 neurônios
camadaReLU % Função de ativação ReLU
camadaTotalmenteConectada(32)
camadaReLU
camadaTotalmenteConectada(1) % Camada de saída
camadaRegressao % Específica para tarefas de regressão
];
opcoesTreino = trainingOptions('adam', ...
'MaxEpocas', 200, ...
'TamanhoLoteMinibatch', 32, ...
'DadosValidacao', {X_teste, Y_teste}, ...
'Graficos', 'progresso-treinamento');
Pontos importantes:
- A
camadaEntradaCaracteristicasdeve especificar o número de características de entrada para evitar problemas de dimensão durante a execução; - A última camada deve ser uma
camadaRegressaopara tarefas de regressão (tarefas de classificação usam softmax); - O otimizador Adam é mais robusto a flutuações que o SGD, sendo ideal para iniciantes.
Treinamento e Predição: Executando o Processo
rede = trainNetwork(X_treino, Y_treino, camadas, opcoesTreino);
Y_predito = predict(rede, X_teste);
Y_predito = Y_predito * desvioY + mediaY; % Desnormalização
Y_teste = Y_teste * desvioY + mediaY;
Métricas de Avaliação: Além de R²
Aqui estão sete métricas essenciais para avaliação:
mae = mean(abs(Y_predito - Y_teste));
mse = mean((Y_predito - Y_teste).^2);
rmse = sqrt(mse);
ssr = sum((Y_predito - mean(Y_teste)).^2);
sst = sum((Y_teste - mean(Y_teste)).^2);
r2 = ssr / sst;
rpd = std(Y_teste) / rmse;
mape = mean(abs((Y_teste - Y_predito) ./ Y_teste)) * 100;
fprintf('MAE: %.3f\nMSE: %.3f\nR²: %.3f\nMAPE: %.2f%%\n', mae, mse, r2, mape);
Dicas de prevenção de problemas:
- O MAPE pode gerar erros quando há valores zero nos dados; nesse caso, considere o uso de sMAPE;
- Um RPD (Desvio Preditivo Relativo) > 2 indica um modelo confiável, enquanto valores < 1.4 sugerem necessidade de revisão.
Visualização: Uma Imagem Vale Mais que Mil Paalvras
figure;
dispersao(Y_teste, Y_predito);
hold on;
linhaReferencia = [min(Y_teste), max(Y_teste)];
linhaReferencia2 = [min(Y_teste), max(Y_teste)];
plot(linhaReferencia, linhaReferencia2, 'r--');
xlabel('Valores Reais');
ylabel('Valores Preditos');
title('Dispersão: Preditos vs Reais');
figure;
plot(Y_teste - Y_predito, 'bo');
linhaZero = refline(0,0);
linhaZero.Color = 'r';
title('Distribuição dos Resíduos');
Considerações Finais
Após o treinamento do modelo, não feche o MATLAB sem salvar a rede e os parâmetros de normalização:
salvar('modelo_regressao.mat', 'rede', 'mediaX', 'desvioX', 'mediaY', 'desvioY');
Para uso futuro, carregue o modelo e aplique a mesma normalização aos novos dados para realizar predições. Embora o processo possa parecer detalhado, essa é a abordagem padrão para implantações industriais.
(Códigos testados e validados no MATLAB 2021b e versões superiores. Para grandes volumes de dados, aumente o TamanhoLoteMinibatch para evitar treinamentos excessivamente longos.)