Para entender o funcionamento das redes neurais mais complexa precisamos começar com o modelo mais simples. O Perceptron de Camada Única é um modelo de rede neural, proposto por (Rosenblatt 1958), onde sua estrutura é composta por apenas um neurônio artificial. Esta rede pode ser usada tanto para problemas de classificação quanto para problemas de regressão.
A Figura 1 apresenta a arquitetura do Perceptron de Camada Única. Nesta rede a camada de entrada recebe as \(M\) covariáveis, que são as entradas do único neurônio, já na camada de saida. As covariáveis são combinadas linearmente com os pesos sinápticos e o limiar de ativação. Essa combinação linear é o argumento de entrada da função de ativação, que retorna a saída do modelo, \(\hat{y}\).
Com essa arquitetura bem simples ainda é possível escrever uma equação que determina os valores previstos pela rede em termos dos valores da camada de entrada:
\[ \hat{y}_i \ = \ g \left( \ \sum\limits_{j=1}^{M} \ \hat{w}_j x_{i,j} \ + \ \hat{\Theta} \right) \]
Veremos no próximo tópico que a função de ativação \(g\) precisa ser diferenciável em todos os pontos do domínio. Sendo assim, entre as funções de ativação já apresentadas temos as possibilidades: logística e tanh.
A função de ativação logística é apresentada a seguir. Veja que a imagem desta função é o intervalo \([0,1]\), isso significa que ela retorna apenas valores entre 0 e 1.
\[ g(x) = \dfrac{1}{1 + e^{-x}} \quad \Rightarrow \quad g'(x) = \dfrac{e^{-x}}{(1 + e^{-x})^2} . \]
A função de ativação tangente hiperbólica é apresentada a seguir. Veja que a imagem desta função é o intervalo \([-1,1]\), isso significa que ela retorna apenas valores entre -1 e 1.
\[ g(x) = \tanh(x) = \dfrac{e^{2x} - 1}{e^{2x} + 1} \quad \Rightarrow \quad g'(x) = \dfrac{2e^{2x}(e^{2x} + 1) - 2e^{2x}(e^{2x} - 1)}{(e^{2x} + 1)^2} = \dfrac{4e^{2x}}{(e^{2x} + 1)^2} . \]
A \(Im(g)\) é sempre um subconjunto da reta, como por exemplo, \([0,1]\) para o caso da função logística e \([-1,1]\) para o caso da função tanh. Por esse motivo, quando o problema for de regressão, muitas vezes é preciso fazer uma transformação na variável resposta \(y\) de forma que os seus valores transformados estejam contidos na imagem da função de ativação da saúida da rede. Uma vez que a variável \(y\) foi transformada, a transformação inversa tem que ser feita para levar os valores de saída da rede de volta a sua escala original.
Vale ressaltar que no caso do modelo ser ajustado pela função
neuralnet
do R o parâmetro
linear.output = TRUE
indica que o neurônio de saída (no
caso deste exemplo, o único neurônio) terá como função de ativação a
função identidade. Com isso, a saída da rede, que está contida na imagem
da função de ativação, será toda a reta e não será necessário realizar
uma transformação na variável \(y\).
Porém é recoenda-se usar a transformação \[
\tilde{y}_i = \dfrac{y_i - \bar{y}}{sd(y)}
\] que faz com que \(y\) tenha
média zero e variância 1.
Porém, nada impede de usar linear.output = FALSE
para um
problema de regressão. Mas nesse caso é preciso realizar uma
transformação na variável resposta de forma que a sua imagem coincida
com a imagem da função de ativação escolhida. Por exemplo, para
linear.output = FALSE
e act.fct = "logistic"
a
variável resposta \(y\) pode ser
transformada por:
\[
\tilde{y}_i = \dfrac{y_i - \min(y)}{\max(y) - \min(y)}
\] e para linear.output = FALSE
e
act.fct = "tanh"
a variável resposta \(y\) pode ser transformada por: \[
\tilde{y}_i = 2\left(\dfrac{y_i - \min(y)}{\max(y) - \min(y)}\right) - 1
.
\]
Se a rede neural perceptron for usada para um problema de
classificação devemos escolher: linear.output = FALSE
e
act.fct = "logistic"
, pois a variável resposta assume
apenas os valores 0 e 1. Nesse caso, nenhuma transformação será
realizada na variável \(y\).
Suponha que queremos analisar o gasto com mercado das famílias de uma certa região e para isso foram coletadas informações de 2.000 famílias desta região. As informações coletadas, assim como algumas estatísticas sobre os valores referentes às 2.000 famílias, estão apresentadas na tabela a seguir.
Nome | Descrição | Média | Desvio Padrão | Mínimo | Máximo |
---|---|---|---|---|---|
\(Y\) | Gasto mensal familar com mercado. | 2168.49 | 1425.72 | 184.41 | 8200.59 |
\(X_1\) | Renda familiar mensal. | 4090.58 | 1434.57 | 1414.53 | 9535.4 |
\(X_2\) | Quantidade de integrantes na família. | 2.55 | 1.32 | 1 | 6 |
\(X_3\) | Região onde a família mora, interior ou litoral. | NA | NA | NA | NA |
Queremos definir um modelo de regressão capaz de prever o gasto mensal familiar com o mercado a partir do conhecimento das informações: renda familiar, quantidade de integrantes e onde a família mora, interior ou litoral. Isto é, queremos um modelo de regressão onde \(Y=\) gasto mensal familar com mercado é a variável de interesse e \(X_1=\) renda familiar mensal, \(X_2 =\) quantidade de integrantes na família e $X_3 = $ região do Brasil onde a família mora são as covariáveis.
Suponha que tenha sido ajustado um modelo de redes neurais Perceptron camada única com função de ativação logística. Para o ajuste do modelo foram considerados os dados padronizados. As covariáveis quantitativas foram padronizadas da seguinte foram:
\[ \tilde{X}_{i,j} = \dfrac{X_{i,j} - \bar{X}_j}{S_j} \]
sendo \(\bar{X}_j\) a média amostral da covariável \(j\) e \(S_j\) o desvio padrão amostral da covariável \(j\).
A variável de interesse \(Y\) foi padronizada seguindo outro critério, apresentado a seguir.
\[ \tilde{y}_i = \dfrac{y_i - \min\{y_i\}}{\max\{y_i\} - \min\{y_i\}} \]
sendo \(\min\{y_i\}\) e \(\max\{y_i\}\) o o valor mínimo e o valor máximo de \(Y\), respectivamente.
Baseado nesta rede neural criada, qual previsão sobre o gasto no mercado de uma família com 4 integrantes, que mora no litoral, com renda familiar igual a R$6.500,00?
x1 = (6500 - 4090.58)/1434.57
x2 = (4 - 2.55)/(1.32)
x3 = 1
novo_dado = matrix(c(x1,x2,x3),nrow = 1)
colnames(novo_dado) = c("X1_","X2_","X3litoral")
y = predict(rn1,newdata = novo_dado) #resultado na unidade transformada
y = y*(max(Y)-min(Y)) + min(Y)
y
[,1]
[1,] 4302.025
De acordo com o modelo, uma família que ganha R$ 6.500,00, com 4 integrantes e que mora no litoral ganha em média R$ 4302.03.
E qual seria a previsão para a segunda família deste exemplo, com 2 integrantes, do interior e com renda familiar R$ 3.100,00?
x1 = (3100 - 4090.58)/1434.57
x2 = (2 - 2.55)/(1.32)
x3 = 0
novo_dado = matrix(c(x1,x2,x3),nrow = 1)
colnames(novo_dado) = c("X1_","X2_","X3litoral")
y = predict(rn1,newdata = novo_dado) #resultado na unidade transformada
y = y*(max(Y)-min(Y)) + min(Y)
y
[,1]
[1,] 1283.065
De acordo com o modelo, uma família que ganha R$ 3.100,00, com 2 integrantes e que mora no interior ganha em média R$ 1283.06.
Vamos manter o mesmo problema sobre o gasto das famílias com mercado. A diferença é que agora queremos classificar cada família entre as que gastam mais mais da metade da sua renda com mercado e as que não gastam. Para isso vamos criar uma nova variável, \(Z\), que é uma variável indicadora.
\[ Z_i = \left\{ \begin{array}{ll} 1 & \text{, se a família } i \text{ gastou mais da metade da renda familiar no mercado;}\\ 0 & \text{, caso contrário.}\\ \end{array} \right. \]
Foi criada uma rede neural Perceptron de camada única com função de ativação logística. As covariáveis quantitativas passaram pela mesma padronização descrita acima. A rede está apresentada na Figura 6.
A escolha err.fct = "ce"
indica que queremos usar como
medida de erro a entropia cruzada. A outra alternativa, que é o padrão
caso essa característica não seja informada, é o “sse”, que é adequada
para problema de regressão e não de classificação.
De acordo com esta rede, o que podemos esperar sobre a família com 4 integrantes, que mora no litoral, com renda familiar igual a R 6.500,00, ela deve gastar mais da metade da sua renda com mercado ou não?
x1 = (6500 - 4090.58)/1434.57
x2 = (4 - 2.55)/(1.32)
x3 = 1
novo_dado = matrix(c(x1,x2,x3),nrow = 1)
colnames(novo_dado) = c("X1_","X2_","X3litoral")
y = predict(rn2,newdata = novo_dado)
y
[,1]
[1,] 0.8606864
O valor retornado pelo classificador é um número entre 0 e 1. Este número não é a probabilidade da família gastar mais da metade da renda com mercado, mas quanto mais perto de 1 mais a gente acredito que esse perfil de família gasta mais da metade da renda com o merdado. O valor que o modelo retornou foi {r z}, o que nos indica que essa famíliadeve sim gastar mais da metade da sua renda com mercado.
E para outra família, com 2 integrantes, que mora no interior, com renda familiar igual a R$ 3.100,00? O que o modelo indica, esta família gasta mais da metade da sua renda com mercado ou não?
x1 = (3100 - 4090.58)/1434.57
x2 = (2 - 2.55)/(1.32)
x3 = 0
novo_dado = matrix(c(x1,x2,x3),nrow = 1)
colnames(novo_dado) = c("X1_","X2_","X3litoral")
y = predict(rn2,newdata = novo_dado)
y
[,1]
[1,] 0.2548511
Nesse caso o valor retornado pelo modelo já é mais perto de zero, sugerindo que esta família não gasta mais da metade da sua renda com mercado.