予測精度の計算


9

時系列データの予測にはSTL(R実装)を使用しています。

私たちは毎日、毎日の予測を実行しています。予測値と実際の値を比較して、平均偏差を特定します。たとえば、明日の予測を実行して予測ポイントを取得した場合、これらの予測ポイントを、明日取得する実際のデータと比較します。私は、予測値と実際のデータがほとんどの場合一致しない場合があることを認識しています。これが、私たちが毎日どれだけ正確であるかを追跡したい理由の1つです。

今、私たちはこの問題を解決するための最良のアプローチは何かを特定しようとしていますか?ヘルプポインタをいただければ幸いです。

私が見て、予測精度の質問を測定するが、それはモデルを比較するのではなく実際の値と精度を計算に関係しているようです。

Rでの精度関数の実装を調べましたが、2つの質問と混同されていました。

1)チュートリアルのほとんどが「テストデータ」対「予測データ」と言っているため、実際のデータと予測データで機能しますか

2)精度関数の出力は、偏差の%ではなく値の配列です。


1
良い答えを得るには、正しい質問をする必要があります-それはイライラすることがあります。誰もが世界を支配することを望んでおり、それには事前の知識が必要です。明日の株については完璧な知識があったが、今日の知識があれば、大量のお金、力、機会、栄光などを稼ぐことができました。私があなたの問題を見ていたら、予測エラーのヒストグラム(またはeCDF)を確認したいと思います。予測の入力を「ジッター」させて、その平均と変動を調べ、誤差をそれらと比較したいと思うかもしれません。それを修正するには、エラーを理解する必要があります。
EngrStudent 2014

1
初心者向けのSTLとは何ですか?
シャドウトーカー、2014

@EngrStudent:「修正するにはエラーを理解する必要があります」-このステートメント自体には2つの部分があります。私は最初のセクション自体の可能なアプローチを見つけようとしています。私が選ぶ方法は部2のための戦略を選んで私を助ける
黄砂

1
平均は、システムの動作と同じではありません。標準偏差は、システムの動作と同じではありません。これら2つの測定値は、測定されたシステム動作の要約統計量です。エラーは正確ではありません。エラーは不確実ではありません。これらの2つのメジャーは、平均と標準偏差に類似したエラーの要約統計です。システム動作の測定には多くの無限大があるように、エラー動作の測定にも多くの無限大があります。あなたのルーブリックは何ですか?エラーについて考える良い方法をどのように測定しますか?
EngrStudent 2014

1
@なんばり-「賢い」の世界へようこそ。知識の始まりは、あなたが何も知らないことを知ることです-学生であることです。私は常に自分自身を学び、真実を話す誰でも修正できるようにしています。Eureqaツールで遊んで、「ターゲット式」のすべての一般的な形式とすべての「エラーメトリック」の両方の適切なサンプルデータを試してみると、この深い深いことがわかります。良い答えはありません。L'Hospital(別名L'Hopital)は、1696年に最初の最小二乗式を公式化しました。良いスタートはユースケースです。
EngrStudent 2014

回答:


13

予測精度を測定するにはさまざまな方法がありaccuracy()、Rの予測パッケージの関数はそれらのいくつかを出力します。「偏差の%」についてのコメントから、が提供する測定基準の1つである平均絶対パーセント誤差を使用したいようですaccuracy()ここでは、予測精度の最も一般的な指標について説明します。MAPEが問題に最も適切な手段であるかどうか、または他の手段のいずれかが優れているかどうかを検討したい場合があります。

このaccuracy()関数は実際のデータに対して機能します。「テストデータ」は、予測の作成に使用されなかったデータです。時々それらは利用可能ですが、予測が計算されるときに使用されません(トレーニングとテストセットへのデータの古典的な分割)。他の状況では、利用可能なすべてのデータが予測の計算に使用され、テストデータとして使用できる将来の観測値がいくつかあるまで待機する必要があります。

したがって、fが予測xのベクトルであり、同じ時間に対応する観測値のベクトルである場合、

accuracy(f,x)

あなたがしたいことをします。


「パーセンテージエラーに基づく測定には、対象の期間の任意のiについてyi = 0の場合、無限または未定義であり、任意のyiがゼロに近い場合に極端な値になるという欠点があります。」多くの場合、実績はゼロになる可能性があるため、これは私の場合問題になると思います。MAEを計算し、結果の数値を「パーセンテージ」に変更することを考えています。それは意味がありますか?
kosa、2014

どういうわけか私のお礼のメモはなくなりました。本当にあなたの時間をありがとう、Hyndman博士!
kosa 2014

2

まず、精度と精度の概念があることを明確にしましょう。精度は通常、バイアス、つまり予測と実績との体系的な偏差に関連しています。精度は通常、予測誤差の変動に関連しています。このようなもの: vs.。それで、あなたがあなたの投稿で「正確さ」に言及するとき、その違いを知っていましたか?P r e c i s i o n = V a r [ f y ]Accuracy=E(f)yPrecision=Var[fy]

次に、などの予測品質の統合された測度があり、とは予測と実績です。パラメータの不変性に対するチョウ検定など、この測定には統計があります。fiyiMSFE=1ni=1n(fiyi)2fiyi


答えてくれてありがとう!はい、現時点では精度について心配していません。正確さ、「予測と実際の偏差」を知りたいだけです。少数のモデルを実行して予測エラーを計算し、最良のモデルを選択することについて心配していません。私の唯一の目的は、実際の値と予測された値の間の偏差を見つけることです。ここでのモデルは一定です。モデルがデータセットに適しているかどうかに関係なく、必要なのは偏差の数だけです。この質問は、パラメータの微調整(または)モデルの選択とは関係ありません。私は今私が明確であることを望みます。不足しているものがあればお知らせください。
kosa 2014

@難波、「偏差数」が必要なら偏差値を使ってみませんか?予測をループし、実際の値と比較して、予測が実際の値と異なるケースの数を数えます。
ローマ

2

私はこれをRで行っていますが、サンプル内とサンプル外の両方のデータのコードは次のとおりです。

#accuracy testing for out-of-sample sample#

M<-#data#
deltaT<-#set observations per year,1/4 for quarterly, 1/12 for monthly
horiz<-#set amount of forecasts required
startY<-c(#,#) #set start date
N<-head(M,-horiz)
Nu<-log(Nu)
Nu<-ts(Nu,deltat=deltaT,start=startY)

#Run your forecasting method#
##My forecasting method is arima##

N<-#data#
N<-ts(N,deltat=deltaT,start=startY)
N<-tail(N,horiz)
fitted<-ts(append(fitted(Arimab), fArimab$mean[1]), deltat=deltaT, start = startY) #where Arimab is the ARIMA model and fArimab<-forecast(Arimab, h=horiz*2, simulate= TRUE, fan=TRUE)
N<-log(N)
fitted<-head(fitted,length(N))
error<-N-fitted
percenterror<-100*error/N
plus<-N+fitted
rmse<-function(error)
  sqrt(mean(error^2))
mae<-function(error)
  mean(abs(error))
mape<-function(percenterror)
  mean(abs(percenterror))
smape<-function(error,plus)
  mean(200*abs(error)/(plus))
mse<-function(error)
  mean(error^2)
me<-function(error)
  mean(error)
mpe<-function(percenterror)
  mean(percenterror)
accuracy<-matrix(c("rmse","mae","mape","smape","mse","me","mpe",(round(rmse(error),digits=3)),(round(mae(error),digits=3)),(round(mape(percenterror),digits=3)),(round(smape(error,plus),digits=3)),(round(mse(error),digits=3)),(round(me(error),digits=3)),(round(mpe(percenterror),digits=3))),ncol=2,byrow=FALSE)
View(accuracy,title="Accuracy of ARIMA out sample")

#Accuracy testing for the in sample

M<-#data#
deltaT<-#set observations per year,1/4 for quarterly, 1/12 for monthly
horiz<-#set amount of forecasts required
startY<-c(#,#) #set start date
Nu<-log(Nu)
Nu<-ts(Nu,deltat=deltaT,start=startY)
#run your forecasting method#
fitted<-ts(append(fitted(Arimab), fArimab$mean[1]), deltat=deltaT, start = startY)
N<-exp(Nu)
fitted<-exp(fitted)
fitted<-head(fitted,length(N))
error<-N-fitted
percenterror<-100*error/N
plus<-N+fitted
rmse<-function(error)
  sqrt(mean(error^2))
mae<-function(error)
  mean(abs(error))
mape<-function(percenterror)
  mean(abs(percenterror))
smape<-function(error,plus)
  mean(200*abs(error)/(plus))
mse<-function(error)
  mean(error^2)
me<-function(error)
  mean(error)
mpe<-function(percenterror)
  mean(percenterror)
accuracy<-matrix(c("rmse","mae","mape","smape","mse","me","mpe",(round(rmse(error),digits=3)),(round(mae(error),digits=3)),(round(mape(percenterror),digits=3)),(round(smape(error,plus),digits=3)),(round(mse(error),digits=3)),(round(me(error),digits=3)),(round(mpe(percenterror),digits=3))),ncol=2,byrow=FALSE)
View(accuracy,title="Accuracy of ARIMA in sample")

これが少し役に立てば幸いです。私がこれを実行するために使用した私の完全なコードが必要な場合は、これは非常に基本的なため、尋ねてください


1

短い答え:予測の品質を評価するには、モデルのトレーニング(近似)で使用したのとまったく同じ測定を使用します。

長い答え:

予測の正確さの尺度を選択するには、最初に予測をどのように解釈するかを知る必要があります。つまり、実際に「予報」として何をあげていますか?それは平均値ですか?中央値?最もありそうな値?この質問の答えは、予測精度の測定を一意に識別します。平均を予測する場合は、予測精度の尺度として二乗平均平方根偏差を使用する必要があります。中央値を予測する場合は、精度の尺度として平均絶対偏差を使用する必要があります。

この点について少し詳しく説明します。あなたが明日の予測/予測を行うと仮定しましょう。また、明日観測する可能性のある値について、対応する確率が観測されると仮定します。たとえば、確率0.03で1、確率0.07で2、確率0.11で3といった具合に観測されるかもしれません。したがって、さまざまな値に対する確率の分布があります。この分布があれば、さまざまなプロパティを計算し、それらを「予測」として与えることができます。平均を計算して、明日の予測として与えることができます。または、中央値を予測として使用することもできます。また、最も可能性の高い値を見つけて、それを明日の予測として与えることもできます。

予測として平均値を使用する場合、「予測の精度を測定する方法」の質問を「平均の精度の測定値は何ですか」に置き換える必要があり、答えは「実際の値と予測」。中央値を予測として使用する場合は、平均絶対偏差を使用する必要があります。

中央値を使用するのか、平均値を使用するのか、他の何かを使用するのかわからない場合があります。実際に予測として使用するものを見つけるには、トレーニングで最小化しようとする測定を知る必要があります。予測とトレーニングデータのターゲット値との間の二乗平均平方根偏差を最小化するモデルのパラメーターを見つけようとする場合、予測は平均として扱う必要があります。絶対偏差を最小化する場合は、中央値などを提供するようにモデルをトレーニングします。

追加された

一つ強調したいことがあります。上記で述べたように、「適合」と「予測」で同じ精度の尺度を維持することが重要です。それに加えて、私はあなたがあなたの方策を選ぶことにおいて絶対に自由であると言いたいと思います。「より良い」または「より悪い」対策はありません。メジャーは、予測を使用する方法(またはクライアント)によって決定する必要があります。たとえば、完全に一致することは(ユーザーまたはクライアントにとって)非常に重要であり、実際の値と予測値の差が大きいか小さい場合は、完全に一致していなくても機能しません。他の場合では、この違いが役割を果たします。1の差は2の差よりも優れています。場合によっては、2の差は1の差より2倍悪いことがあります。他のケースでは、2に等しい差は1に等しい差より100倍悪いです。観測とは異なる値を生成する必要があるエキゾチックなケースを想像することもできます。したがって、生成する数値の品質の測定は、必要なものに応じて、必要に応じて行うことができます。重要なことは、トレーニング(適合)と予測の評価で同じメジャーを使用することです。


(他の回答についてのあなたのコメントに関連して)ほとんどの場合、予測が実際の値と異なる場合は、完全な適合を得ることができるとは思いません。したがって、100%になるため、提案したアプローチは理想的ではない場合があります。しかし、私が考えているのは、実際と予測の違いをパーセンテージで取得することです。これはMAPEにすぎません。私たちが扱っているケースは、状況によりZEROが非常に頻繁に実際に取得される可能性が非常に高いです。この場合、パーセンテージがINFINITYになるため、MAPEは最良のオプションではない可能性があります。これは私が行き詰まったところです。
kosa 2014

MAPEが原則として私が欲しいものであることは知っていますが、私のデータセットでは、シリーズのREAL値が非常に頻繁にZEROになる可能性があるという残念なケースがあります。
kosa 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.