Чи є в бібліотеці функція бібліотеки для середньоквадратичної помилки Rot (RMSE) в python?


157

Я знаю, що міг би реалізувати функцію помилки кореневого середнього квадрата на зразок цієї:

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

Що я шукаю, якщо ця функція rmse десь реалізована в бібліотеці, можливо, в scipy чи scikit-learn?


5
ви написали функцію саме там. Швидше за все, якщо функція настільки проста для запису, вона не збирається знаходитись у бібліотеці. вам краще створити режисера, який називається модулями, і просто помістити в нього корисні функції і додати його до свого шляху
Райан Сакс

14
@RyanSaxe Я не згоден. Мені здається набагато заспокійливішим викликати функцію бібліотеки, ніж перевтілювати її самостійно. Наприклад, я писав .sum()замість .mean()першого помилково. Крім того, я вважаю, що ця функція використовується настільки сильно, що я не бачу причини, чому вона не повинна бути доступною як бібліотечна функція.
сіямі

1
@siamii: Я розумію, що на 100% я просто міркував над причиною, чому така функція може не бути в науці. Якщо це так, я не можу його знайти
Ryan Saxe

1
Для людей, які спробували це, і це не вийшло: якщо predictionsі targetsє, наприклад, тип int16квадрата може переповнюватися (даючи від’ємні числа). Таким чином , ви , можливо , буде потрібно .astype('int')або .astype('double')перед використанням площі, як np.sqrt(((predictions - targets).astype('double') ** 2).mean()).
Джон

Ще однією перевагою наявності цього в sklearn є те, що у варіантах sklearn є багато додаткового коду пластини котла, що забезпечує масиви однакової форми, включає параметри ваг, а також обробляє багатовимірні масиви та різні "схожі масиви". Робити все, що перетворює це на значно складнішу проблему
Девід

Відповіді:


212

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
mean_squared_errorв sklearn.metricsтепер підтримує додатковий параметр: squared- «Якщо Справжні повертає значення MSE, якщо Помилкові повертає значення СКО.»
Тато32

132

Що таке RMSE? Також відомий як MSE, RMD або RMS. Яку проблему вона вирішує?

Якщо ви розумієте RMSE: (середньоквадратична помилка), MSE: (середня помилка у квадраті) RMD (середньоквадратичне відхилення) та RMS: (коренева середня квадратура), то просити бібліотеку обчислити це для вас непотрібно надмірно інженерно . Усі ці показники - це один рядок коду python довжиною не більше 2 дюймів. Три метрики rmse, mse, rmd та rms є основою концептуально однаковою.

RMSE відповідає на питання: "Наскільки в середньому подібні числа list1до list2". Два списки повинні бути однакового розміру. Я хочу "змити шум між будь-якими двома заданими елементами, змити розмір зібраних даних і отримати відчуття часу для зміни одного числа".

Інтуїція та ELI5 для RMSE:

Уявіть, що ви навчаєтесь кидати дротики на дошці дартса. Щодня ви тренуєтесь протягом однієї години. Ви хочете з’ясувати, чи вам стає краще, чи стає гірше. Тож щодня робиш 10 кидків і вимірюєш відстань між бичачим оком та місцем, куди потрапив твій дротик.

Ви складаєте список цих чисел list1. Використовуйте середньоквадратичну помилку між відстанями в день 1 і list2містить усі нулі. Зробіть те ж саме на 2-й і n-й дні. Ви отримаєте єдине число, яке, сподіваємось, зменшується з часом. Коли номер 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

Математичні позначення:

середнє значення кореневого відхилення пояснено

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

РМС робиться невеликими кроками, щоб його можна було зрозуміти:

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 - не найточніша стратегія підгонки ліній, загальна кількість найменших квадратів:

Помилка кореневої середньої площі вимірює вертикальну відстань між точкою та лінією, тому, якщо ваші дані мають форму банана, плоского біля дна та крутого біля верху, то RMSE повідомляє про великі відстані до високих точок, але на короткі відстані до точки низькі, коли фактично відстані еквівалентні. Це спричиняє перекос, коли лінія воліє бути ближче до точок високим, ніж низьким.

Якщо це проблема, метод усунення найменших квадратів виправляє це: https://mubaris.com/posts/linear-regression

Отримані функції, які можуть порушити цю функцію RMSE:

Якщо в будь-якому списку вхідних даних є нулі або нескінченність, то значення rmse виводу не має сенсу. У будь-якому списку є три стратегії боротьби з нулями / відсутніми значеннями / нескінченностями: ігноруйте цей компонент, занулюйте його або додайте найкращі здогадки або рівномірний випадковий шум у всі кроки часу. Кожен засіб захисту має свої плюси і мінуси залежно від того, що означають ваші дані. Взагалі переважна ігнорування будь-якого компонента з відсутнім значенням, але це зміщує RMSE до нуля, змушуючи вас вважати, що продуктивність покращилася, коли вона насправді не має. Додавання випадкового шуму за найкращою здогадкою може бути кращим, якщо є багато відсутніх значень.

Для того, щоб гарантувати відносну правильність виходу RMSE, ви повинні усунути всі нулі / нескінченності з вхідних даних.

RMSE має нульовий допуск для зовнішніх точок даних, які не належать

Середньоквадратичні квадрати помилок залежать від правильності всіх даних, а всі вважаються рівними. Це означає, що одна бродяча точка, яка виходить у лівому полі, повністю знищить весь розрахунок. Щоб обробити чужі точки даних та відхилити їх величезний вплив після певного порогу, див. Надійні оцінки, які створюють поріг для звільнення людей, що втратили життя.


3
Так, проста функція. Але якщо вам це потрібно у щоденному використанні, його приємно просто мати правильне рішення десь доступне, так що вам не доведеться щоразу повторно виконувати його; )
логічний х 2

@ Ерік-Лещинський, я був би вдячний , якщо ви могли б подивитися на це: stackoverflow.com/questions/45173451 / ...
Деста Haileselassie Хагос

1
Це, безумовно, ознака цього покоління, що люди запитують і вказують на багатогігабайтні бібліотеки; вимагає від 3 до 20 хвилин мережевої завантаження, а потім встановлення повноцінного процесора, коли все, що вам потрібно, це близько 3 рядків коду, що вміщується в 400 байт. Якщо ви попросите бібліотеку для роботи, яку можна стиснути в 1 рядок коду, тобто шириною близько 90 символів, то ви даєте ліцензію людям зловживати вами встановленнями розміром 3, 10 та незабаром розміром 50 ГБ, які мають 99,9999 % здуття. Це не ракетна операція. Ваш калькулятор, що працює на сонячних батареях, виготовлений у 1978 році з процесором 740 Гц, може робити RMSE.
Ерік Лещинський

22

Це, мабуть, швидше ?:

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

18

У scikit-learn 0.22.0 ви можете передавати mean_squared_error()аргумент, squared=Falseщоб повернути RMSE.

from sklearn.metrics import mean_squared_error

mean_squared_error(y_actual, y_predicted, squared=False)

2
Це нова функція, і було б найкраще, якщо ми цим скористаємось.
Раві Г

9

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

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

Він має кілька інших цікавих показників , які не доступні в sklearn, як mapk.

Список літератури:


4

Насправді я написав купу таких функцій як утиліти для статистичних моделей

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

Переважно один-два вкладиші і не дуже багато перевірки вхідних даних, і в основному призначені для легкого отримання статистичних даних при порівнянні масивів. Але у них є одиничні тести для аргументів осі, тому що там я іноді роблю неохайні помилки.


3

Або просто використовуючи лише функції NumPy:

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

Де:

  • y - моя ціль
  • y_pred - мій прогноз

Зауважте, що rmse(y, y_pred)==rmse(y_pred, y)завдяки функції квадрата.


3

Ви не можете знайти функцію RMSE безпосередньо в SKLearn. Але, замість того, щоб вручну робити sqrt, є ще один стандартний спосіб використання sklearn. Мабуть, сам Sklearn mean_squared_error містить параметр, який називається "квадрат" із значенням за замовчуванням як істинним. Якщо ми встановимо його як false, та сама функція поверне RMSE замість MSE.

# code changes implemented by Esha Prakash
from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_true, y_pred , squared=False)

0

Ось приклад коду, який обчислює RMSE між двома форматами файлів багатокутника PLY. Він використовує як ml_metricslib, так і 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])

-1
  1. Ні, є бібліотека Scikit Learn для машинного навчання, і її можна легко використовувати, використовуючи мову Python. Він має функцію для середньої квадратичної помилки, якою я поділяю посилання нижче:

https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html

  1. Функція називається mean_squared_error, як зазначено нижче, де y_true були би реальними значеннями класів для кортежів даних, а y_pred будуть прогнозованими значеннями, передбаченими алгоритмом машинного навчання, який ви використовуєте:

mean_squared_error (y_true, y_pred)

  1. Ви повинні змінити його, щоб отримати RMSE (за допомогою функції sqrt за допомогою Python). Цей процес описаний за цим посиланням: https://www.codeastar.com/regression-model-rmsd/

Отже, остаточний код буде приблизно таким:

з sklearn.metrics import mean_squared_error з математики імпорту sqrt

RMSD = sqrt (середня_квадратична_помилка (тестування_я, прогноз))

друк (RMSD)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.