Como escolher entre o RMSE e o RMSLE?

Existem inúmeros artigos descrevendo o RMSE e o RMSLE, mas aqui eu vou tentar ser o mais direto possível em relação ao que eu faço entre essas duas métricas.

Quando eu quero apenas ter a medida do erro em termos de viés e variância do modelo, sem considerar nenhum aspecto em relação às diferenças de magnitudes entre o que foi previsto (y_hat) e o que era o esperado na base de validação (y), eu uso o RMSE.

Exemplo: Uma previsão errada de {y=1, y_hat=2} vai entrar na média quadrática da mesma forma que {y=1000000, y_hat=1000500}; isso significa que a magnitude da segunda previsão não importa e que eu aceito que ela vai influenciar na média quadrática (no caso uma magnitude de 500x maior do que o primeiro erro).

Quando eu quero a mensuração do viés e da variância mas eu não quero penalizar erros que ocorram em magnitudes distintas, aí eu uso o RMSLE. Isto é, os erros são isolados dentro da mesma ordem de magnitude entre y_hat e y.

Usando o exemplo anterior, no caso de erro de {y=1000000, y_hat=1000500} o termo logaritmo do RMSLE vai realizar o ajuste entre y_hat e y e calcular a diferença dentro da mesma magnitude antes do cálculo da média quadrática. Isso significa que, mesmo com uma ordem de magnitude muito maior do que nos erros anteriores, o logaritmo fará a suavização desses erros desses “grandes números” retirando a magnitude na media quadrática.

Como de costume, o código está abaixo:

import pandas as pd
import math
import numpy as np
# Create dataframe
df_preds = pd.DataFrame(columns=['y', 'y_hat'])
# Fill it
df_preds.loc[len(df_preds)] = [1, 1]
df_preds.loc[len(df_preds)] = [2, 3]
df_preds.loc[len(df_preds)] = [50, 55]
df_preds.loc[len(df_preds)] = [500, 502]
df_preds.loc[len(df_preds)] = [1000000, 1000005]
# Check
df_preds
# y y_hat
# 0 1 1
# 1 2 3
# 2 50 55
# 3 500 502
# 4 1000000 1000005
# Create functions
def rmse(predictions, targets):
'''Source: https://stackoverflow.com/questions/17197492/is-there-a-library-function-for-root-mean-square-error-rmse-in-python'''
return np.sqrt(((predictions – targets) ** 2).mean())
def rmsle(predict, target):
'''Source: https://towardsdatascience.com/metrics-and-python-850b60710e0c'''
total = 0
for k in range(len(predict)):
LPred= np.log1p(predict[k]+1)
LTarg = np.log1p(target[k] + 1)
if not (math.isnan(LPred)) and not (math.isnan(LTarg)):
total = total + ((LPred-LTarg) **2)
total = total / len(predict)
return np.sqrt(total)
# Check data before executiion
df_preds
# y y_hat
# 0 1 1
# 1 2 3
# 2 50 55
# 3 500 502
# 4 1000000 1000005
# Get stats
print ('RMSE: ' + str(rmse(df_preds['y_hat'].values, df_preds['y'].values)))
print ('RMSLE: ' + str(rmsle(df_preds['y_hat'].values, df_preds['y'].values)))
# RMSE: 3.3166247903554
# RMSLE: 0.1079235658917167
# Increase the error in the biggest number in terms of magnitude (from 5 to 500)
# Create dataframe
df_preds = pd.DataFrame(columns=['y', 'y_hat'])
# Fill it
df_preds.loc[len(df_preds)] = [1, 1]
df_preds.loc[len(df_preds)] = [2, 3]
df_preds.loc[len(df_preds)] = [50, 55]
df_preds.loc[len(df_preds)] = [500, 502]
df_preds.loc[len(df_preds)] = [1000000, 1000500]
# Check
df_preds
# y y_hat
# 0 1 1
# 1 2 3
# 2 50 55
# 3 500 502
# 4 1000000 1000500
# The RMSE exploded, but the RMSLE stayed the same due to not penalize the error in bigger magnitude predictions
print ('RMSE: ' + str(rmse(df_preds['y_hat'].values, df_preds['y'].values)))
print ('RMSLE: ' + str(rmsle(df_preds['y_hat'].values, df_preds['y'].values)))
# RMSE: 223.6202137553759
# RMSLE: 0.10792379739703087
Como escolher entre o RMSE e o RMSLE?

Tenha certeza que suas métricas não estão matando o seu negócio

Measuring programming progress by lines of code is like measuring aircraft building progress by weight. —Bill Gates   

Com essa afirmação do Bill Bates que começa esse importante artigo sobre a construção, avaliação e implementação de métricas; mas especificamente no ambiente de Business Intelligence; mas que também serve como recado para a Mineração de Dados.

É mais do que conhecido que o excesso de métricas, ou mesmo a sua construção de forma deliberada pode conduzir a decisões sem fundamentação; que consequentemente pode acarretar em prejuízos financeiros.

Atualmente estou em uma rotina de estudos sobre a aplicação de Mineração de Dados no mercado financeiro (que deu origem a Financial Series) e a cada paper é de se reparar como há uma crescente (quase que obsessiva) busca por mais métricas; sendo que os resultados não chegam a mais do que 50% de sucesso (tem paper que apresenta resultados maiores, entretanto, não mostra metodologia; aí fica fácil).

Isso é de uma gravidade monstruosa, pois, como Data Scientist (ou minerador de dados em um contexto mais restrito) vai justificar um ganho de apenas 50% com inúmeros recursos computacionais e matemáticos além de investimentos financeiros com o desenvolvimento de uma estrutura de avaliação complexa com diversas métricas, enquanto há seres humanos como, por exemplo, o Warren Buffet que tem rendimentos de quase 70% daquilo que compra utilizando no máximo 10 métricas e lendo jornal; ou mesmo um trader que utiliza análise fundamentalista e em longo prazo tem retornos acima desse percentual? Não tem justificativa pra isso.

A avaliação de métricas, além do que o artigo propõe deve haver uma diferenciação da sua utilização na qual o seu peso é levado em consideração de acordo com o período de análise futura; ou seja, curto, médio e longo prazo; pois, a série histórica dependendo do período de análise pode influenciar negativamente a métrica, e consequentemente a decisão. Vamos utilizar o futebol como exemplo de como uma série história, dependendo do tipo de atributo para predição perde a sua influência e as vezes pode conduzir à um resultado não satisfatório a longo prazo: Até 1990, quem fosse realizar uma métrica para avaliar a probabilidade entre o Internacional (já campeão nacional em 75, e 76) e o Corinthians (que não tinha sido campeão ainda desse tipo de competição) de ser Campeão Brasileiro nos próximos 30 anos (não considerando outras variáveis) veria que o fator da série do Inter seria sempre maior do que o do time da capital; e a história mostrou que o time de São Paulo ganhou 5 títulos enquanto o time do sul não ganhou nenhum; o que mostra que o desenvolvimento de uma métrica deve ser de acordo com o período de tempo, o qual uma métrica de longo prazo não se aplica nesse caso específico (o que deveria ser uma medida de curto prazo para saber o fator de probabilidade para os times serem campeões.).

É um assunto ótimo de se discutir e vale a pena a leitura do artigo.

Tenha certeza que suas métricas não estão matando o seu negócio