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


158

次のような二乗平均平方根誤差関数を実装できることはわかっています。

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

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


5
あなたはすぐに関数を書きました。ほとんどの場合、関数が非常に簡単に記述できる場合は、ライブラリにはありません。モジュールと呼ばれるディレクタを作成し、それに便利な関数を入れてパスに追加する方がよい
Ryan Saxe

14
@RyanSaxe同意しない。自分で再実装するよりも、ライブラリ関数を呼び出す方がずっと安心できると思います。例えば、私は誤って最初にでは.sum()なく書いた.mean()。さらに、私はこの関数が多用されているため、ライブラリ関数として使用できない理由はないと思います。
siamii 2013年

1
@siamii:私は100%と理解しています。この種の機能がうまく機能しない理由を推測しただけです。もしそうなら私はそれを見つけることができないようです
Ryan Saxe

1
もしこれを試してみましたし、それが機能しなかった人々にpredictionstargetsタイプの例のためのものint16(負の数を与える)正方形のかもしれないオーバーフロー。したがって、のような正方形を使用する前に、.astype('int')またはが必要になる場合があります。.astype('double')np.sqrt(((predictions - targets).astype('double') ** 2).mean())
ジョン

sklearnでこれを使用するもう1つの利点は、sklearnの実装に多くの追加のボイラープレートコードがあり、配列が同じ形状であることを保証し、重みパラメーターを含み、多次元配列と異なる「配列の好きなもの」も処理することです。これを行うと、これがはるかに複雑な問題に変わります
David Waterworth

回答:


214

sklearn.metricsmean_squared_error機能があります。RMSEは、返されるものの平方根にすぎません。

from sklearn.metrics import mean_squared_error
from math import sqrt

rms = sqrt(mean_squared_error(y_actual, y_predicted))

3
mean_squared_errorsklearn.metrics追加パラメーターがサポートされるようになりましたsquared。「Trueの場合はMSE値が返され、Falseの場合はRMSE値が返されます。」
Daddy32

132

RMSEとは MSE、RMD、またはRMSとも呼ばれます。それはどのような問題を解決しますか?

RMSE:(二乗平均平方根誤差)、MSE:(二乗平均平方根誤差)RMD(二乗平均平方根偏差)、およびRMS:(二乗平均平方根)を理解している場合は、ライブラリーにこれを計算するように求めることは、不必要な過剰設計ではありません。これらのメトリックはすべて、長さが最大2インチの単一行のPythonコードです。3つのメトリクスrmse、mse、rmd、およびrmsは、概念的に同じコアにあります。

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

直感とRMSEのELI5:

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

それらの番号のリストを作成しますlist1。1日目の距離とlist2すべてゼロを含むaの間の二乗平均平方根誤差を使用します。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

数学表記:

二乗平均平方根偏差の説明

Glyph Legend: nスローの数を表す完全な正の整数です。 i合計を列挙する正の整数カウンタ全体を表します。 上記の例ではすべてゼロを含むd理想的な距離を表しlist2ます。 上記の例でpは、パフォーマンスを表していますlist1。上付き文字2は、数値の2乗を表します。 d iはのi番目のインデックスですdp 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のすべてのステップはどのように機能しますか。

別の数から1つの数を引くと、それらの間の距離がわかります。

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機能を破壊する可能性のある問題:

どちらかの入力リストにnullまたは無限大がある場合、出力rmse値は意味をなさなくなります。いずれかのリストでnull /欠損値/無限大を処理する方法は3つあります。そのコンポーネントを無視するか、ゼロにするか、すべてのタイムステップに最良の推測または均一なランダムノイズを追加します。各レメディには、データの意味によって長所と短所があります。一般に、欠損値のあるコンポーネントを無視することをお勧めしますが、これによりRMSEがゼロにバイアスされ、実際にはパフォーマンスが向上していないときにパフォーマンスが向上したと考えることができます。欠損値がたくさんある場合は、最良の推測でランダムノイズを追加することをお勧めします。

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

RMSEは、属していない外れ値データポイントの許容値がゼロです。

二乗平均平方根誤差は、すべてのデータが正しいことに依存しており、すべて等しいと見なされます。これは、左のフィールドの外にある1つの浮遊点が計算全体を完全に台無しにすることを意味します。外れ値のデータポイントを処理し、特定のしきい値の後でその大きな影響を排除するには、外れ値の排除のしきい値を組み込んだロバスト推定量を参照してください。


3
うん、シンプルな機能。しかし、日常的に必要な場合は、適切なソリューションをどこかに利用できるようにして、毎回それを再実装する必要がないようにしてください。)
論理値x 2

あなたはこれを見て持っていることができれば、エリック・leschinski @、私は感謝:stackoverflow.com/questions/45173451/...
DESTA Haileselassie Hagos

1
人々がマルチギガバイトのサイズのライブラリを求め、指摘するのは、間違いなくこの世代のしるしです。3〜20分のネットワークダウンロードが必要で、CPUフルチルトインストールが必要な場合、必要なのは約3行のコードで400バイトに収まります。1行のコード(約90文字幅)に圧縮できるジョブのライブラリを要求すると、99.9999の3、10、およびすぐに50 GBサイズのインストールで悪用されるライセンスが与えられます。 %膨張。これはロケット手術ではありません。1978年に740Hzプロセッサで作られた太陽光発電電卓は、RMSEを実行できます。
Eric

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
これは新しい機能であり、これを使用する場合に最適です。
Ravi G

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

実際、私はそれらの多くを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

ほとんどの場合、1つまたは2つのライナーがあり、入力チェックはそれほど多くありません。主に、配列を比較するときにいくつかの統計を簡単に取得することを目的としています。しかし、軸の引数の単体テストがあります。これは、私が時々ずさんな間違いをする場所だからです。


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

RMSLearn関数をSKLearnに直接見つけることはできません。ただし、手動でsqrtを実行する代わりに、sklearnを使用する別の標準的な方法があります。どうやら、Sklearnのmean_squared_error自体には、デフォルト値がtrueの「squared」と呼ばれるパラメーターが含まれています。falseに設定すると、同じ関数がMSEではなくRMSEを返します。

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

0

2つのポリゴンファイル形式間のRMSEを計算するコードの例を次に示しますPLYml_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. (Pythonを使用してsqrt関数を使用して)RMSEを取得するように変更する必要があります。このプロセスは次のリンクで説明されていますhttps : //www.codeastar.com/regression-model-rmsd/

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

sklearn.metricsからインポートmath import sqrtからmean_squared_error

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

プリント(RMSD)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.