Я знаю, что мог бы реализовать функцию среднеквадратичной ошибки следующим образом:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
Что я ищу, если эта функция rmse реализована где-то в библиотеке, возможно, в scipy или scikit-learn?
python
scikit-learn
scipy
siamii
источник
источник
.sum()
вместо.mean()
первого по ошибке. Кроме того, я полагаю, что эта функция используется так часто, что я не вижу причин, почему она не должна быть доступна как библиотечная функция.predictions
иtargets
, например, типа,int16
квадрат может переполниться (давая отрицательные числа). Таким образом, вам может понадобиться.astype('int')
или.astype('double')
перед использованием квадрата, какnp.sqrt(((predictions - targets).astype('double') ** 2).mean())
.Ответы:
sklearn.metrics
имеетmean_squared_error
функцию. RMSE - это просто квадратный корень того, что он возвращает.источник
mean_squared_error
insklearn.metrics
теперь поддерживает дополнительный параметр:squared
- «Если True возвращает значение MSE, если False возвращает значение RMSE».Что такое RMSE? Также известный как MSE, RMD или RMS. Какую проблему это решает?
Если вы понимаете RMSE: (среднеквадратическая ошибка), MSE: (среднеквадратичная ошибка) RMD (среднеквадратическое отклонение) и RMS: (среднеквадратичное отклонение), тогда запрос библиотеки для вычисления этого значения для вас не требуется. , Все эти метрики представляют собой одну строку кода Python длиной не более 2 дюймов. Три метрики rmse, mse, rmd и rms по своей сути концептуально идентичны.
RMSE отвечает на вопрос: «Насколько в среднем похожи цифры
list1
наlist2
?». Два списка должны быть одинакового размера. Я хочу "стереть шум между любыми двумя данными элементами, вымыть размер собранных данных и почувствовать, как со временем меняется одно число".Интуиция и ELI5 для RMSE:
Представьте, что вы учитесь бросать дротики в дартс. Каждый день вы тренируетесь в течение одного часа. Вы хотите выяснить, становится ли вам лучше или хуже. Поэтому каждый день вы делаете 10 бросков и измеряете расстояние между яблочком и местом удара дротика.
Вы делаете список этих чисел
list1
. Используйте среднеквадратичную ошибку между расстояниями в день 1 и a,list2
содержащую все нули. Сделайте то же самое на 2-й и 9-й день. То, что вы получите, это одно число, которое, мы надеемся, со временем уменьшается. Когда ваш RMSE номер равен нулю, вы каждый раз ударяете по буллисам. Если число rmse увеличивается, вам становится хуже.Пример расчета среднеквадратичной ошибки в Python:
Какие отпечатки:
Математическая запись:
Легенда о глифе:
n
это целое положительное число, представляющее количество бросков.i
представляет собой целое положительное целое число, которое перечисляет сумму.d
обозначает идеальные расстояния,list2
содержащие все нули в приведенном выше примере.p
выступает за производительность,list1
в приведенном выше примере. верхний индекс 2 обозначает числовой квадрат. d i - это i -й индексd
. р я - это -й индексp
.Rmse выполняется небольшими шагами, чтобы его можно было понять:
Как работает каждый шаг RMSE:
Вычитание одного числа из другого дает вам расстояние между ними.
Если вы умножаете любое число раз на себя, результат всегда будет положительным, потому что отрицательное время отрицательным будет положительным:
Сложите их все, но подождите, тогда массив с множеством элементов будет иметь большую ошибку, чем маленький массив, поэтому усредните их по количеству элементов.
Но подождите, мы поставили их в квадрат раньше, чтобы они были позитивными. Отменить урон с квадратным корнем!
Это оставляет вас с одним числом, которое представляет в среднем расстояние между каждым значением list1 и соответствующим значением элемента list2.
Если значение RMSE уменьшается со временем, мы счастливы, потому что дисперсия уменьшается.
RMSE - не самая точная стратегия подгонки линии, наименьшее число квадратов:
Среднеквадратическая ошибка измеряет вертикальное расстояние между точкой и линией, поэтому, если ваши данные имеют форму банана, плоские у дна и крутые у вершины, то среднеквадратическое отклонение будет сообщать о больших расстояниях до высоких точек, но о коротких расстояниях до указывает низко, когда на самом деле расстояния эквивалентны. Это вызывает перекос, когда линия предпочитает быть ближе к точкам выше, чем ниже.
Если это проблема, метод общих наименьших квадратов исправляет это: https://mubaris.com/posts/linear-regression
Поправки, которые могут нарушить эту функцию RMSE:
Если в любом из входных списков есть нули или бесконечность, то выходное значение rmse не будет иметь смысла. Есть три стратегии, чтобы иметь дело с нулями / отсутствующими значениями / бесконечностями в любом списке: игнорировать этот компонент, обнулять его или добавлять наилучшее предположение или равномерный случайный шум для всех временных шагов. Каждое лекарство имеет свои плюсы и минусы в зависимости от того, что означают ваши данные. В общем случае предпочтительным является игнорирование любого компонента с отсутствующим значением, но это смещает среднеквадратичное отклонение к нулю, заставляя думать, что производительность улучшилась, хотя на самом деле это не так. Добавление случайного шума по наилучшему предположению может быть предпочтительным, если имеется много пропущенных значений.
Чтобы гарантировать относительную правильность выходных данных RMSE, вы должны исключить все нули / бесконечности из входных данных.
RMSE имеет нулевой допуск для посторонних точек данных, которые не принадлежат
Среднеквадратичные квадраты ошибок основаны на правильности всех данных, и все они считаются равными. Это означает, что одна случайная точка в левом поле полностью испортит весь расчет. Чтобы обработать точки данных выбросов и отклонить их огромное влияние после определенного порога, см. Надежные оценки, которые строят порог для отклонения выбросов.
источник
Это наверное быстрее?
источник
В scikit-learn 0.22.0 вы можете передать
mean_squared_error()
аргументsquared=False
для возврата RMSE.источник
На всякий случай, если кто-то найдет этот поток в 2019 году, есть библиотека,
ml_metrics
которая доступна без предварительной установки в ядрах Kaggle, довольно легковесна и доступна черезpypi
(ее можно легко и быстро установитьpip install ml_metrics
):У него есть несколько других интересных метрик, которые не доступны
sklearn
, напримерmapk
.Ссылки:
источник
На самом деле, я написал несколько из них в качестве служебных функций для 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
В основном один или два лайнера и не очень много проверок ввода, и в основном они предназначены для простого получения статистики при сравнении массивов. Но у них есть модульные тесты для аргументов оси, потому что именно здесь я иногда делаю небрежные ошибки.
источник
Или просто используя только функции NumPy:
Куда:
Обратите внимание, что
rmse(y, y_pred)==rmse(y_pred, y)
из-за функции квадрата.источник
Вы не можете найти функцию RMSE непосредственно в SKLearn. Но вместо того, чтобы вручную выполнять sqrt, есть другой стандартный способ использования sklearn. По-видимому, сам Sklearn mean_squared_error содержит параметр, называемый «квадрат» со значением по умолчанию, равным true. Если мы установим его в значение false, та же функция вернет RMSE вместо MSE.
источник
Вот пример кода, который вычисляет RMSE между двумя форматами файлов полигонов
PLY
. Он использует какml_metrics
lib, так иnp.linalg.norm
:источник
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html
mean_squared_error (y_true, y_pred)
Итак, окончательный код будет выглядеть примерно так:
из sklearn.metrics import mean_squared_error из математического импорта sqrt
RMSD = sqrt (mean_squared_error (testing_y, прогноз))
печать (СКО)
источник