218

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

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

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

4

14 に答える 14

313

sklearn >= 0.22.0

sklearn.metricskwargを持つmean_squared_error関数があります (デフォルトは)。に設定すると、RMSE が返されます。squaredTruesquaredFalse

from sklearn.metrics import mean_squared_error

rms = mean_squared_error(y_actual, y_predicted, squared=False)

sklearn < 0.22.0

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))
于 2013-09-04T20:56:57.047 に答える
158

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

RMSE: (二乗平均平方根誤差)、MSE: (平均二乗誤差) RMD (二乗平均平方根偏差)、および RMS: (二乗平均平方根) を理解している場合、これを計算するライブラリを求めることは不要なオーバーエンジニアリングです。 . これらのメトリックはすべて、最大 2 インチの長さの 1 行の Python コードです。rmse、mse、rmd、および rms の 3 つのメトリックは、基本的に概念的に同一です。

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

RMSE の直感と ELI5:

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

それらの番号のリストを作成しますlist1list21 日目の距離とすべてゼロを含むa の間の二乗平均平方根誤差を使用します。2 日目と n 日目も同様に行います。得られるのは、うまくいけば時間の経過とともに減少する単一の数値です。RMSE 値が 0 の場合、毎回ブルズアイをヒットします。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 の各ステップはどのように機能しますか:

ある数値から別の数値を引くと、それらの間の距離が得られます。

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

それらをすべて合計しますが、待ってください。多くの要素を含む配列は、小さな配列よりも大きなエラーになるため、要素の数でそれらを平均します。

しかし、待ってください。それらをポジティブにするために、以前にそれらをすべて 2 乗しました。平方根でダメージを回復!

これにより、平均して、list1 のすべての値と対応する list2 の要素値との間の距離を表す 1 つの数値が得られます。

時間の経過とともに RMSE 値が低下する場合は、分散が減少しているので満足です。「Shrinking the Variance」は一種の機械学習アルゴリズムです。

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

二乗平均平方根誤差は、ポイントとラインの間の垂直距離を測定するため、データがバナナのような形をしており、下部近くが平らで上部近くが急勾配である場合、RMSE は高いポイントまでの距離は大きく、ポイントまでの距離は短いと報告します。実際には距離が等しい場合、低いポイント。これにより、線が低い点よりも高い点に近づくことを好むスキューが発生します。

これが問題である場合は、総最小二乗法でこれを修正します: https://mubaris.com/posts/linear-regression

この RMSE 機能を壊す可能性のある落とし穴:

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

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

RMSE には、属していない外れ値データ ポイントに対するゼロ トレランスがあります。

二乗平均二乗誤差平方根は、すべてのデータが正しいことに依存し、すべてが等しいものとしてカウントされます。これは、レフト フィールドの外側にある 1 つの外れポイントが、計算全体を完全に台無しにすることを意味します。外れ値データ ポイントを処理し、特定のしきい値を超えた後にそれらの多大な影響を却下するには、制御する必要のない極端にまれなイベントとして外れ値を却下するためのしきい値を構築するロバスト エスティメータを参照してください。 .be/8Zpi9V0_5tw?t=5

于 2016-06-16T14:17:14.580 に答える
27

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

n = len(predictions)
rmse = np.linalg.norm(predictions - targets) / np.sqrt(n)
于 2013-06-20T19:08:39.450 に答える
11

ml_metricsKaggle のカーネルに事前にインストールしなくても利用できるライブラリがあり、非常に軽量で、次の方法でアクセスできますpypi(簡単かつ高速にインストールできますpip install ml_metrics)。

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

sklearnなど、 では利用できない興味深いメトリックが他にいくつかありますmapk

参考文献:

于 2019-04-22T19:59:27.727 に答える
1
from sklearn.metrics import mean_squared_error
rmse = mean_squared_error(y_actual, y_predicted, squared=False)

or 

import math
from sklearn.metrics import mean_squared_error
rmse = math.sqrt(mean_squared_error(y_actual, y_predicted))
于 2021-01-01T19:29:48.733 に答える