Eu sei que eu poderia implementar uma função de erro quadrático médio raiz como esta:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
O que estou procurando se essa função rmse for implementada em uma biblioteca em algum lugar, talvez em scipy ou scikit-learn?
python
scikit-learn
scipy
siamii
fonte
fonte
.sum()
vez de.mean()
primeiro por engano. Além disso, suponho que essa função seja usada tanto que não vejo razão para que ela não deva estar disponível como uma função de biblioteca.predictions
etargets
por exemplo são do tipo,int16
o quadrado pode estourar (dando números negativos). Então, você pode precisar de um.astype('int')
ou.astype('double')
antes de usar o quadrado, comonp.sqrt(((predictions - targets).astype('double') ** 2).mean())
.Respostas:
sklearn.metrics
tem umamean_squared_error
função O RMSE é apenas a raiz quadrada do que quer que ele retorne.fonte
mean_squared_error
nosklearn.metrics
agora suporta parâmetro extra:squared
- "Se True retornar valor MSE, se False retornar valor RMSE".O que é o RMSE? Também conhecido como MSE, RMD ou RMS. Qual problema isso resolve?
Se você entende RMSE: (erro quadrático médio da raiz), MSE: (erro quadrático médio) RMD (desvio quadrático médio da raiz) e RMS: (quadrado quadrático médio da raiz), pedir uma biblioteca para calcular isso para você é um excesso de engenharia desnecessário . Todas essas métricas são uma única linha de código python com no máximo duas polegadas de comprimento. As três métricas rmse, mse, rmd e rms são conceitualmente idênticas.
RMSE responde à pergunta: "Como semelhante, em média, são os números em
list1
quelist2
?". As duas listas devem ter o mesmo tamanho. Quero "eliminar o ruído entre dois elementos, reduzir o tamanho dos dados coletados e obter um número único de alterações ao longo do tempo".Intuição e ELI5 para RMSE:
Imagine que você está aprendendo a jogar dardos em um dardo. Todos os dias você pratica por uma hora. Você quer descobrir se está melhorando ou piorando. Então, todos os dias, você faz 10 jogadas e mede a distância entre o alvo e o local onde o seu dardo bate.
Você faz uma lista desses números
list1
. Use o erro médio quadrático da raiz entre as distâncias no dia 1 e alist2
contendo todos os zeros. Faça o mesmo no segundo e no nono dias. O que você obterá é um número único que, esperançosamente, diminui com o tempo. Quando seu número RMSE é zero, você sempre bate em bullseyes. Se o número rmse aumentar, você está piorando.Exemplo no cálculo do erro quadrático médio raiz no python:
Que imprime:
A notação matemática:
Legenda do glifo:
n
é um número inteiro positivo inteiro que representa o número de jogadas.i
representa um contador inteiro positivo inteiro que enumera soma.d
representa as distâncias ideais,list2
contendo todos os zeros no exemplo acima.p
significa desempenho,list1
no exemplo acima. sobrescrito 2 significa numérico ao quadrado. d i é o i-ésimo índice ded
. p i é o i-ésimo índice dep
.O rmse é feito em pequenas etapas para que possa ser entendido:
Como todas as etapas do RMSE funcionam:
Subtrair um número de outro fornece a distância entre eles.
Se você multiplicar qualquer número vezes, o resultado será sempre positivo porque os negativos são negativos:
Adicione todos eles, mas espere, então uma matriz com muitos elementos teria um erro maior que uma matriz pequena; portanto, calcule a média pelo número de elementos.
Mas espere, nós combinamos todos eles antes para forçá-los positivos. Desfazer o dano com uma raiz quadrada!
Isso deixa você com um único número que representa, em média, a distância entre cada valor da lista1 e o valor correspondente do elemento da lista2.
Se o valor RMSE diminuir ao longo do tempo, ficaremos felizes porque a variação está diminuindo.
O RMSE não é a estratégia de ajuste de linha mais precisa, o total de mínimos quadrados é:
O erro quadrático médio da raiz mede a distância vertical entre o ponto e a linha. Portanto, se seus dados tiverem o formato de uma banana, plana perto da parte inferior e íngreme perto da parte superior, o RMSE reportará maiores distâncias para pontos altos, mas distâncias curtas para pontos baixos quando de fato as distâncias são equivalentes. Isso causa uma inclinação onde a linha prefere estar mais próxima dos pontos alto do que baixo.
Se este for um problema, o método dos mínimos quadrados total corrige isso: https://mubaris.com/posts/linear-regression
Pegadinhas que podem quebrar essa função RMSE:
Se houver nulos ou infinito em qualquer lista de entrada, o valor rmse de saída não fará sentido. Existem três estratégias para lidar com valores nulos / valores ausentes / infinitos nas duas listas: ignore esse componente, zere-o ou adicione uma melhor estimativa ou um ruído aleatório uniforme a todos os timesteps. Cada remédio tem seus prós e contras, dependendo do significado dos seus dados. Em geral, é preferível ignorar qualquer componente com um valor ausente, mas isso leva o RMSE a zero, fazendo com que você pense que o desempenho melhorou quando realmente não. Adicionar ruído aleatório com uma melhor estimativa pode ser preferido se houver muitos valores ausentes.
Para garantir a relativa correção da saída do RMSE, você deve eliminar todos os nulos / infinitos da entrada.
O RMSE tem tolerância zero para pontos de dados externos que não pertencem
Os quadrados dos erros quadráticos médios da raiz baseiam-se em todos os dados corretos e todos são contados como iguais. Isso significa que um ponto perdido no campo esquerdo vai arruinar totalmente todo o cálculo. Para lidar com pontos de dados discrepantes e descartar sua tremenda influência após um certo limite, consulte Estimadores robustos que criam um limite para a discrepância de discrepantes.
fonte
Provavelmente é mais rápido ?:
fonte
No scikit-learn 0.22.0, você pode passar
mean_squared_error()
o argumentosquared=False
para retornar o RMSE.fonte
Caso alguém encontre esse segmento em 2019, existe uma biblioteca chamada
ml_metrics
que está disponível sem pré-instalação nos kernels do Kaggle, bastante leve e acessível atravéspypi
(pode ser instalada com facilidade e rapidezpip install ml_metrics
):Tem poucas outras métricas interessantes que não estão disponíveis no
sklearn
, comomapk
.Referências:
fonte
Na verdade, eu escrevi várias delas como funções utilitárias para o statsmodels
http://statsmodels.sourceforge.net/devel/tools.html#measure-for-fit-performance-eval-measures
e http://statsmodels.sourceforge.net/devel/generated/statsmodels.tools.eval_measures.rmse.html#statsmodels.tools.eval_measures.rmse
Principalmente, um ou dois liners, sem pouca verificação de entrada, e principalmente destinado a obter facilmente algumas estatísticas ao comparar matrizes. Mas eles têm testes de unidade para os argumentos do eixo, porque é aí que às vezes eu cometo erros desleixados.
fonte
Ou simplesmente usando apenas as funções NumPy:
Onde:
Observe que,
rmse(y, y_pred)==rmse(y_pred, y)
devido à função quadrada.fonte
Você não pode encontrar a função RMSE diretamente no SKLearn. Mas, em vez de executar manualmente o sqrt, existe outra maneira padrão de usar o sklearn. Aparentemente, o próprio mean_squared_error do Sklearn contém um parâmetro chamado "quadrado" com o valor padrão como true. Se o definirmos como false, a mesma função retornará RMSE em vez de MSE.
fonte
Aqui está um código de exemplo que calcula o RMSE entre dois formatos de arquivo de polígono
PLY
. Ele usa aml_metrics
lib e anp.linalg.norm
:fonte
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html
mean_squared_error (y_true, y_pred)
Portanto, o código final seria algo como:
de sklearn.metrics import mean_squared_error de math import sqrt
RMSD = sqrt (mean_squared_error (testing_y, prediction))
impressão (RMSD)
fonte