【AI・機械学習】ホールドアウト検証とK分割交差検証(K-foldクロスバリデーション)|モデル性能の評価

こんにちは、Kosei(@kay_diacc2)です!

機械学習モデルの予測性能を検証する方法として「ホールドアウト検証」と「K-分割交差検証(K-foldクロスバリデーション)」という代表的な2つの手法があります。本記事ではこれらの検証方法について解説します。

目次

テストデータを用いた予測結果の検証について

テストデータを用いた性能評価プロセス

機械学習全般での重要ステップとして、学習済みモデルが未知のデータの予測できるようになることがあります。この未知のデータに対する予測精度を汎化性能と呼びます。

モデル学習は、学習データを基準にパラメータを更新して、学習データ内に限った予測性能向上を目指している段階であるため、その時点で汎化性能は保証されていません。汎化性能を正確に評価するには、全てのデータセットを学習データとして利用するのではなく、学習データと汎化性能を評価するためのテストデータに分割して利用するのが好ましいと言えます。

さらに、モデルのハイパーパラメータチューニイングまで考慮する場合、学習データとテストデータに加え、検証データを用意するのが好ましいです。各データの役割を下記に示しましたため、違いを整理しておきましょう。

データ 役割
学習データ モデルを学習するために用いる
検証データ 学習データを構築したモデルから誤差を評価するために用いる
ハイパーパラメータの最適化や、過学習の兆候発見が主な目的
テストデータ 全ての学習過程が終わったタイミングでモデルの汎化性能の評価で用いる

学習データとテストデータを分割した代表的な検証方法として「ホールドアウト検証」「K分割交差検証」があります。本記事ではこれら2つの検証法について後述します。

ホールドアウト検証(Holdout Method)

ホールドアウト検証

ホールドアウト検証とは、全てのデータセットを任意の割合で学習データ、検証データ、テストデータに分割して検証する方法であり、機械学習モデルの汎化性能評価に際して従来より使用されている一般的な検証方法です。

ホールドアウト法において、学習データは、モデルの学習に使用されます。検証データは、機械学習全般においてハイパーパラメータを最適化するために使用されたり、過学習兆候を洞察するために利用されます。一方で、定められたハイパーパラメータをもとにモデル学習を行うする際は、検証データを利用しないこともあります。テストデータは、最終的なモデルの汎化性能の評価に用います。

一般に学習・テストデータで分割する際の割合は、{学習データ:テストデータ=8:2}や{9:1}が広く採用されています。検証データも用いる際は、{学習データ:検証データ:テストデータ=8,1,1}や{7,1,2}がよく採用される印象です。この割合は一概に正解はないため、用いるデータの状態に応じて柔軟に変更してみましょう。

ホールドアウト検証には1つ問題があります。それは分割したデータに偏りがある場合に正確な検証ができなくなることです。つまり、偏りのあるデータが多数混在するデータセット用いる際は、偏りに性能評価が影響されない検証方法が望まれます。その代表的な方法としてk分割交差検証があります。以下k分割交差検証の特徴を後述します。

K-分割交差検証(K-fold Cross-validation)

k-分割交差検証

k分割交差検証とは、全てのデータがテストデータとして利用されるよう、学習データとテストデータをk個に分割して性能評価する方法です。具体的に下記のような手順で実行されます。

  1. データセットをランダムにk個分割する
  2. k-1個を学習データ、1個をテストデータとして割り振る
  3. 割り振った学習データでモデルを構築し、テストデータで予測性能を推定する
  4. 1~3の手順をk回繰り返す
  5. それぞれのモデルから得られた予測性能をもとに平均性能を計算する

k分割交差検証は一般にモデルのハイパーパラメータチューニングの際に用いられることが多いです。また、一般的にk=10で指定されることが多いです。

ここでk分割交差検証とは、ホールドアウト検証で問題に挙がった「データの偏りから発現しうる不安定な性能評価」を克服した検証方法でした。そのため、そもそもデータの偏りが発現しずらいほど十分なデータ量を使用している場合は、k=5のように、kの値を小さくすると良いかもしれません。k分割交差検証においてkの値が大きくなりすぎると、検証に対する計算コストが増大します。加えて、性能評価の分散(バリアンス)が高くなる傾向にあり、モデルの平均性能が正確に推定できなくなる可能性があります。

反対に小さなデータセットを扱う場合は、kの値を大きくすると良いでしょう。イテレーション数k回の繰り返しで利用される学習データが増えるため、汎化性能の評価に対する偏り(バイアス)を低く抑えることができます。

AI・機械学習まとめ

最後までご覧いただきありがとうございました。当サイトでは機械学習・深層学習における理論やPythonを用いた実装方法の解説記事を多数取り扱っております。

【初学者向け】データサイエンス・人工知能(AI)開発のおすすめ学習方法も解説してます。

ディープラーニングを学ぶ上でおすすめの教材はこちらで紹介しています。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる