Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como prever dados do futuro utilizando SVR?

Por se tratar de uma série temporal acredito que o principal objetivo da regressão é prever o futuro. Dessa forma, segmentei os dados guardando o ano de 1960 como o ano que eu gostaria de prever. No entanto, mesmo testando inúmero valores para o parametro 'C' não foi possível realizar a previsão.

In:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.metrics import r2_score

passageiros = pd.read_csv('https://raw.githubusercontent.com/alura-cursos/curso_scikitlearn/aula1/Passageiros.csv')

# segmentando dados em grupo para gerar e validar modelo (passado - [1949,1958]) e grupo para prever (futuro - 1960)
passageiros['tempo_int'] = passageiros['tempo'].astype(int)
passageiros_passado = passageiros.query('tempo_int != 1960').drop(columns = ['tempo_int'])
passageiros_futuro = passageiros.query('tempo_int == 1960').drop(columns = ['tempo_int'])

X_train, X_test, y_train, y_test = train_test_split(passageiros_passado['tempo'], passageiros_passado['nPassageiros'], test_size = 0.3, random_state = 101)

regressor_SVR = SVR(C = 1000000)
regressor_SVR.fit(np.array(X_train).reshape(-1, 1), y_train)

predict_SVR = regressor_SVR.predict(np.array(X_test).reshape(-1, 1))
r2_score_test = r2_score(y_test, predict_SVR)

predict_SVR_1960 = regressor_SVR.predict(np.array(passageiros_futuro['tempo']).reshape(-1, 1))
r2_score_1960 = r2_score(passageiros_futuro['nPassageiros'], predict_SVR_1960)

print('r2_score - SVR - grupo teste: {} \nr2_score - SVR - prevendo 1960: {}'.format(r2_score_test, r2_score_1960))

Out:

r2_score - SVR - grupo teste: 0.9220558213102139

r2_score - SVR - prevendo 1960: -920.4623786307144

É possível prever dados futuros com SVR? Esse r2_score negativo seria fruto de um overfiting?

1 resposta
solução!

Oi Abraão,

É bem legal que você esteja fazendo testes com código. Sim essa base de dados é comumente utilizada em problemas onde tentamos prever o futuro. Mas no curso eu também quis mostrar a possibilidade de calcular valores intermediários. Na verdade quando trabalhamos com um problema de regressão estamos tentando determinar os coeficientes do modelo que explicam aquele fenômeno. E tanto o problema de determinar os valores intermediários quanto os futuros existe. Para o código do curso eu foquei bastante nos valores intermediários. E a avaliação foi baseada somente em inspeção visual.

Determinar valores os valores futuros é bem mais difícil. Com este foco em determinar os valores futuros eu mudaria um detalhe no seu teste. Não é necessário fazer o train_test_split da forma que você fez. Eu simplesmente pegaria os valores do passado como dados de treino e os valores do futuro como sendo os valores de teste.

Neste caso o C muito alto realmente deu problemas. Com o C muito alto o ajuste foi ruim tanto para o treino quanto para o teste. Eu fiz um teste rápido e para prever os valores futuros obtive melhores resultados com um C em torno de 500. Mesmo assim o R2_score saiu como -0.5737060792550521. Um R2_score negativo mostra que os resultados não representam bem os dados. Algo legal de fazer é testar vários valores de C e também plotar o gráfico do resultados. E ver como os resultados evoluem conforme aumenta o C.

É possível fazer previsões como estas com o SVR: Exemplo com C=100 no SVR. Exemplo C=100

, mas eu acho que não seja o melhor método para este conjunto de dados. Para este conjunto de dados conseguimos obter melhores resultados com técnicas como regressão polinomial e ARIMA.