1
resposta

Problema com a previsão do modelo SVR

Ao realizar o ajuste SVR para os dados, o parâmetro C de ajuste é para melhorar o 'encaixe' dos resultados. Contudo eu aumento o valor de C (10, 100, 100000) e o resultado que obtenho continua sendo uma reta y = k cujo valor k vai diminuindo conforme aumenta C

regressor_svr = SVR(C=100)
regressor_svr.fit(xtrain, ytrain)
y_pred_svr = regressor_svr.predict(ytest)
regressor_1['y_pred_svr_1000'] = y_pred_svr

sns.set(style='darkgrid')
ax = sns.lineplot(x='tempo', y = 'y_pred', data = regressor_1, marker = 'o')
ax = sns.lineplot(x='tempo', y = 'y_true', data = regressor_1, marker = 'o')
ax = sns.lineplot(x='tempo', y = 'y_pred_svr_1000', data = regressor_1, marker = 'x')
ax.figure.set_size_inches(10,8)

regressor_1 é o df que eu uso para guardar os resultados das regressoes:

regressor_1.columns

Index(['tempo', 'y_pred_1', 'y_true', 'y_pred_svr', 'y_pred_svr_C1000'], dtype='object')
1 resposta

Oi Felipe,

Esses dados em que você está aplicando o SVR são os dados desse curso? Se forem eu rodei aqui o código completo do curso e funcionou normalmente. Então nos seus testes algum parâmetro pode ter ficado fixado e estar atrapalhando o funcionamento da SVR.

Caso sejam outros dados: O C é um parâmetro de regularização. Esse tipo de parâmetro não é fácil de escolher. Nos dados do curso não havia ruído e aumentando o C nós estávamos lidando menos com a possibilidade de ruído. Esse é o motivo da estimativa ter melhorado. Por outro lado se os seus dados tiverem ruído aí você vai precisar diminuir o valor de C para controlar o ruído. Nesse caso você deve ir diminuindo o C de 1 até 0. Teste um valor como 0.1, por exemplo.

Para escolher o C você pode criar um loop. Nesse caso você vai calcular o score obtido com diferentes valores de C. Exemplo:

guarda_resultado = []
guarda_c = []
c=1

while c < 10:

  regressor_svr = SVR( C=c)
  regressor_svr.fit(Tempo_treino,nPassageiros_treino)
  guarda_resultado.append(regressor_svr.score(Tempo_treino,nPassageiros_treino))
  guarda_c.append(c)
  c = c + 1

Depois basta plotar o resultado:

sns.lineplot(x=guarda_c,y=guarda_resultado)

O score retorna o coeficiente de determinação. Queremos o valor dele próximo de 1.