次のような二乗平均平方根誤差関数を実装できることはわかっています。
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
この rmse 関数がどこかのライブラリ、おそらく scipy または scikit-learn に実装されている場合、私は何を探していますか?
次のような二乗平均平方根誤差関数を実装できることはわかっています。
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
この rmse 関数がどこかのライブラリ、おそらく scipy または scikit-learn に実装されている場合、私は何を探していますか?
sklearn >= 0.22.0
sklearn.metrics
kwargを持つmean_squared_error
関数があります (デフォルトは)。に設定すると、RMSE が返されます。squared
True
squared
False
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))
RMSE: (二乗平均平方根誤差)、MSE: (平均二乗誤差) RMD (二乗平均平方根偏差)、および RMS: (二乗平均平方根) を理解している場合、これを計算するライブラリを求めることは不要なオーバーエンジニアリングです。 . これらのメトリックはすべて、最大 2 インチの長さの 1 行の Python コードです。rmse、mse、rmd、および rms の 3 つのメトリックは、基本的に概念的に同一です。
RMSE は次の質問に答えlist1
ますlist2
。2 つのリストは同じサイズでなければなりません。「任意の 2 つの要素間のノイズを洗い流し、収集されたデータのサイズを洗い流し、時間の経過に伴う変化を 1 つの数値で感じたい」と考えています。
ダーツボードでダーツを投げることを学んでいると想像してください。毎日、1時間練習します。良くなっているのか、悪くなっているのかを把握したいのです。したがって、毎日 10 回投げて、ブルズアイとダーツが当たった場所の間の距離を測定します。
それらの番号のリストを作成しますlist1
。list2
1 日目の距離とすべてゼロを含むa の間の二乗平均平方根誤差を使用します。2 日目と n 日目も同様に行います。得られるのは、うまくいけば時間の経過とともに減少する単一の数値です。RMSE 値が 0 の場合、毎回ブルズアイをヒットします。rmse 値が上昇すると、悪化しています。
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 番目のインデックスですd
。 p 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 ^
ある数値から別の数値を引くと、それらの間の距離が得られます。
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 は高いポイントまでの距離は大きく、ポイントまでの距離は短いと報告します。実際には距離が等しい場合、低いポイント。これにより、線が低い点よりも高い点に近づくことを好むスキューが発生します。
これが問題である場合は、総最小二乗法でこれを修正します: https://mubaris.com/posts/linear-regression
いずれかの入力リストにヌルまたは無限大がある場合、出力の rmse 値は意味をなしません。いずれかのリストでヌル / 欠損値 / 無限大を処理するには、次の 3 つの戦略があります。そのコンポーネントを無視するか、ゼロにするか、すべてのタイム ステップに最良の推測または均一なランダム ノイズを追加します。データが何を意味するかによって、それぞれの救済策には長所と短所があります。一般に、値が欠落しているコンポーネントは無視することが推奨されますが、これにより RMSE が 0 に偏り、実際にはパフォーマンスが向上していないのにパフォーマンスが向上したと考えるようになります。欠損値が多数ある場合は、最良の推測にランダム ノイズを追加することをお勧めします。
RMSE 出力の相対的な正確性を保証するために、入力からすべてのヌル/無限を排除する必要があります。
二乗平均二乗誤差平方根は、すべてのデータが正しいことに依存し、すべてが等しいものとしてカウントされます。これは、レフト フィールドの外側にある 1 つの外れポイントが、計算全体を完全に台無しにすることを意味します。外れ値データ ポイントを処理し、特定のしきい値を超えた後にそれらの多大な影響を却下するには、制御する必要のない極端にまれなイベントとして外れ値を却下するためのしきい値を構築するロバスト エスティメータを参照してください。 .be/8Zpi9V0_5tw?t=5
これはおそらく高速ですか?:
n = len(predictions)
rmse = np.linalg.norm(predictions - targets) / np.sqrt(n)
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
。
参考文献:
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))