Ou: entendendo o modelo de regressão mais simples.
Quando falamos de modelos de regressão em ciência de dados, estamos falando de um modelo matemática que busca apreender um padrão de comportamento dos dados para poder prever com a maior acurácia possível os dados faltantes. Os vários modelos possíveis existem para dar conta do maior número possível de possibilidades entre os tipos de dados. Dentre esses modelos, o de regressão linear é o mais simples e de uso muito fácil, uma vez que praticamente qualquer sistema capaz de trabalhar com dados como o Excel tem alguma ferramenta para uma regressão linear. Mas mais importante do que saber usar a ferramenta que faz a regressão é entender o que está ocorrendo por trás dos panos.
A regressão linear é um processo que busca encontrar uma linha simples que agrupa da melhor forma possível a maior quantidade possível dos dados apresentados. O algoritmo como um todo busca encontrar essa linha a partir dos dois parâmetros que determinam uma linha em um plano bidimensional: a inclinação e o intercepto (importante: o raciocínio que se segue se aplica perfeitamente para planos com mais dimensões, mas por questão de facilidade vamos nos concentrar em um plano bidimensional, como o da imagem acima). Se lembrarmos das aulas do ensino médio, nos lembraremos que uma reta pode ser escrita como uma equação do tipo y = a*x + b, sendo a o valor da inclinação da reta e b o valor do intercepto.
Para melhor entender esses dois parâmetros, vamos visualizá-los através desses gráficos:
Nesse gráfico podemos ver três retas que possuem o mesmo valor de intercepto mas valores distintos para a inclinação (ou seja, valores distintos para o parâmetro a). A reta azul é dada pela equação y = x, a verde é dada por y = 0.5 * x e a vermelha por y = 0.3 * x. Repare como todas as três possuem intercepto igual a 0. Ou seja, todas passam no ponto (0, 0). Agora, para visualizamos os diferentes valores para o intercepto, vamos ver esse gráfico:
Nesse caso, todas as inclinações são iguais e valem 0.5, enquanto os interceptos (ou o parâmetro b) tem valores de 0, 10 e 20 para as retas azul, verde e vermelha, respectivamente.
Ou seja, juntando esses dois parâmetros podemos dizer a inclinação da reta e o ponto onde ela corta o eixo y. E com isso podemos descrever qualquer reta no plano bidimensional (relambrando que, para planos de mais dimensões, o raciocínio é o mesmo, mas com alguns parâmetros a mais). E agora que entendemos o que é uma reta, matematicamente falando, podemos entender um melhor como funciona uma regressão linear.
Passo 1: gerando uma reta aleatória
Para começar uma regressão linear, o primeiro passo é gerar uma reta com parâmetros aleatórios. Essa reta certamente não será uma boa aproximação dos dados que queremos/precisamos, mas é necessário começar por algum lugar. Após esse primeiro chute totalmente aleatório, o algoritmo analisa seus erros para propor novas retas. Esses erros são calculados segundo algumas métricas como o erro médio quadrado ou erro médio absoluto. Essas duas métricas partem da mesma ideia: a distância entre um ponto real e um ponto predito. Aqui temos um exemplo:
Repare como o ponto vermelho é o valor calculado (ou predito, ou esperado) de y para o valor de x dado. Ou seja, a máquina acredita que para um x = 5.5, aproximadamente, o valor de y deve ser -2.3, também aproximadamente. Esse valor seria encontrado se os dados fossem uma reta perfeita, o que não é o caso. No nosso caso, para o valor de x = 5.5, o valor de y é -1. Essa diferença de 1.3 é o erro absoluto para este ponto, exlcusivamente. Cabe então ao algoritmo calcular o erro para todos os pontos (o que é algo bem rápido de ser feito) e encontrar os valores dos erros médios absoluto e quadrático.
Passo 2: melhorando a aproximação
Como a primeira reta escolhida foi determinada sem nenhum critério, é natural que o erro calculado aqui seja bastante alto. Basta então que o algoritmo analise esse erro e entenda qual dos parâmetros será necessário alterar para melhorar o resultado. Isso feito, uma nova reta é gerada, agora como novos valores que não são mais aleatórios, mas sim definidos pelo erro calculado do primeiro modelo. Agora o processo se repete, calculando as taxas de erro em cada nova reta gerada e usando isso como base para gerar um novo par de parâmetros. O processo final se parece com isso:
Passo 3: o resultado final
Podemos ver que esse processo é interativo. Ou seja, ele se repete várias vezes, usando o resultado de uma interação para gerar uma nova. Mas quando saber quando acabou? Bom, para isso temos duas possibilidades: número limite de interações ou erro pequeno o bastante. No primeiro caso, podemos estipular um tempo máximo para nosso algoritmo rodar. Quanto maior esse tempo, maior a precisão do resultado final, mas também maior o custo computacional. No segundo caso, o algoritmo pode encerrar ao chegar em um ponto onde novas iterações geram pouco ou nenhum ganho em termos de precisão. Nesse caso, o algoritmo se dá por satisfeito e encerra o processo. Em ambos os casos, o resultado final gerado possui alguns valores a serem analisados: o valor dos parâmetros a e b e os erros encontrados. Vamos ver um exemplo:
def gera_dados_com_erro():
dados = []
quantidade_de_dados = 100
inclinacao = 0.5
intercepto = 10
for numero in range(quantidade_de_dados):
ponto = []
y = inclinacao * numero + intercepto
y += random.randint(-5, 5)
ponto.append(numero)
ponto.append(y)
dados.append(ponto)
dados = pd.DataFrame(dados, columns = ['x', 'y'])
dados.reset_index(inplace = True, drop = True)
return dados
Esta função gera uma quantidade de 100 dados segundo a função linear y = 0.5 * x + 10. Mas, além dessa função, podemos ver dentro do laço de repetição uma linha que acrescenta um valor inteiro aleatório entre -5 e 5, ambos inclusos. Esse valor serve para que nossos dados não sejam uma linha perfeita, mas tenha um pequeno erro associado a cada valor. Dessa forma, o gráfico da função gerada ficou sendo:
Ao rodar uma regressão linear simples (que será demonstrada como fazer em detalhes em posts futuros), o resultado foi:
Nesse gráfico podemos ver os dados originais (como pontos azuis) e a regressão linear feita como uma linha constante vermelha. Veja como ela busca se centralizar em relação aos dados oferecidos. Com isso podemos encontrar os valores calculados tanto para a inclinação da reta quanto para o intercepto. Lembrando que os valores esperados eram de 0.5 para a inclinação e 10 para o intercepto. Já os calculados ficaram como 0.49 para a inclinação e 10.34 para o intercepto. Esses valores, apesar de distintos dos valores corretos, estão próximos o bastante para serem considerados uma boa aproximação. Além disso, os erros médio quadrado e absoluto quadrado foram de 10.68 e 2.92, respectivamente. Esses valores para erros também merecem um olhar mais detalhado em posts futuros. Mas podemos ver que possuímos valores bem pequenos, o que mostra que nossa aproximação é boa o bastante. E claro, quanto menor for o fator de erro incluído nos dados, menor será o erro. Por exemplo, para um fator de aleatoridade indo de -1 a 1, nossos erros serão de 0.67 e 0.72.
Conclusão:
Apesar de simples, a regressão linear possui aplicações em diversas áreas além de usos diversos. Sua matemática é simples, mas seu uso pode ser tão robusto quanto se precisa. Dominar esse primeiro modelo, suas especificidades e seus detalhes é um importante passo para compreender melhor modelos mais complexos e regressões de múltiplas variáveis, além de redes neurais e outros temas mais complexos.
Como sempre, o código usado para gerar os dados aqui mostrados estão disponíveis no meu GitHub para acesso público irrestrito. Estude-o e, caso encontra alguma possível melhoria para o sistema, não hesite em fazer essas melhorias. Nos vamos semana que vem!
Comments