web-dev-qa-db-ja.com

pythonに二乗平均平方根誤差(RMSE)用のライブラリ関数はありますか?

私はこのような二乗平均平方根誤差関数を実装することができます知っている:

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

このrmse関数がどこかのライブラリ、おそらくscipyやscikit-learnに実装されている場合、私は何を探していますか?

111
siamii

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))
159
Greg

RMSEとは何ですか? MSEまたはRMSとも呼ばれます。それはどんな問題を解決しますか?

RMSE:(二乗平均平方根誤差)、MSE:(二乗平均平方根誤差)、およびRMS:(二乗平均平方根誤差)を理解していれば、計算のためにライブラリーを求めることは不要です。これらのメトリックはすべて、長さが最大2インチの1行のpythonコードです。 3つのメトリックrmse、mse、およびrmsはすべて概念的に同じです。

RMSEは質問に答えます:「平均して、list1とlist2の数字はどれくらい似ていますか?」。 2つのリストは同じサイズでなければなりません。私は、「任意の2つの要素間のノイズを洗い流し、収集されたデータのサイズを洗い流し、1つの数字で時間の経過とともに変化している」と感じたいのです。

RMSEのための直感とELI5:

あなたがダーツボードでダーツを投げることを学んでいると想像してください。毎日1時間練習します。あなたが良くなっているのか、悪化しているのかを把握したいのです。だから毎日あなたは10回投げてブルズアイとあなたのダーツが当たる場所の間の距離を測定します。

あなたはそれらの番号のリストを作ります。 1日目の距離とすべてゼロのリストの間の二乗平均平方根誤差を使用します。 2日目とn日目にも同じようにします。あなたが得るものは、うまくいけば時間とともに減少する単一の数字です。あなたのRMSE数がゼロの時、あなたは毎回ブルズアイを打ちます。数字が上がると、あなたは悪化しています。

pythonの二乗平均平方根誤差の計算例:

import numpy as np
d = [0.000, 0.166, 0.333]
p = [0.000, 0.254, 0.998]

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

数学的表記:

enter image description here

これは理解しやすいように小さなステップで行われます。

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         #distance between 8 and 5 is 3
-20 - 10 = -30    #distance between -20 and 10 is +30

自分自身に任意の数を掛けた場合、負の数が負の数は正なので、結果は常に正になります。

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

それらをすべて足し合わせてください、しかし待ってください、そして、多くの要素を持つ配列は小さな配列より大きなエラーを持つことになるので、要素の数でそれらを平均します。

しかし、待って、私たちは彼らを前向きにして彼らを前向きにしました。平方根でダメージを元に戻します!

これにより、list1のすべての値からlist2の対応する要素の値までの距離を平均して表す単一の数字が残ります。

RMSE値が時間の経過とともに低下した場合、 分散 が減少しているため、問題ありません。

RMSEは最も正確なラインフィッティング戦略ではありません。最小二乗法は次のとおりです。

二乗平均平方根誤差は、点と線の間の垂直距離を測定するため、データがバナナのように形作られ、底の近くで平らで、頂上の近くで急勾配である場合、RMSEはより高い点までより長い距離を報告します。実際には距離が等しい場合は低くなります。これにより、線が低い点より高い点に近くなる傾向があるスキューが発生します。

これが問題になる場合は、総最小二乗法でこれを解決します。 https://mubaris.com/2017-09-28/linear-regression-from-scratch

このRMSE関数を破る可能性がある手引き:

どちらかの入力リストにNULLまたは無限大がある場合、出力rmse値は意味がありません。どちらのリストでも、null /欠損値/無限大に対処するための3つの戦略があります。そのコンポーネントを無視するか、ゼロにするか、すべてのタイムステップに最適な推測または一様なランダムノイズを追加します。それぞれの救済策はあなたのデータが何を意味するかに応じて長所と短所があります。一般に、欠損値のあるコンポーネントは無視することをお勧めしますが、これによりRMSEがゼロに偏り、実際にはそうでない場合でもパフォーマンスが向上したと考えられます。多数の欠損値がある場合は、最良の推測にランダムノイズを追加することをお勧めします。

RMSE出力の相対的な正確さを保証するために、入力からすべてのヌル/無限大を除去する必要があります。

RMSEは、属していない外れ値データ点に対する許容度がゼロです。

二乗平均平方根誤差二乗は、すべてのデータが正しいことに依存しており、すべてが等しいと見なされます。これは、左のフィールドに出てくる一つの曖昧な点が全体の計算を完全に台無しにすることを意味します。外れ値のデータポイントを処理し、一定のしきい値を超えたときにそれらの多大な影響を無視するには、外れ値を除外するためのしきい値を組み込んだ堅牢な推定量を参照してください。

96
Eric Leschinski

これはおそらく速いですか?

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

実際、私は統計モデルのための効用関数としてそれらの束を書きました

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

主に1つか2つのライナーで、あまり入力チェックはありません。主に、配列を比較するときに統計を簡単に取得することを目的としています。しかし、それらは軸の引数についての単体テストを持っています。

2
Josef

万が一誰かが2019年にこのスレッドを見つけた場合、Kaggleのカーネルにプレインストールすることなく利用可能なml_metricsと呼ばれるライブラリがあり、かなり軽量でpypiを通してアクセス可能です(pip install ml_metricsを使えば簡単に素早くインストールできます)。

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

sklearnのように、mapkでは利用できない興味深いメトリクスは他にもいくつかあります。

参考文献:

1
Julian Peller

あるいは単に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)に注意してください。

0
KeyMaker00
  1. いいえ、ライブラリScikit Learn for machine learningがあり、_を使用して簡単に使用できます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. (Pythonを使用してsqrt関数を使用して)RMSEを取得するには、このプロセスを変更する必要があります。このプロセスについては、このリンクで説明しています。 https://www.codeastar.com/regression-model-rmsd/

したがって、最終的なコードは次のようになります:

sklearn.metricsからimport mean_squared_error from math import sqrt

RMSD = sqrt(mean_squared_error(testing_y、予測))

印刷(RMSD)

0
Usman Zafar

これは、2つのポリゴンファイル形式PLY間のRMSEを計算するサンプルコードです。 ml_metrics libと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])
0
Georges