分布シフトを伴うトレーニングデータサンプルの形成

免責事項:この記事はMaxHalfordaの翻訳製品です翻訳はクリーンではありませんが、適応性があります。どんな知識でも理解できるように。







「私の友人と私は最近、データサイエンスゲーム2017の決勝戦に出場しました。コンテスト最初の部分は、ディーザーのデータセットを使用したKaggleでした(1)。問題は、バイナリ分類の問題を解決することにありました。ユーザーが提供された楽曲を聞くことに切り替えるかどうかを予測する必要がありました。



他のチームと同様に、関連する機能を抽出し、XGBoost(2)分類子をトレーニングしました。ただし、トレーニングデータセットのサブサンプルである特別な処理を行ったため、トレーニングデータセット(トレーニングデータセット)はテストセットをよりよく表すようになりました。」




マシンモデルの操作を成功させるための学習プロセスの基本的な要件の1つは、トレーニングデータセットとテストデータセットの分布の性質が同じであることです。大まかな例として、モデルは20歳のユーザーでトレーニングされており、テストサンプルではユーザーは60歳以上です。



ここでは、モデルがトレーニングされていない年齢では対応できないのは直感的に自然なことです。もちろん、このような例は純粋に合成的なものですが、実際には、大きな違いがある場合は、モデルを20以上でトレーニングし、30以上で機能するようにするだけで十分です。結果は同様になります。



これは、モデルがデータの分布(3)を学習するためです。トレーニングセットとテストセットの機能の分布が同じである場合、モデルはあなたに感謝します。



トランスレータインサート: 私が翻訳するために座ったとき、私は質問をしました:実際、テストは生産の入り口でモデルに来る目に見えないデータを反映しているので、なぜトレーニングをテストに合わせる必要があるのですか?それから私は寝坊し、読み直しました、そしてすべてが通り過ぎました。秘訣は、要因の影響下で、遡及が現在のところ無関係になる可能性があるということです。これについては後で詳しく説明します(例は少し再適応されています)。



1つの機能の分布に偏りが生じるのは、さまざまな理由があります。最も直感的な例は、Facebookから借りることができます。



ある会社が、数分で娯楽として機能(機能は機能と同じ)に基づいたモデルでトレーニングされたとしましょう。ユーザーの忠誠心のレベルを10段階で総合的に予測しましょう。



一般的なFacebookアプリケーションがメインのソーシャルネットワーク(フィードなど)とメッセージングシステムに分割されると、メインアプリケーションの時間が減少しました。つまり、受信データセットが変更され、過去の遡及に対応しなくなりました。

数学的には、時間の特徴を考慮して、モデルはより低いレベルの忠誠心を予測しますが、実際にはそうではありません-時間の転送は単純に2つのアプリケーションに分割されました。悲しいことに出てきます。



したがって、履歴データの分布が新しいデータの予測に無関係になると、分布シフトが発生します。



Deezerデータセットでは、分布の不一致は、予測の問題を解決する前に聴いた曲の数を測定する機能にありました。この機能は、パブリックデータセットとテストデータセットの両方で指数(4)の分布を示しました。ただし、テストデータセットではより顕著であったため、トレーニングセットの平均はテストセットよりも低くなりました。トレーニング分布をリサンプリングした後、ROC-AUCメトリック(5)を増やし、評価を約20ポイント上げることができました。



以下は、分布の違いの例です。



import numpy as np
import plotly.figure_factory as ff

train = np.random.exponential(2, size=100000)
test = np.random.exponential(1, size=10000)

distplot = ff.create_distplot([train, test], ['Train', 'Test'], bin_size=0.5)
distplot.update_layout(title_text=' Test, Train')


" "



分布シフトを平準化するという考えは、テスト分布を反映するようにトレーニングサンプルを再形成することです。



テストセットの分布に合わせて、トレーニングセットから50,000個の観測値のサブサンプルを作成するとします。直感的に何をしたいですか?



テストデータセットでより一般的なオブジェクトがトレーニングでも一般的になるようにします。しかし、どのオブジェクトがより多く必要で、どのオブジェクトがより少ない頻度であるかをどのように判断できますか?



リブラ!



手順は次のようになります。



  • 分布の数値直線を等間隔(またはバスケット(ビン))に分割します
  • 各バスケット内のオブジェクトの数を数える(ビンサイズ)
  • バスケット内の各観測値について、1 /(ビンサイズ)に等しい重量を計算します
  • 重み付き分布を持つkのサブサンプルを作成します(重みの高いオブジェクトはサブサンプルに頻繁に表示されます)


コードに転送して、次のアクションを実行します。



SAMPLE_SIZE = 50000
N_BINS = 300

#   ,       .
#        
step = 100 / N_BINS

test_percentiles = [
    np.percentile(test, q, axis=0)
    for q in np.arange(start=step, stop=100, step=step)
]

#     . 
#    ,    
train_bins = np.digitize(train, test_percentiles)

#          i   ,
#  0      , 1    1    i 
train_bin_counts = np.bincount(train_bins)

#    ,        
weights = 1 / np.array([train_bin_counts[x] for x in train_bins])

#   ,     
weights_norm = weights / np.sum(weights)

np.random.seed(0)

sample = np.random.choice(train, size=SAMPLE_SIZE, p=weights_norm, replace=False)

distplot_with_sample = ff.create_distplot([train, test, sample], ['Train', 'Test', 'New train'], bin_size=0.5)
distplot_with_sample.update_layout(title_text=' Test, Train, New train')


" "



新しい分布(緑)は、テストサンプル(オレンジ)の分布とよりよく一致するようになりました。コンテストでも同様のアクションを使用しました。元のデータセットには300万行が含まれ、130万個のオブジェクトから新しいサンプルのサイズを生成しました。データは小さくなりましたが、分布の代表性によりトレーニングの質が向上しました。



著者の個人的な経験からのいくつかのメモ:



  • バスケットの数は大きな役割を果たしませんが、バスケットが少ないほど、アルゴリズムの学習が速くなります(例では、バスケットの数(N_BINS)を3、30に変更してみてください。違いが非常に小さいことがわかります)
  • , , , “” , , .

    ( , “” , “” . . , )



整形アルゴリズムは、作成者のgithub(xamフォルダー)にあります。将来的には、著者は新しいトピックを分析し、ブログで共有する予定です。



翻訳とメモがお役に立てば幸いです。建設的な形式でのフィードバックをお待ちしております。お時間をいただきありがとうございます。



脚注:



1. Deezerはフランスのオンライン音楽ストリーミングサービスです。同様Spotifyは、雅音楽とあなたのアイデアを得る



2. XGBoost-極端な勾配ブーストアルゴリズム。私はそれを「ステロイドの段階的ブースト」と呼ぶのが大好きでした。ブーストのアイデアは、前のアルゴリズムが最もつまずいたクラスに注意を払いながら、前の学生の遡及的な学習経験に基づいて成績を形成する、いくつかの同質の弱い学生を訓練することです。勾配の背後にある考え方は、簡単に言えば、学習エラーを最小限に抑えることです。アルゴリズムとしてのXGBoostは、Gradient Boosting



3のより計算上有利な構成ですここでの分布とは、数値が変数に分散する法則を正確に表すものを意味します。



4.私の個人的な意見では、指数関数を視覚化するための最も理解しやすい拍車頭の中の分布は、一定の強度を持つ分布としての定義です。



5. ROC-AUC(レシーバー動作特性曲線下の領域)-「レシーバー処理特性」の曲線下の領域-メトリックは信号処理理論に由来するため、文字通りの名前です。 ROC曲線は非常に急勾配です。これは、クラスへの割り当ての確率しきい値が変化して「アーク」を形成するときに、モデル応答の真陽性と偽陽性の比率を示しています。 TPとFPの比率が見えるため、第1種と第2種の誤差に応じて、確率の最適なしきい値を選択することができます。



応答の確率しきい値に注意を払わずにモデルの精度を検討する場合は、[0,1]の範囲の値をとるROC-AUCメトリックが使用されます。クラスのバランスが取れた定数モデルの場合、ROC-AUCは約0.5に等しくなるため、以下のモデルは健全性チェック(健全性チェック)に合格しません。ROC曲線の下の領域が1に近いほど良いですが、一般的な結果の有用性を示すには、トレーニング済みモデルのAUC-ROCを定数モデルのAUC-ROCと比較することが重要です。



All Articles