Có một chức năng thư viện cho lỗi bình phương trung bình (RMSE) trong python không?


157

Tôi biết tôi có thể thực hiện một hàm lỗi bình phương gốc như thế này:

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

Những gì tôi đang tìm kiếm nếu chức năng rmse này được thực hiện trong một thư viện ở đâu đó, có thể là trong scipy hoặc scikit-learn?


5
bạn đã viết chức năng ngay tại đó. Rất có thể nếu chức năng đó đơn giản để viết, nó sẽ không nằm trong thư viện. tốt hơn hết là bạn nên tạo một đạo diễn có tên là các mô-đun và chỉ cần đặt các chức năng hữu ích vào đó và thêm nó vào đường dẫn của bạn
Ryan Saxe

14
@RyanSaxe Tôi không đồng ý. Tôi sẽ thấy yên tâm hơn nhiều khi gọi một chức năng thư viện hơn là tự mình thực hiện lại nó. Ví dụ, tôi đã viết .sum()thay vì .mean()đầu tiên do nhầm lẫn. Ngoài ra, tôi cho rằng chức năng này được sử dụng nhiều đến mức tôi không thấy lý do tại sao nó không nên có sẵn như là một chức năng thư viện.
siamii

1
@siamii: Tôi hiểu rằng 100%, tôi chỉ đang suy đoán lý do tại sao loại chức năng này có thể không có trong scipy. Nếu đó là tôi dường như không thể tìm thấy nó
Ryan Saxe

1
Cho những người cố gắng này và nó đã không làm việc: nếu predictionstargetslà ví dụ của loại hình int16sự (số âm cho) vuông sức tràn. Vì vậy, bạn có thể cần một .astype('int')hoặc .astype('double')trước khi sử dụng hình vuông, như np.sqrt(((predictions - targets).astype('double') ** 2).mean()).
Giăng

Một lợi thế khác của việc này trong sklearn là việc triển khai sklearn có rất nhiều mã tấm nồi hơi bổ sung để đảm bảo các mảng có cùng hình dạng, và bao gồm các tham số trọng số và cũng xử lý các mảng đa chiều và 'thích mảng' khác nhau. Làm tất cả những điều đó biến vấn đề này thành một vấn đề phức tạp hơn nhiều
David Waterworth

Câu trả lời:


212

sklearn.metricsmean_squared_errorchức năng. RMSE chỉ là căn bậc hai của bất cứ thứ gì nó trả về.

from sklearn.metrics import mean_squared_error
from math import sqrt

rms = sqrt(mean_squared_error(y_actual, y_predicted))

2
mean_squared_errortrong sklearn.metricsbây giờ hỗ trợ tham số phụ: squared- "Nếu Đúng lợi nhuận MSE giá trị, nếu lợi nhuận False giá trị RMSE."
Daddy32

132

RMSE là gì? Còn được gọi là MSE, RMD hoặc RMS. vấn đề gì nó giải quyết?

Nếu bạn hiểu RMSE: (Lỗi bình phương gốc), MSE: (Lỗi bình phương trung bình) RMD (Độ lệch bình phương trung bình) và RMS: (Root có nghĩa là bình phương), sau đó yêu cầu thư viện tính toán điều này cho bạn là không cần thiết quá mức . Tất cả các số liệu này là một dòng mã trăn dài tối đa 2 inch. Ba số liệu rmse, mse, rmd và rms là cốt lõi của chúng giống nhau về mặt khái niệm.

RMSE trả lời cho câu hỏi: "Làm thế nào tương tự, trên trung bình, là những con số trong list1để list2?". Hai danh sách phải có cùng kích thước. Tôi muốn "loại bỏ nhiễu giữa hai yếu tố bất kỳ, loại bỏ kích thước của dữ liệu được thu thập và có được một số duy nhất để thay đổi theo thời gian".

Trực giác và ELI5 cho RMSE:

Hãy tưởng tượng bạn đang học ném phi tiêu vào bảng phi tiêu. Mỗi ngày bạn luyện tập trong một giờ. Bạn muốn tìm hiểu xem bạn đang trở nên tốt hơn hay trở nên tồi tệ hơn. Vì vậy, mỗi ngày bạn thực hiện 10 lần ném và đo khoảng cách giữa bullseye và nơi phi tiêu của bạn đạt được.

Bạn lập một danh sách những con số đó list1. Sử dụng lỗi bình phương trung bình gốc giữa các khoảng cách ở ngày 1 và một list2chứa tất cả các số không. Làm tương tự vào ngày thứ 2 và thứ n. Những gì bạn sẽ nhận được là một con số duy nhất hy vọng sẽ giảm theo thời gian. Khi số RMSE của bạn bằng 0, bạn sẽ gặp bullsey mỗi lần. Nếu số rmse tăng lên, bạn đang trở nên tồi tệ hơn.

Ví dụ trong tính toán sai số bình phương gốc trong 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))

Bản in nào:

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

Ký hiệu toán học:

gốc nghĩa là độ lệch bình phương giải thích

Truyền thuyết Glyph: n là toàn bộ số nguyên dương đại diện cho số lần ném. iđại diện cho toàn bộ số nguyên dương mà liệt kê tổng. dlà viết tắt của khoảng cách lý tưởng, list2chứa tất cả các số không trong ví dụ trên. plà viết tắt của hiệu suất, list1trong ví dụ trên. siêu ký tự 2 là viết tắt của bình phương số. d i là chỉ số thứ i của d. p i là chỉ số thứ i của p.

Các rmse được thực hiện trong các bước nhỏ để có thể hiểu được:

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 ^

Làm thế nào để mọi bước của RMSE hoạt động:

Trừ một số từ một số khác cung cấp cho bạn khoảng cách giữa chúng.

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

Nếu bạn nhân bất kỳ số lần nào, kết quả luôn dương vì số lần âm âm là dương:

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

Thêm tất cả chúng, nhưng chờ, sau đó một mảng có nhiều phần tử sẽ có lỗi lớn hơn một mảng nhỏ, vì vậy hãy tính trung bình chúng theo số phần tử.

Nhưng chờ đã, chúng tôi bình phương tất cả sớm hơn để buộc họ tích cực. Hoàn tác các thiệt hại với một căn bậc hai!

Trung bình, bạn sẽ có một số duy nhất biểu thị khoảng cách giữa mọi giá trị của list1 với giá trị phần tử tương ứng của list2.

Nếu giá trị RMSE giảm theo thời gian, chúng tôi rất vui vì phương sai đang giảm.

RMSE không phải là chiến lược phù hợp chính xác nhất, tổng bình phương tối thiểu là:

Lỗi bình phương trung bình gốc đo khoảng cách dọc giữa điểm và đường thẳng, vì vậy nếu dữ liệu của bạn có hình quả chuối, phẳng gần đáy và dốc gần đỉnh, thì RMSE sẽ báo cáo khoảng cách lớn hơn đến các điểm cao, nhưng khoảng cách ngắn đến điểm thấp khi trong thực tế khoảng cách là tương đương. Điều này gây ra một độ lệch trong đó đường thẳng thích gần các điểm cao hơn thấp.

Nếu đây là sự cố, phương pháp tổng bình phương tối thiểu sẽ khắc phục điều này: https://mubaris.com/posts/linear-regression

Gotchas có thể phá vỡ chức năng RMSE này:

Nếu có null hoặc vô hạn trong danh sách đầu vào, thì giá trị rmse đầu ra sẽ không có ý nghĩa. Có ba chiến lược để xử lý null / giá trị thiếu / vô số trong một trong hai danh sách: Bỏ qua thành phần đó, bỏ qua nó hoặc thêm dự đoán tốt nhất hoặc tiếng ồn ngẫu nhiên thống nhất cho tất cả các dấu thời gian. Mỗi phương thuốc đều có ưu và nhược điểm tùy thuộc vào ý nghĩa của dữ liệu của bạn. Nói chung, bỏ qua bất kỳ thành phần nào có giá trị bị thiếu được ưu tiên, nhưng điều này làm cho RMSE bị lệch về 0 khiến bạn nghĩ rằng hiệu suất đã được cải thiện khi nó thực sự không có. Thêm tiếng ồn ngẫu nhiên vào một dự đoán tốt nhất có thể được ưu tiên nếu có nhiều giá trị bị thiếu.

Để đảm bảo tính chính xác tương đối của đầu ra RMSE, bạn phải loại bỏ tất cả null / infinites khỏi đầu vào.

RMSE không dung sai cho các điểm dữ liệu ngoại lệ không thuộc về

Root bình phương lỗi bình phương phụ thuộc vào tất cả dữ liệu là đúng và tất cả được tính là bằng nhau. Điều đó có nghĩa là một điểm đi lạc trong trường bên trái sẽ phá hỏng toàn bộ tính toán. Để xử lý các điểm dữ liệu xa hơn và loại bỏ ảnh hưởng to lớn của chúng sau một ngưỡng nhất định, hãy xem các công cụ ước tính mạnh mẽ xây dựng trong ngưỡng để loại bỏ các ngoại lệ.


3
Vâng, chức năng đơn giản. Nhưng nếu bạn cần nó hàng ngày, hãy sử dụng một giải pháp chính xác có sẵn ở đâu đó để bạn không phải thực hiện lại mọi lúc; )
logic x 2

@ eric-leschinski, tôi sẽ đánh giá cao nếu bạn có thể có một cái nhìn lúc này: stackoverflow.com/questions/45173451/...
Desta Haileselassie Hagos

1
Đó chắc chắn là một dấu hiệu của thế hệ này mà mọi người yêu cầu và chỉ đến các thư viện có kích thước nhiều gigabyte; yêu cầu 3 đến 20 phút Tải xuống mạng sau đó cài đặt CPU nghiêng hoàn toàn, khi tất cả những gì bạn thực sự cần là khoảng 3 dòng mã phù hợp với 400 byte. Nếu bạn yêu cầu thư viện cho một công việc có thể được nén thành 1 dòng mã, có độ rộng khoảng 90 ký tự, thì bạn đang cấp giấy phép cho mọi người lạm dụng bạn với các cài đặt có kích thước 3, 10 và 50GB có kích thước 99.9999 % phình to. Đây không phải là phẫu thuật tên lửa. Máy tính chạy bằng năng lượng mặt trời của bạn được sản xuất vào năm 1978 với bộ xử lý 740hz có thể thực hiện RMSE.
Eric Leschinski

22

Cái này có lẽ nhanh hơn?:

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

18

Trong scikit-learn 0.22.0, bạn có thể truyền mean_squared_error()đối số squared=Falseđể trả về RMSE.

from sklearn.metrics import mean_squared_error

mean_squared_error(y_actual, y_predicted, squared=False)

2
Đây là tính năng mới và sẽ là tốt nhất nếu chúng ta sử dụng nó.
Ravi G

9

Chỉ trong trường hợp ai đó tìm thấy chủ đề này vào năm 2019, có một thư viện được gọi ml_metricslà có sẵn mà không cần cài đặt sẵn trong các hạt của Kaggle, khá nhẹ và có thể truy cập thông qua pypi(có thể cài đặt dễ dàng và nhanh chóng pip install ml_metrics):

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

Nó có một vài số liệu thú vị khác không có sẵn trong sklearn, như mapk.

Người giới thiệu:


4

Trên thực tế, tôi đã viết một loạt các chức năng như các hàm tiện ích cho thống kê mô hình

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

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

Chủ yếu là một hoặc hai lớp lót và không kiểm tra đầu vào nhiều, và chủ yếu nhằm mục đích dễ dàng nhận được một số thống kê khi so sánh các mảng. Nhưng họ có các bài kiểm tra đơn vị cho các đối số trục, bởi vì đó là nơi đôi khi tôi mắc lỗi cẩu thả.


3

Hoặc đơn giản là chỉ sử dụng các hàm NumPy:

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

Ở đâu:

  • y là mục tiêu của tôi
  • y_pred là dự đoán của tôi

Lưu ý rằng rmse(y, y_pred)==rmse(y_pred, y)do hàm vuông.


3

Bạn không thể tìm thấy chức năng RMSE trực tiếp trong SKLearn. Nhưng, thay vì tự làm sqrt, có một cách tiêu chuẩn khác là sử dụng sklearn. Rõ ràng, chính mean_squared_error của Sklearn chứa tham số được gọi là "bình phương" với giá trị mặc định là true. Nếu chúng ta đặt nó thành false, cùng một hàm sẽ trả về RMSE thay vì 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

Đây là một mã ví dụ tính toán RMSE giữa hai định dạng tệp đa giác PLY. Nó sử dụng cả ml_metricslib và 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. Không, có một thư viện Scikit Learn để học máy và nó có thể dễ dàng sử dụng bằng ngôn ngữ Python. Nó có chức năng cho lỗi bình phương trung bình mà tôi đang chia sẻ liên kết dưới đây:

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

  1. Hàm được đặt tên mean_squared_error như được đưa ra dưới đây, trong đó y_true sẽ là các giá trị lớp thực cho các bộ dữ liệu và y_pred sẽ là các giá trị dự đoán, được dự đoán bởi thuật toán học máy bạn đang sử dụng:

mean_squared_error (y_true, y_pred)

  1. Bạn phải sửa đổi nó để lấy RMSE (bằng cách sử dụng hàm sqrt bằng Python). Quá trình này được mô tả trong liên kết này: https://www.codeastar.com/regression-model-rmsd/

Vì vậy, mã cuối cùng sẽ là một cái gì đó như:

từ sklearn.metrics nhập mean_squared_error từ sqrt nhập toán

RMSD = sqrt (mean_squared_error (tests_y, dự đoán))

in (RMSD)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.