Подтвердить что ты не робот

Есть ли библиотечная функция для среднеквадратической ошибки (RMSE) в python?

Я знаю, что могу реализовать функцию среднеквадратичной ошибки, например:

def rmse(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())

Что я ищу, если эта функция rmse реализована в библиотеке где-нибудь, возможно, в scipy или scikit-learn?

4b9b3361

Ответ 1

sklearn.metrics имеет функцию mean_squared_error. RMSE является только квадратным корнем из того, что он возвращает.

from sklearn.metrics import mean_squared_error
from math import sqrt

rms = sqrt(mean_squared_error(y_actual, y_predicted))

Ответ 2

Что такое RMSE? Также известный как MSE, RMD или RMS. Какую проблему это решает?

Если вы понимаете RMSE: (среднеквадратическая ошибка), MSE: (среднеквадратичная ошибка) RMD (среднеквадратическое отклонение) и RMS: (среднеквадратичное отклонение), то запрос библиотеки для вычисления этого значения для вас не требуется, Все эти метрики представляют собой одну строку кода Python длиной не более 2 дюймов. Три метрики rmse, mse, rmd и rms по своей сути концептуально идентичны.

RMSE отвечает на вопрос: "Как похоже, в среднем, число в list1 для list2?". Два списка должны быть одинакового размера. Я хочу "стереть шум между любыми двумя заданными элементами, вымыть размер собранных данных и почувствовать, как со временем меняется одно число".

Интуиция и ELI5 для RMSE:

Представьте, что вы учитесь бросать дротики в дартс. Каждый день вы тренируетесь в течение одного часа. Вы хотите выяснить, становится ли вам лучше или хуже. Поэтому каждый день вы делаете 10 бросков и измеряете расстояние между яблочком и местом удара дротика.

Вы составляете список этих номеров list1. Используйте среднеквадратичную ошибку между расстояниями в день 1 и list2 содержащим все нули. Сделайте то же самое на 2-й и 9-й день. То, что вы получите, это одно число, которое, мы надеемся, со временем уменьшается. Когда ваш RMSE номер равен нулю, вы каждый раз ударяете по буллисам. Если число rmse увеличивается, вам становится хуже.

Пример расчета среднеквадратичной ошибки в Python:

import numpy as np
d = [0.000, 0.166, 0.333]   #ideal target distances, these can be all zeros.
p = [0.000, 0.254, 0.998]   #your performance goes here

print("d is: " + str(["%.8f" % elem for elem in d]))
print("p is: " + str(["%.8f" % elem for elem in p]))

def rmse(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())

rmse_val = rmse(np.array(d), np.array(p))
print("rms error is: " + str(rmse_val))

Какие отпечатки:

d is: ['0.00000000', '0.16600000', '0.33300000']
p is: ['0.00000000', '0.25400000', '0.99800000']
rms error between lists d and p is: 0.387284994115

Математическая запись:

root mean squared deviation explained

Легенда о глифе: n - целое положительное целое число, представляющее количество бросков. i представляет собой целое положительное целое число, которое перечисляет сумму. d обозначает идеальные расстояния, а list2 содержит все нули в приведенном выше примере. p обозначает производительность, list1 в приведенном выше примере. верхний индекс 2 обозначает числовой квадрат. d i - это i -й индекс d. p i - это i -й индекс p.

Rmse выполняется небольшими шагами, чтобы его можно было понять:

def rmse(predictions, targets):

    differences = predictions - targets                       #the DIFFERENCEs.

    differences_squared = differences ** 2                    #the SQUAREs of ^

    mean_of_differences_squared = differences_squared.mean()  #the MEAN of ^

    rmse_val = np.sqrt(mean_of_differences_squared)           #ROOT of ^

    return rmse_val                                           #get the ^

Как работает каждый шаг RMSE:

Вычитание одного числа из другого дает вам расстояние между ними.

8 - 5 = 3         #absolute distance between 8 and 5 is +3
-20 - 10 = -30    #absolute distance between -20 and 10 is +30

Если вы умножаете любое число раз на себя, результат всегда будет положительным, потому что отрицательное время отрицательным будет положительным:

3*3     = 9   = positive
-30*-30 = 900 = positive

Добавьте их все, но подождите, тогда массив с множеством элементов будет иметь большую ошибку, чем маленький массив, поэтому усредните их по количеству элементов.

Но подождите, мы поставили их в квадрат раньше, чтобы заставить их позитивно настроиться. Отменить урон с квадратным корнем!

Это оставляет вас с одним числом, которое представляет в среднем расстояние между каждым значением list1 и соответствующим значением элемента list2.

Если значение RMSE уменьшается со временем, мы счастливы, потому что дисперсия уменьшается.

RMSE - не самая точная стратегия подгонки линии, общее количество наименьших квадратов:

Среднеквадратическая ошибка измеряет вертикальное расстояние между точкой и линией, поэтому, если ваши данные имеют форму банана, плоские у дна и крутые у вершины, то среднеквадратическое отклонение будет сообщать о больших расстояниях до высоких точек, но о коротких расстояниях до указывает низко, когда на самом деле расстояния эквивалентны. Это вызывает перекос, когда линия предпочитает быть ближе к точкам выше, чем ниже.

Если это проблема, метод наименьших квадратов исправляет это: https://mubaris.com/posts/linear-regression

Поправки, которые могут нарушить эту функцию RMSE:

Если в любом из входных списков есть нули или бесконечность, то выходное значение rmse не будет иметь смысла. Есть три стратегии, чтобы иметь дело с нулями/отсутствующими значениями/бесконечностями в любом списке: игнорировать этот компонент, обнулять его или добавлять наилучшее предположение или равномерный случайный шум для всех временных шагов. Каждое лекарство имеет свои плюсы и минусы в зависимости от того, что означают ваши данные. В общем случае предпочтительным является игнорирование любого компонента с отсутствующим значением, но это смещает среднеквадратичное отклонение к нулю, заставляя думать, что производительность улучшилась, хотя на самом деле это не так. Добавление случайного шума по наилучшему предположению может быть предпочтительным, если имеется много пропущенных значений.

Чтобы гарантировать относительную правильность RMSE-вывода, вы должны исключить все нули/бесконечности из входных данных.

RMSE имеет нулевой допуск для посторонних точек данных, которые не принадлежат

Среднеквадратичные квадраты ошибок основаны на правильности всех данных, и все они считаются равными. Это означает, что одна случайная точка в левом поле полностью испортит весь расчет. Чтобы обработать точки данных выбросов и отклонить их огромное влияние после определенного порога, см. надежные оценки, которые строят порог для отклонения выбросов.

Ответ 3

Скорее всего, это быстрее?:

n = len(predictions)
rmse = np.linalg.norm(predictions - targets) / np.sqrt(n)

Ответ 4

На самом деле, я написал кучу таких как служебные функции для statsmodels

http://statsmodels.sourceforge.net/devel/tools.html#measure-for-fit-performance-eval-measures

и http://statsmodels.sourceforge.net/devel/generated/statsmodels.tools.eval_measures.rmse.html#statsmodels.tools.eval_measures.rmse

В основном один или два лайнера и небольшая проверка ввода, и в основном предназначены для легкого получения статистики при сравнении массивов. Но они имеют модульные тесты для аргументов оси, потому что там, где я иногда делаю небрежные ошибки.

Ответ 5

На всякий случай, если кто-то найдет этот поток в 2019 году, есть библиотека ml_metrics которая доступна без предварительной установки в ядрах Kaggle, довольно легкоspring и доступна через pypi (ее можно легко и быстро pip install ml_metrics с помощью pip install ml_metrics):

from ml_metrics import rmse
rmse(actual=[0, 1, 2], predicted=[1, 10, 5])
# 5.507570547286102

У него есть несколько других интересных метрик, которые недоступны в sklearn, например, mapk.

Рекомендации:

Ответ 6

Или просто используя только функции NumPy:

def rmse(y, y_pred):
    return np.sqrt(np.mean(np.square(y - y_pred)))

Куда:

  • у моя цель
  • y_pred - мой прогноз

Обратите внимание, что rmse(y, y_pred)==rmse(y_pred, y) из-за функции квадрата.

Ответ 7

Вот пример кода, который вычисляет RMSE между двумя форматами файлов полигонов PLY. Он использует как ml_metrics и np.linalg.norm:

import sys
import SimpleITK as sitk
from pyntcloud import PyntCloud as pc
import numpy as np
from ml_metrics import rmse

if len(sys.argv) < 3 or sys.argv[1] == "-h" or sys.argv[1] == "--help":
    print("Usage: compute-rmse.py <input1.ply> <input2.ply>")
    sys.exit(1)

def verify_rmse(a, b):
    n = len(a)
    return np.linalg.norm(np.array(b) - np.array(a)) / np.sqrt(n)

def compare(a, b):
    m = pc.from_file(a).points
    n = pc.from_file(b).points
    m = [ tuple(m.x), tuple(m.y), tuple(m.z) ]; m = m[0]
    n = [ tuple(n.x), tuple(n.y), tuple(n.z) ]; n = n[0]
    v1, v2 = verify_rmse(m, n), rmse(m,n)
    print(v1, v2)

compare(sys.argv[1], sys.argv[2])