ニューラルネットワークにおける分位点回帰と分位点損失

ニューラルネットワークにおける分位点回帰と分位点損失

機械学習を使って予測モデルを構築する場合、単に「予測値(点予測)」を知りたいのではなく、「予測値が特定の範囲内に収まる可能性はどれくらいか(区間予測)」を知りたいのです。例えば、需要予測が必要な場合、最も需要予測される数量のみ在庫すると、在庫切れになる可能性が非常に高くなります。しかし、在庫が予測の 95 パーセンタイル (需要がこの値以下になる可能性が 95% である値) にある場合、在庫切れの数は 20 分の 1 程度に減少します。

これらのパーセンタイル値を取得するための機械学習手法は次のとおりです。

  • scikit-learn:GradientBoostingRegressor(損失='quantile, アルファ=アルファ)
  • LightGBM: LGBMRegressor(objective='quantile', alpha=alpha)
  • XGBoost: XGBoostRegressor(objective='reg:quantileerror', quantile_alpha=alpha) (バージョン 2.0~)

この「予測値が一定の範囲内に収まる可能性はどのくらいか(区間予測)」を予測する手法を、分位点回帰といいます。上記の機械学習手法では、分位点損失と呼ばれる損失を利用しています。

分位損失は、分位回帰モデルのパフォーマンスを評価するために使用される損失関数です。分位回帰では、予測の中心傾向(平均など)だけでなく、分布のさまざまな分位数での予測の精度にも注目します。分位損失により、関心のある分位に基づいて予測の不確実性を定量化できます。

連続変数の分布を予測する予測問題があり、中央値、0.25 分位値、0.75 分位値などのさまざまな分位値に関心があるとします。 q 番目の分位数の場合、分位損失は次のように定義されます。

ここ:

  • yy は真の値です。
  • yy はモデルからの予測値です。
  • qq は、0、10、1 の範囲のターゲット分位数です。

この損失関数の中心的な考え方は、モデルの予測が真の値を超えた場合、損失は予測値と真の値の差に q を掛けた値になるというものです。予測値が真値より低い場合、損失は予測値と真値の差に1−qを掛けた値になります。これにより、異なる分位数に対して異なるペナルティが課されることが保証されます。より小さな四分位数(たとえば、中央値)を重視する場合は、q を小さく設定し、その逆も同様です。

Pytorch で Quantile Loss を実装する

以下は、Pytorch を使用して分位損失をカスタム損失関数として定義する例です。

 import torch def quantile_loss(y_true, y_pred, quantile): errors = y_true - y_pred loss = torch.mean(torch.max((quantile - 1) * errors, quantile * errors)) return loss

トレーニングに関しては、通常のトレーニング方法と同じです。

 for epoch in range(num_epochs): for batch_x, batch_y in dataloader: optimizer.zero_grad() outputs = model(batch_x) loss = quantile_loss(outputs, batch_y, quantile) loss.backward() optimizer.step()

このカスタム損失関数が期待どおりに機能するかどうかを確認しましょう。

Pytorch クォンタイル損失テスト

まず、x に対して均一ランダム分布 (-5 ~ 5) を生成し、y に対して x に指数比例する正規ランダム分布を生成して、x から y の分位点を予測できるかどうかを確認します。

 # Generate dummy data num_samples = 10000 shape = (num_samples, 1) torch.manual_seed(0) # x is uniform random from -5 to 5 # y is random normal distribution * exp(scaled x) x_tensor = torch.rand(shape) * 10 - 5 x_scaled = x_tensor / 5 y_tensor = torch.randn(shape) * torch.exp(x_scaled) # Convert values to NumPy array (for graphs) x = x_tensor.numpy() y = y_tensor.numpy()

ネットワーク構造は非常にシンプルで、各層に 64 ノード + relu の 2 つの中間層があります。正規化や早期停止なしで 100 エポックが使用されました。予測される四分位数(パーセンタイル)は列で [0.500、0.700、0.950、0.990、0.995] であり、バッチ サイズは行で [1、4、16、64、256] であり、予測の合計は 25 です。 10,000 個のトレーニング データ インスタンス (青) のうち、予測出力値 (赤) を下回るインスタンスの比率が、図では「実際の」値としてマークされています。

指定されたパーセンタイル値を下回るサンプルの割合は通常、指定された値に近く、出力の分位数の予測は非常に簡単です。

y = clip(x, -2,2) + randn という少し複雑な例を考えてみましょう。ここで、clip(x, -2, 2) はクリップ関数です(値を指定された範囲にクランプします)。数値が指定された範囲外の場合、関数はそれを最も近い境界にクランプします (範囲を -2 ~ 2 に設定し、入力値 -5 を入力すると、関数は -2 を返し、10 を入力すると 2 を返します)。一方、randn は正規分布に従う乱数です。ネットワーク構造やその他の設定は前回の場合と同じです。

前の場合と同様に、指定されたパーセンタイル値を下回るサンプルの割合は、通常、指定された値に近くなります。分位予測の理想的な形状は、常に左上の図の赤い線の形状になります。指定されたパーセンタイルが増加すると、平行して上方に移動します。グラフの右下に行くにつれて、予測された赤い線はより直線的な形になりますが、これは望ましい結果ではありません。

もっと複雑な形状を使ってみましょう。目標は y=2sin(x) + randn です。その他の設定は前の場合と同じです。

指定されたパーセンタイル値を下回るサンプルの割合は、一般的に指定された値に近いことがわかります。 5x5 プロットの右下に向かって移動すると、分位予測の形状は正弦波の形状から外れます。グラフの右下に行くほど、予測値の赤い線がより直線的になります。

Qの選び方

Quantile 値を高く設定しすぎると、平坦な値になることがわかります。では、Quantile Loss を使用して得られた結果が「平坦」であるかどうかをどのように判断し、「平坦さを回避する」のでしょうか。

「平坦化」を検出する 1 つの方法は、最終的に得られる値が 99.5 パーセンタイル値であっても、50 パーセンタイル値、68 パーセンタイル値、95 パーセンタイル値を一緒に計算し、これらの値間の関係を調べることです。サンプル分布が正規分布に従う場合、μ は平均、σ は標準偏差です。

μ±σの区間にある確率は約68、μ±2σの区間にある確率は約95、μ±3σの区間にある確率は約99.7です。

68 パーセンタイル - 50 パーセンタイル、95 パーセンタイル - 50 パーセンタイル、99.5 パーセンタイル - 50 パーセンタイルの値の比率が 1:2:3 から大幅に逸脱している場合、逸脱しているパーセンタイル値が「平坦化」したと判断できます。

「平坦化」を回避する最初の方法は、上記の実験で示されているように、バッチ サイズを小さくすることです。バッチ サイズを小さくすると、この問題を回避でき、平坦な予測が生成されにくくなります。ただし、バッチ サイズを小さくすると、収束が不安定になったり、トレーニング時間が長くなったりするなどのデメリットもあるため、簡単に採用できるオプションは限られます。

2 番目のアプローチは、バッチをランダムに生成するのではなく、同じバッチで類似のサンプルを収集することです。これにより、「バッチ内の予測値より下または上のサンプルの割合を指定されたパーセンタイル値に対してバランスをとる」ことが回避されます。

最終的な「平坦化」は避けられず、それを軽減することしかできません。次の式では次の記号が使用されます。

  • P0: 50パーセンタイル値
  • P1: 68パーセンタイル値
  • P2: 95パーセンタイル
  • P3: 99.5パーセンタイル

上記の変数を使用すると、次のフローチャートを使用して適切な 99.5% パーセンタイル値を取得できます。

要約する

分位回帰は、データ分布のさまざまな領域に焦点を当てた問題や、より柔軟なモデリングが必要な状況に対して役立つアプローチである強力な統計ツールです。

この記事では、ニューラル ネットワークでのカスタム損失を使用した分位回帰の実装を紹介し、予測結果の「平坦化」問題を検出して軽減する方法について説明します。分位損失は、異なる分位数でのモデルのパフォーマンスを評価する方法を提供するため、一部のアプリケーション、特に金融におけるリスク管理の問題で役立ちます。

<<:  基本モデル + ロボット: これまでどこまで進んだのでしょうか?

>>:  超強力なPytorchオペレーション! ! !

ブログ    
ブログ    
ブログ    

推薦する

...

IBM、AI導入を加速しAIの透明性を向上するオープンプラットフォームを発表

[[247168]]最近、IBM は、AI アプリケーションがどのように意思決定を行うかを説明する際...

...

ICLR 2020 におけるナレッジグラフ研究の包括的な概要

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

人工知能がサイバー防御を強化

ビッグデータと高性能コンピューティング リソースにアクセスすることで、企業は新しい人工知能ツールと機...

アリババが3D位置マップ圧縮アルゴリズムを革新、その論文結果がトップカンファレンスCVPR 2022に選出

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

Google: より多くのデータはより優れたアルゴリズムに勝ります!

Google が発表した新しい研究論文では、音声検索や YouTube 動画へのテキスト説明やタグ...

国際翻訳コンテストで優勝したモデルがByteDanceによってオープンソース化された。

Transformer などの主流のテキスト生成アルゴリズムの単語単位の生成は、並列計算に適した ...

優れたプレーンテキストモデル? GPT-4は準備完了

2020年5月、GPT-3はGPT-2のリリースから1年後に正式にリリースされました。GPT-2も...

...

200以上の機械学習ツールを見て学んだこと

[[332582]]ビッグデータダイジェスト制作出典: huyenchip編集者: フィッシャー、ア...

...