SkyFoxで気軽に機械学習

機械学習自動化ツール「SkyFox」の紹介ブログ

学習データと検証データの分割方法の新仕様について~CV(クロスバリデーション)

今回のテーマは学習用データと検証データの切り分けについてになります。

 

モデルを作成する際はデータを二つに分割し片方で学習しモデルを作成、そして作成したモデルを学習に使っていないもう一方のデータで検証します。

SkyFoxでは基本的にデータの75%を学習用データとし、25%を検証用データとしています。この比率を変更できるのか?というご質問をよくいただくのですがこちらは変更できません。どうしても変更したい場合は以下の記事をご参照下さい。

blog.skyfox.ai

 

さて本日紹介させて頂くのはデータ件数が少ない場合の分割方法についてです。

旧仕様

分類モデルの場合データ件数が1,000件以上(回帰モデルなら2,000件以上)の場合は75%-25%で交叉検証を行います。1,000件未満の場合は100%使って学習し、同じ学習データをそのまま評価データとして使います。

本来学習データで評価するということはするべきではありませんが件数が少ないため学習データの数を優先させていました。そのため検証結果を見る時はご注意くださいとご案内していました。

新仕様

こちらが2019年9月のバージョンアップで次のように変わりました。

具体的にはクロスバリデーション(以下CV)に対応しました。これによりデータ件数が少ない場合でもある程度安定した結果が得られるようになります。

CVというのはわかりやすく言うとデータをデータA、B、C、Dの4つに切り分けます。これを以下のようにして4回モデルを作って検証します。

  1. ABCで学習、Dで検証
  2. ABDで学習、Cで検証
  3. ACDで学習、Bで検証
  4. BCDで学習、Aで検証

最後に検証データを足し合わせて最終的な検証結果として表示しています。モデル自体は4つできますが、最終的なモデルはこの4つ全部使用して4つの予測結果の平均をとるようにしています。

CVの分割数(データ数毎)

ではこのCVの分割数ですが具体的にどう決めているかというと以下のようにデータ件数に応じて決めています。

  • 2,000件以下 : 8分割
  • 10,000件以下: 4分割
  • 50,000件以下: 2分割
  • 50,000件超: ~ CVなし ※学習=75%、検証=25%で評価

※分割後の目的変数の正例数が極端に少なくならないように分割します。もし少なくなるなら分割数を減らす対応をします。

例えば2,000件(正例が200件、負例が1,800件 ※1)というデータがあったとします。この場合データは8分割されます。そして8つそれぞれの中に正例が25件ずつ入っていたとします。この場合は8分割のままになります。

これが2,000件(正例が120件、負例が1,880件)というデータの場合、8つそれぞれの中に正例が15件ずつしか入りません。この場合分割数を8→4に変更して処理されます。

ちなみにその際の閾値※2は以下の通りです。

  • 二値分類の時は20件
  • 多値分類の時は10件

分割された一つ一つのクラスに入る正例数は一致するとは限りません。ランダムに振り分けていますので多かったり少なかったりバラつきますが、どこかひとつのクラスででも、この閾値を下回れば分割数を少なくします。

これは、正例数の少なさによる評価のブレが出なくなるようにするためです。CVと併せることで、評価結果の妥当性を向上させる仕組みとなっています。

 

※1)正例とは予測したいデータで、例えば商品の購入確率を予測したい場合、「購入した」データを正例データと呼びます。負例はその逆で「購入してない」データを指します。

※2)回帰モデルの場合はこの閾値は設けず単純にデータ件数だけ見てます。

 

注意事項

  1. トライアルでは旧仕様のままです。
  2. 新仕様のアウトプットでも評価データの欄に「学習データと同一」となっており旧仕様と新使用の見分けがつきません。こちらは12月のバージョンアップで例えば「4分割CVで評価」のような表現で何をしたのかわかるように変更する予定です。少々お待ちください。

f:id:secondxight:20191106181147p:plain