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

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

機械学習を使って予測モデルを構築する場合、単に「予測値(点予測)」を知りたいのではなく、「予測値が特定の範囲内に収まる可能性はどれくらいか(区間予測)」を知りたいのです。例えば、需要予測が必要な場合、最も需要予測される数量のみ在庫すると、在庫切れになる可能性が非常に高くなります。しかし、在庫が予測の 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オペレーション! ! !

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

機械学習チートシートを使用して難しい問題を解決します。できますか?

機械学習の初心者であっても、中級プログラマーであっても、この質問に戸惑うかもしれません。チートシート...

...

実際に大規模な戦争を指揮しているのはビッグデータと人工知能なのでしょうか?

ビッグデータと人工知能はどれほどの力を持っているのでしょうか。ほとんどの人はまだそれを直感的に理解し...

人間は知能を持っているのに、なぜモノのインターネットには人工知能が必要なのでしょうか?

IoT にインテリジェンスが必要なのはなぜですか?人工知能は登場しましたが、具体的な概念はなく、ま...

...

今のところ人工知能があなたの仕事を奪うことはないが、すでにあなたの履歴書に載っている

[[387879]] AI、つまり人工知能は、最近誰もが口にする言葉になっているようです。私はこのテ...

素晴らしい瞬間を振り返りましょう! IEEE Spectrumが2023年の最もホットなAIストーリーをレビュー

また冬が来て、終わりに近づいています。気温も少し上がり、広大な空と大地にはまだ溶けきれない白が残って...

あなたの GPU は Llama 2 のような大規模なモデルを実行できますか?このオープンソースプロジェクトを試してみてください

コンピューティング能力が重要視される時代に、GPU は大規模モデル (LLM) をスムーズに実行でき...

機械学習の人気のトレンドの概要

Google トレンドを使ったことがありますか? かなり便利です。キーワードをいくつか入力すると、G...

...

...

OpenAI は大規模なモデル ストアを立ち上げる予定で、開発者は製品を棚に置くことができます。

最近、OpenAIの人気が高まっています。GPTモデル機能のアップデートからセキュリティ問題まで、世...

人工知能は教育の未来を変える:私たちをより賢くする

[51CTO.com クイック翻訳] 人工知能が私たちの日常生活に入り込んでいることに気づいています...

心理測定?犯罪の予感? AIは京都の痛みを軽減できるか?

[[271752]]画像出典: Qilu.com一つの火、二本の涙。 7月18日午前10時半頃(現...

Dropbox のエンジニアがロスレス圧縮アルゴリズム「Pied Piper」を開発

Dropbox のエンジニアたちは世界をより良い場所にするために取り組んでおり、HBO のコメディー...