18

状況:私は私のトレーニングデータが2つのラベル間のラベル配布にアンバランスされたときに最適にTensorFlowを使用する方法を疑問に思ってトレーニングTensorFlow

。たとえば、MNIST tutorialが1と0を区別するために簡略化されているとします。ここで使用できるすべての画像は1または0です。 TensorFlowのチュートリアルでは、訓練とテストのために各タイプの画像の約50%を使用しているので、これは簡単です。しかし、私たちのデータで利用可能な画像の90%が0であり、わずか10%が1である場合はどうですか?私はこの場合、TensorFlowが私のテスト全体を0と予測し、無意味な90%の精度を達成することを日常的に予測しています。

私がいくつかの成功を収めてきた戦略の1つは、0と1の均等分布を持つランダムなバッチを選択することです。このアプローチでは、私はまだすべてのトレーニングデータを使用し、90%未満の正確さでまともな結果を生み出すことができますが、はるかに有用な分類子です。この場合、精度は私には多少役に立たないので、私の選択基準は通常ROC曲線(AUROC)の下の領域であり、これは.50よりもかなり高い結果をもたらします。

質問:

(1)私は不均衡なデータに関する研修の受け入れや最適な方法を説明している、またはより良い仕事かもしれない1があるの戦略か?

(2)不均衡なデータの場合、精度メトリックはそれほど有用ではないので、コスト関数を変更することで最大化できるメトリックがありますか?私は確かにAUROCのポストトレーニングを計算することができますが、AUROCを最大にするような方法で訓練できますか?

(3)不均衡なデータの結果を改善するために私のコスト関数に何か他の変更を加えることはできますか?現在、私はTensorFlowチュートリアルで与えられたデフォルトの提案使用しています:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y)) 
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

を私は、これはアップ重みで小さなラベルクラスをmiscategorizingのコスト可能かもしれない聞いたことがあるが、私はこれを行う方法がわからないと思います。

+0

あなたの問題を解決しましたか?私は似たような問題を抱えており、現在、a)hidden1で50%のドロップアウト、b)損失時のL2正規化、c)最も顕著な90%クラスを削除し、10%均等に分散したクラスで計算しています。 – Frank

+0

私は決してランダムなバッチを取るよりも優れたソリューションを見つけたことはありません。実用性のために、私はサイキック学習で実装されたツリーベースの方法に賛成して、神経網を完全に放棄しました。ここでは、不均衡問題を美しく解決するAUROCで最適化できる組み込みの相互検証方法があります。私はCPUが豊富だがGPUはないので、TensorFlowよりもはるかに高速に動作します。 – MJoseph

答えて

5

(1)あなたの戦略を使用しても構いません。私は不均衡なデータを扱っています。ダウンサンプリングとアップサンプリングの方法を最初に使用して、トレーニングセットを分散さえしようとしています。または、アンサンブル法を使用して、均等に分散したサブセットで各分類子を訓練する。

(2)AUROCを最大限にする方法はありませんでした。私の考えは、AUROCは正の率と偽陽性率に基づいているということです。したがって、必ずしもクラスを分離する能力を最大化するとは限らない。

(3)クラスインスタンスの比率でコストを重み付けすることについては、Loss function for class imbalanced binary classifier in Tensor flow と同様です。

2

1)はい。これは、不均衡なデータに対抗するための戦略をよく受けています。 SGDを使用している場合に限り、この戦略はNeural Netsで有効です。

トレーニングデータのバランスをとるもう1つの簡単な方法は、重み付けされた例を使用することです。不均衡な例を見ると、インスタンスごとの損失をより大きな重み/より小さく増幅するだけです。オンライン勾配下降を使用する場合、不均衡な例を見るときには、より大きい/小さい学習率を使用するのと同じくらい簡単です。

はわからない程度2.

4

私は不均衡なデータに苦しん一人です。不均衡なデータに対抗する私の戦略は以下の通りです。

1)0と1のラベルを以下のように同時に計算するコスト関数を使用します。

cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(_pred) + (1-y)*tf.log(1-_pred), reduction_indices=1)) 

2)0と1のラベルの数を同様にするSMOTEオーバーサンプリング方法を使用してください。ここを参照してくださいhttp://comments.gmane.org/gmane.comp.python.scikit-learn/5278

私は信用格付けモデルを作ろうとしたときに両方の戦略が働いた。

ロジスティック回帰は、不均衡なデータとデフォルト率の予測などのバイナリ分類を処理する典型的な方法です。 AUROCは、不均衡なデータを対処するための最良のメトリックの1つです。

1

不均衡なデータセットに関して、最初に気になる2つの方法は、(バランスの取れたバッチ分布を達成するためにサンプリングする陽性サンプル)です。

Upweighting陽性サンプル これは非常に少数の陽性サンプルを持っているデータセットでトレーニングしたときに誤って分類陽性サンプルの損失を増加させることをいいます。これは、陽性サンプルに対してより良いパラメータを学習するためにMLアルゴリズムをインセンティブにする。バイナリ分類のために、これを達成するテンソルフロー内の単純なAPIがあります。 (weighted_cross_entropy)参照

  • https://www.tensorflow.org/api_docs/python/tf/nn/weighted_cross_entropy_with_logits
    • 以下バッチサンプリング
      を見るこれは、トレーニングデータの各バッチは、陰性サンプルに均一に分布陽性サンプルを有するようにデータセットをサンプリングすることを含みます。これは、テンソルフローから提供された拒否サンプリングAPIを使用して行うことができます。

    関連する問題