状況:私は私のトレーニングデータが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のコスト可能かもしれない聞いたことがあるが、私はこれを行う方法がわからないと思います。
あなたの問題を解決しましたか?私は似たような問題を抱えており、現在、a)hidden1で50%のドロップアウト、b)損失時のL2正規化、c)最も顕著な90%クラスを削除し、10%均等に分散したクラスで計算しています。 – Frank
私は決してランダムなバッチを取るよりも優れたソリューションを見つけたことはありません。実用性のために、私はサイキック学習で実装されたツリーベースの方法に賛成して、神経網を完全に放棄しました。ここでは、不均衡問題を美しく解決するAUROCで最適化できる組み込みの相互検証方法があります。私はCPUが豊富だがGPUはないので、TensorFlowよりもはるかに高速に動作します。 – MJoseph