harugonos
@harugonos

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ホールドアウト法におけるデータオーギュメンテーションの仕方

解決したいこと

機械学習におけるデータ生成についてです。

0~24までのクラスがあり、各クラス
[67, 7, 13, 3, 42, 9, 34, 26, 18, 2, 32, 2, 14, 9, 54, 10, 2, 4, 3, 2, 4, 2, 5, 1, 2] (総数 367枚)
枚の画像(物体の輪郭内を白塗りした白黒画像)が含まれているとします。

今のところはこのうち
[54, 5, 9, 2, 34, 7, 27, 21, 15, 1, 26, 2, 12, 7, 44, 8, 2, 3, 2, 2, 3, 2, 4, 1, 2] (総数 295枚)
枚を訓練データとして手作業で分けて使用しています。

これを不均衡データとして、オーギュメンテーション(ぼかし)による水増しを行う場合、一般的にはどのように水増しを行うのでしょうか。

発生している問題

現在は訓練データを
[54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54] (総数 1350枚)
として、全クラスで同じデータ数になるようにクラス内で水増しを行っています。

しかしこの場合、訓練データの総数は1350枚であるのに対しテストデータは水増ししないので、367 - 295 = 72枚 となり、テストデータが極端に少なくなってしまい、正当に評価できないという心配があります。

実際、現在はこちらにデータを使用し学習を行うと、2エポック目からしばらくずっとlossとval_lossが0.000e-00になり、accとval_accに関しても100%になります。

訓練データだけをオーギュメンテーションするため、テストデータが極端に少なくなるのはしょうがない現象だと思うのですが、精度が良すぎてデータの生成方法に不備があるのではないか(この水増しの仕方で本当に大丈夫なのか)と思い、質問させていただきました。

0

1Answer

しかしこの場合、訓練データの総数は1350枚であるのに対しテストデータは水増ししないので、367 - 295 = 72枚 となり、テストデータが極端に少なくなってしまい、正当に評価できないという心配があります。

ご心配されていることは何でしょうか?以下「少ないテストデータでたまたま上手く分類できているだけなのではないか?(実応用した際に入力されるであろうデータでは上手く分類できないのではないだろうか?)」という仮定で回答します。

まず、現在はテストデータでval_lossやval_accを算出しているようですが、もしそうなら、これをやめることです。テストデータが当たるようにモデルの設定(ハイパーパラメータなど)ができてしまうからです。訓練データの一部をバリデーションデータとして切り分け、このデータでval_loss, val_accを算出しましょう。この条件下で出来栄えの良さそうなモデルができたら、最後にテストデータで一度だけ評価をしてください。

さらに、上記の処理について、モデルのハイパーパラメータはそのままに、全データ(訓練・テストに分ける前の367枚)を訓練・テストに分けるパターンを変えながら繰り返してみてください。良いモデルであれば、どのように訓練・テストに分けても、ばらつきが少なく、かつ高い精度を出せると思います。
※端的に言うと、交差検証をしましょう、ということです

ちなみに、テストデータの量について、水増しした後の訓練データの量に対する比を挙げて「少ない」というのは、あまり意味がないと思われます。というのも、すごく平たく言うと、テストデータを参照しない限りは、どうやってモデルを作成・学習しようが構わないからです。

0Like

Comments

  1. @harugonos

    Questioner

    ご回答ありがとうございます.
    いくつか質問させてください.

    > 訓練データの一部をバリデーションデータとして切り分け
    この操作は1パターンでよいのでしょうか,それとも交差検証的にいくつかのパターンで試すべきでしょうか.

    また現状,訓練データはクラスによってデータ数に偏りがある中で,その中でも水増し加工をする前の原画像をバリデーションデータとして使用する場合,バリデーションデータにまんべんなく各クラスのデータを割り当てることが厳しいように思います.
    この場合,少数派の評価はおろそかにはなるが多数派のデータだけでバリデーションデータを構成するべきでしょうか.

    > 訓練・テストに分けるパターンを変えながら繰り返し
    交差検証については以前から調べてはいたのですが上記の操作を繰り返し行う場合,交差検証の学習の度に,テストデータは水増しを行わず訓練データだけを水増しして学習という操作を繰り返す必要があると思い,ライブラリを使用しこれを内部的に行ってくれる都合の良いものを探したのですが見当たりませんでした.
    この場合は自力でコードを書いて交差検証を行うべきでしょうか.

    それともこちらは水増し加工なしの367枚のデータをそのまま交差検証にぶち込むということでしょうか.

    また,実運用する場合は交差検証で高い精度が出たハイパーパラメータで再度学習を行い,そこで得られた重みをロードし使用するのでしょうか.

    質問攻めで申し訳ないのですが,ご回答いただければ幸いです.
  2. > 訓練データの一部をバリデーションデータとして切り分け
    交差検証するなら、各試行ごとに1パターンで良いと考えます。もちろん増やせば増やす分、どのパターンでも同じような性能が出ることが確認できますが、手間とのトレードオフで決めれば良いと思います。

    >少数派の評価はおろそかにはなるが多数派のデータだけでバリデーションデータを構成するべきでしょうか.
    最終的なモデルの使い方次第です。多数派のデータで上手く分類できることを確認できれば十分なのならそうすべきですし、少数派が当たっていなければモデルが用をなさないなら、少数派も入れるべきです。

    >この場合は自力でコードを書いて交差検証を行うべきでしょうか.
    こちらも手間とのトレードオフだと思います。究極的には、1枚だけをテストデータ、残り366枚を訓練データとする分け方を367パターン試す、ということができます。どれくらいの手間と計算時間・リソースをかけられるかと相談、ということになるでしょう。これは機械学習というよりはプロジェクトの問題です。

    >また,実運用する場合は交差検証で高い精度が出たハイパーパラメータで再度学習を行い,そこで得られた重みをロードし使用するのでしょうか.

    一般的な方法のひとつがそうだと思います。他に取りうる選択肢としては、交差検証で学習したモデルのひとつをそのまま使う、でしょうか。
  3. @harugonos

    Questioner

    今までの評価方法では十分ではなく,目的に応じて様々なプロセスを踏む必要があるということが分かり,とても勉強になりました.
    一度教えていただいた方法で交差検証を行ってみたいと思います.
    ありがとうございました.

Your answer might help someone💌