A Teoria por Trás dos Códigos — Problemas de Regressão

Pandas Couple
11 min readApr 26, 2021

--

A bolsa de valores é um ambiente de negociação, ou um mercado no qual empresas de capital aberto listam seus ativos e investidores podem comprar ou vender tais ativos entre eles. Além de ter a função de oferecer um ambiente único e seguro que garanta a liquidação das negociações, é responsável também pela guarda dos ativos.

O mercado de ações é um ambiente onde são negociados ativos financeiros, tais como ações, opções de ações, contratos futuros e Fundos de Investimento Imobiliário.

Mais recentemente nesse mercado, surgiram as criptomoedas. Mais especificamente o Bitcoin surgiu em 2008 como uma resposta à crise financeira, com a ideia de substituir o dinheiro físico que usamos e, principalmente, tirar a necessidade de intermediação dos bancos nas operações financeiras.

Genericamente, uma criptomoeda é um tipo de dinheiro — como outras moedas com as quais convivemos cotidianamente — com a diferença de ser totalmente digital. Além disso, ela não emitida por nenhum governo (como é o caso do real ou do dólar, por exemplo).

Neste trabalho, vamos utilizar um modelo de Machine Learning (regressão linear), para prever os preços do bitcoin e assim conseguir auxiliar os profissionais dessa área. Lembrando que, este modelo de trabalho, pode se expandir para previsão de qualquer ação da bolsa de valores que contenha dados históricos que possa alimentar o modelo.

Aquisição dos Dados

Os dados deste trabalho, foram adquiridos pelo Yahoo Finance. Lá é possível extrair todo o conjunto de dados históricos de uma determinada ação.

Visto tudo isso, o objetivo principal do trabalho é: Previsão dos preços do bitcoin fazendo uma explanação geral da teoria por trás da regressão linear.

Análise Exploratória dos Dados

Nesta etapa do trabalho, o objetivo principal é fazer uma análise completa de toda a informação que conseguirmos extrair do conjunto de dados em questão.

Após ter as informações que precisamos, vamos partir para uma outra etapa que é a de limpeza e tratamento dos dados.

Nesta primeira análise vamos executar as seguintes tarefas:

  • Verificar as primeiras entradas para termos uma visão geral do dataframe;
  • Verificar o tipo das variáveis e os valores ausentes;
  • Ver a porcentagem de valores ausentes;
  • Verificar o resumo estatístico do dataframe;
  • Plotar um gráfico de linhas para verificar a tendência dos valores do bitcoin;
  • Plotar um gráfico candlestick;
  • Analisar a correlação entre as variáveis.

Nessa primeira análise das entradas do dataset, podemos já entender com quais variáveis vamos trabalhar que são: Data, Open, High, Low, Close, Adjclose e volume. Podemos ver também como as entradas foram alimentadas (se são strings ou numéricas, por exemplo).

Entendendo o que cada variável representa:

  • Data: dia, mês e ano que ocorreram as respectivas cotações;
  • Open: Valor de abertura do bitcoin naquela data;
  • High: Valor mais alto que o bitcoin atingiu naquela data;
  • Low: Menor valor que o bitcoin atingiu naquela data;
  • Close: Valor em que o bitcoin fechou naquela data;
  • Adj Close: Valor de fechamento na data, após ser contabilizado as ações corporativas;
  • Volume: Quantidade de bitcoins negociados na data.

Nessa segunda análise, conseguimos perceber que todas as variáveis estão como float (o que era esperado, visto que todas as entradas que vimos acima são valores numéricos), exceto a variável “Date”, que está como object, na etapa de limpeza vamos alterar essa variável.

Esse dataset tem um total de 2411 entradas.

Conseguimos perceber acima que esse dataset apresenta uma pequena porcentagem de valores ausentes nas variáveis numéricas. Corrigiremos isso na etapa de preparação dos dados.

Nessa análise estatística acima, podemos perceber que os valores do bitcoin subiram muito rapidamente, pois, até o 2° quartil, o valor era de aproximadamente US 4000,00 e no 3° quartil ele já alcança o valor de aproximadamente US 9000,00 sendo que o valor máximo está em aproximadamente US 63000,00.

A média dos valores é também superior a todos os valores até o 2° quartil. Vamos plotar um gráfico para visualizar melhor essas informações.

Conforme discutimos acima, o bitcoin realmente sofreu um crescimento exponencial aproximadamente a partir do dia 2000.

Acima fizemos um gráfico do tipo ‘candlestick’, muito comum nessa área de mercado financeiro, que interativamente mostra os valores do bitcoin em determinada data, apenas colocando o cursor do mouse onde você quer analisar.

Podemos ver pelo gráfico de correlação acima, que as variáveis tem muita relação entre si, o que será bastante útil para alimentar o nosso modelo de machine learning.

Preparação dos Dados

Nesta etapa, costumamos realizar diversas tarefas para adequar o dataset que geralmente vem bastante desordenado. No caso desse dataset especificamente, vamos precisar tratar a variável “Data” informando como queremos que ela fique e também excluir alguns valores ausentes nas nossas variáveis conforme vimos na análise exploratória.

Como podemos ver, trocamos a variável “Date” de “object” para “datetime”, assim o pandas consegue reconhecê-la.

Como podemos ver, agora nosso dataset não possui nenhum valor ausente em suas colunas. Fizemos uma substituição dos valores ausentes pela mediana dos valores do dataset, o que não deve alterar em nada nosso resultado final.

Modelo de Machine Learning

Nesta etapa, vamos criar o nosso modelo para fazer previsões. Neste caso será utilizado o modelo de regressão linear múltipla.

Iremos utilizar a regressão linear para esse problema, pois, em primeiro lugar, se trata de um problema de aprendizagem supervisionada, já que, recebemos um conjunto de dados e sabemos como deve ser o output correto, tendo a ideia de que existe uma relação entre o input e o output. Em segundo lugar, vamos tentar prever os resultados em uma saída contínua, o que significa que estamos tentando mapear as variáveis de entrada para alguma função contínua.

Representação do modelo

  • X: Variáveis de entrada / Recursos de entrada;
  • y: “produto” / variável de destino que estamos tentando prever;
  • (X, y): Par de exemplos de treinamento;
  • m: Tamanho do conjunto de treinamento;
  • h: Função de hipótese que estamos tentando aprender, de forma que ‘h’ seja um bom preditor para o valor correspondente de ‘y’;
  • Usaremos ‘X’ para denotar o espaço dos valores de entrada e ‘y’ os de saída.

A forma multivariável da função de hipótese acomodando vários recursos é:

Vamos agora entender como essa equação se posiciona em um plano (X, y).

https://developers.google.com/machine-learning/crash-course

Nesse primeiro plano, estamos apenas plotando nossos pontos que representam os dados do nosso dataset. Em termos visuais, nosso conjunto de dados de treinamento está espalhando no plano XY.

https://developers.google.com/machine-learning/crash-course

Nesse segundo plano, plotamos também a nossa reta (h). Estamos tentando fazer uma reta (definida por h(x)) que passa por estes pontos de dispersão. Nosso objetivo é obter a reta que melhor representa o conjunto de dados.

A melhor reta possível, será tal que as distâncias verticais quadradas médias dos pontos espalhados da reta serão as menores. Segue imagem abaixo mostrando como isso funciona no plano. Os pontos dos dados plotados do gráfico a direita, tem distâncias verticais com relação a reta (h) menores do que os pontos dos dados do gráfico plotados a esquerda, ou seja, a reta do gráfico à direita representa melhor os dados que a reta do gráfico à esquerda.

https://developers.google.com/machine-learning/crash-course

Conforme sabemos, queremos descobrir a melhor equação da reta possível. Nessa equação da reta, temos os valores de ‘X’ conhecidos, pois, eles são as features (colunas) do dataset em estudo. O desafio será encontrar os valores dos coeficientes ‘theta’, que seriam a inclinação da nossa reta, para que a mesma chegue na melhor inclinação possível que se adeque aos dados. Vamos nos tópicos abaixo aprender como chegar nos melhores valores de ‘theta’ possíveis.

Função de custo

Podemos medir a precisão da nossa função de hipótese usando uma função de custo. Isso leva a uma diferença média de todos os resultados da hipótese com entradas de ‘X’ e a saída real de ‘y’. Segue a função de custo:

Essa função é também chamada de “função do erro quadrático médio” (MSE).

A média é dividida pela metade como uma conveniência para o cálculo da descida do gradient descent (falaremos sobre isso no próximo tópico), já que o termo derivado da função quadrada cancelará o 1/2.

Vamos definir nossa ideia geral: Escolher os valores de ‘theta’ para ter um h(x) o mais próximo possível de ‘y’, para nossos exemplos de treino (X, y) e assim minimizar a função J(theta).

Gradient Descent

Temos, então, nossa função de hipótese — h(x) e temos uma maneira de medir o quão bem ela se encaixa nos dados pela função de custo — J(theta).

Agora precisamos estimar os parâmetros na função de hipótese, e, é ai que entra o gradient descent.

Saberemos que tivemos sucesso quando nossa função de custo obter seu valor mínimo. A maneira como fazemos isso é tomando a derivada da nossa função de custo.

O algoritmo do gradient descent é:

Esse algoritmo já está com a derivada da função de custo deduzida, portanto, basta utilizá-lo para repetir até a convergência (onde a nossa função de custo é mínima). No gráfico representado abaixo, o ponto azul é o custo mínimo que queremos chegar e os pontos em vermelho são o algoritmo do gradient descent trabalhando (repetindo) até chegar a convergência. O tamanho do “passo” desses pontos vermelhos é determinado pelo learning rate (alfa).

https://developers.google.com/machine-learning/crash-course

Devemos ajustar nosso parâmetro ‘alfa’ para garantir que o algoritmo do gradient descent converge para o mínimo em um tempo razoável. A falta de convergência ou muito tempo para obter o valor mínimo implica que o tamanho do nosso passo (learning rate — alfa) está errado.

https://developers.google.com/machine-learning/crash-course

Lerning rate(alfa) muito pequeno — muito tempo para obter o valor mínimo.

https://developers.google.com/machine-learning/crash-course

Learning rate(alfa) muito grande — Não converge para o valor mínimo.

A intuição por trás da convergência é que a derivada aproxima-se de zero a medida que nos aproximamos da parte inferior da nossa função convexa. No ponto mínimo, a derivada será sempre zero.

O ponto de tudo isso é que se começarmos com um palpite para nossa hipótese e, em seguida, aplicarmos repetidamente essas equações de gradient descent, nossa hipótese se tornará cada vez mais precisa.

Vamos agora, montar o nosso modelo no python para vermos na prática toda essa teoria. Na prática com os avanços das linguagens computacionais, muitas vezes não conseguimos visualizar essa teoria funcionando, pois, as linguagens e as bibliotecas existentes conseguem já automatizar muita coisa, mas eu ressalto que aprender essa parte teórica te dará muito mais destreza para resolver problemas com o machine learning.

Antes de começarmos a criar nosso modelo, vou excluir a variável ‘Date’, pois ela nada influencia no nossos dados, como vimos na matriz de correlação.

Observe que, ao treinarmos o modelo, conseguimos descobrir todos os melhores valores possíveis para theta0, theta1, theta2, theta3, theta4 e theta5, ou seja, chegamos na equação da reta ideal para esse dataset.

Com o modelo treinado, ele já está pronto para fazer previsões em cima de novos dados.

Observe que nosso modelo previu exatamente igual aos valores reais, ou seja, atingiu uma acurácia de 100%. Em seguida, faremos a avaliação desse resultado.

Avaliando o modelo

Um modelo de machine learning, deve ser quantificável, seja em termos de desempenho ou precisão.

No caso de modelos de regressão, vamos testar o desempenho do modelo em cima do nosso conjunto de testes usando as métricas abaixo:

  • R-squared: calcula a acurácia do modelo, quantificando a qualidade entre 0 e 1 (0 pior desempenho; 1 melhor desempenho).
  • Mean Absolut Error (MAE): É a média absoluta do erro, representada pela média das somas dos erros individuais (distâncias entre os pontos dos dados reais e a nossa reta (h) de previsão).
  • Mean Squared Error (MSE): É a média dos quadrados dos erros, tende a penalizar exponencialmente os erros, tratando de forma diferente os erros grandes dos erros pequenos.

Conforme vimos acima, quando nosso modelo previu exatamente os mesmos valores em comparação com os valores reais, ou seja uma acurácia de 100%. Provamos isso agora quando o R-squared deu o valor de 1,0 (valor máximo).

Conclusão

Na prática, atingir uma acurácia de 100% nem sempre é uma coisa boa e realista. Pode ser que o nosso modelo esteja sofrendo um sobre ajuste, ou seja, ele não está generalizando. Isso significa que, quando o modelo for exposto a novos dados, ele não conseguirá atingir o mesmo desempenho de 100% que foi verificado nos tópicos anteriores deste trabalho, por exemplo.

Conseguimos corrigir esse sobre ajuste utilizando técnicas como o cross-validation, porém isso será um assunto para um próximo trabalho, visto que, o objetivo desse é apenas mostrar todo o funcionamento do modelo de regressão linear, para que o leitor fique por dentro de toda a teoria que está por trás da programação e não fique apenas digitando linhas de código sem entender realmente a essência.

Espero ter conseguido ajudar a clarear o conhecimento por trás dos modelos de regressão. Em um próximo trabalho, vamos fazer uma explanação geral nos modelos de classificação. Vou deixar alguns links de trabalhos de classificação já feitos por mim anteriormente para quem estiver interessado em ir começando a entender ou aprofundar no assunto.

Fique a vontade para comentar, tirar alguma dúvida ou passar um feedback. Se você gostou nos siga aqui no blog que iremos continuar com essa série de trabalhos explicativos.

Obrigado!

Trabalhos de classificação:

--

--

Pandas Couple
Pandas Couple

Written by Pandas Couple

Casal de Cientistas de Dados, contribuindo para a comunidade de Data Science.

No responses yet