私はこのような二乗平均平方根誤差関数を実装することができます知っている:
def rmse(predictions, targets):
return np.sqrt(((predictions - targets) ** 2).mean())
このrmse関数がどこかのライブラリ、おそらくscipyやscikit-learnに実装されている場合、私は何を探していますか?
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:(二乗平均平方根誤差)、およびRMS:(二乗平均平方根誤差)を理解していれば、計算のためにライブラリーを求めることは不要です。これらのメトリックはすべて、長さが最大2インチの1行のpythonコードです。 3つのメトリックrmse、mse、およびrmsはすべて概念的に同じです。
RMSEは質問に答えます:「平均して、list1とlist2の数字はどれくらい似ていますか?」。 2つのリストは同じサイズでなければなりません。私は、「任意の2つの要素間のノイズを洗い流し、収集されたデータのサイズを洗い流し、1つの数字で時間の経過とともに変化している」と感じたいのです。
あなたがダーツボードでダーツを投げることを学んでいると想像してください。毎日1時間練習します。あなたが良くなっているのか、悪化しているのかを把握したいのです。だから毎日あなたは10回投げてブルズアイとあなたのダーツが当たる場所の間の距離を測定します。
あなたはそれらの番号のリストを作ります。 1日目の距離とすべてゼロのリストの間の二乗平均平方根誤差を使用します。 2日目とn日目にも同じようにします。あなたが得るものは、うまくいけば時間とともに減少する単一の数字です。あなたのRMSE数がゼロの時、あなたは毎回ブルズアイを打ちます。数字が上がると、あなたは悪化しています。
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
これは理解しやすいように小さなステップで行われます。
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 #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はより高い点までより長い距離を報告します。実際には距離が等しい場合は低くなります。これにより、線が低い点より高い点に近くなる傾向があるスキューが発生します。
これが問題になる場合は、総最小二乗法でこれを解決します。 https://mubaris.com/2017-09-28/linear-regression-from-scratch
どちらかの入力リストにNULLまたは無限大がある場合、出力rmse値は意味がありません。どちらのリストでも、null /欠損値/無限大に対処するための3つの戦略があります。そのコンポーネントを無視するか、ゼロにするか、すべてのタイムステップに最適な推測または一様なランダムノイズを追加します。それぞれの救済策はあなたのデータが何を意味するかに応じて長所と短所があります。一般に、欠損値のあるコンポーネントは無視することをお勧めしますが、これによりRMSEがゼロに偏り、実際にはそうでない場合でもパフォーマンスが向上したと考えられます。多数の欠損値がある場合は、最良の推測にランダムノイズを追加することをお勧めします。
RMSE出力の相対的な正確さを保証するために、入力からすべてのヌル/無限大を除去する必要があります。
二乗平均平方根誤差二乗は、すべてのデータが正しいことに依存しており、すべてが等しいと見なされます。これは、左のフィールドに出てくる一つの曖昧な点が全体の計算を完全に台無しにすることを意味します。外れ値のデータポイントを処理し、一定のしきい値を超えたときにそれらの多大な影響を無視するには、外れ値を除外するためのしきい値を組み込んだ堅牢な推定量を参照してください。
これはおそらく速いですか?
n = len(predictions)
rmse = np.linalg.norm(predictions - targets) / np.sqrt(n)
実際、私は統計モデルのための効用関数としてそれらの束を書きました
http://statsmodels.sourceforge.net/devel/tools.html#measure-for-fit-performance-eval-measures
主に1つか2つのライナーで、あまり入力チェックはありません。主に、配列を比較するときに統計を簡単に取得することを目的としています。しかし、それらは軸の引数についての単体テストを持っています。
万が一誰かが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
では利用できない興味深いメトリクスは他にもいくつかあります。
参考文献:
あるいは単にNumPy関数だけを使うことによって:
def rmse(y, y_pred):
return np.sqrt(np.mean(np.square(y - y_pred)))
どこで:
二乗関数のため、rmse(y, y_pred)==rmse(y_pred, y)
に注意してください。
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html
mean_squared_error(y_true、y_pred)
したがって、最終的なコードは次のようになります:
sklearn.metricsからimport mean_squared_error from math import sqrt
RMSD = sqrt(mean_squared_error(testing_y、予測))
印刷(RMSD)
これは、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])