トレーニング セットとテスト セットへのデータのパーティション分割 (Analysis Services - データ マイニング)

トレーニング セットとテスト セットにデータを分割することは、データ マイニング モデルの評価における重要な部分です。通常、データセットをトレーニング セットとテスト セットにパーティション分割すると、ほとんどのデータはトレーニングに使用され、テストに使用されるデータは少量になります。Analysis Services ではデータのサンプルがランダムに抽出されるため、テスト パーティションとトレーニング パーティションが互いに類似するように分割されます。トレーニングとテストに類似データを使用すると、データの差異による影響を最小限に抑えることができ、モデルの特性をよりよく理解できます。

トレーニング セットを使用してモデルが処理された後、テスト セットに対する予測を実行してモデルをテストします。テスト セット内のデータには予測対象の属性の既知の値が既に含まれているため、モデルの推測が正しいかどうかを簡単に判断できます。

通常、マイニング モデルの予測精度は、リフトまたは分類の精度によって測定します。リフト チャートおよびその他の精度チャートの詳細については、「モデルの精度をグラフ化するためのツール (Analysis Services - データ マイニング)」を参照してください。

データ マイニング構造のパーティションの作成

SQL Server 2008 では、マイニング構造のレベルでデータをパーティション分割します。パーティション サイズに関する情報と各パーティション内のデータは構造に格納され、その構造に基づくすべてのモデルで、これらのパーティションを使用してトレーニングとテストを行うことができます。

マイニング構造のパーティションは、次の方法で定義できます。

  • マイニング構造の作成時に、データ マイニング ウィザードを使用してマイニング構造をパーティション分割します。

  • データ マイニング デザイナの [マイニング構造] タブで、構造のプロパティを変更します。

  • 分析管理オブジェクト (AMO) または XML データ定義言語 (DDL) を使用し、プログラムによって構造を作成および変更します。

データ マイニング ウィザードによるマイニング構造のパーティション分割

既定では、マイニング構造のデータ ソースを定義した後、データ マイニング ウィザードによってデータの 70% がトレーニング用パーティション、30% がテスト用パーティションに分割されます。これはデータ マイニングでよく使用される比率ですが、Analysis Services では、独自の要件に合わせてこの比率を変更することもできます。

また、トレーニング ケースの最大数を設定するようにウィザードを構成したり、指定したケースの最大数まで最大割合を許可するように制限を組み合わせたりすることもできます。ケースの最大割合と最大数の両方を指定した場合、Analysis Services によって、2 つの制限のうちの小さい方がテスト セットのサイズとして使用されます。たとえば、テスト ケースに 30% の提示データを指定し、テスト ケースの最大数を 1000 に指定した場合、テスト セットのサイズが 1000 ケースを超えることはありません。これを利用すると、モデルにトレーニング データが追加されてもテスト セットのサイズが一定に保たれるようにすることができます。

複数のマイニング構造に同じデータ ソース ビューを使用する場合、すべてのマイニング構造とそのモデルでほぼ同じようにデータが分割されるようにするには、ランダム サンプリングの初期化に使用するシードを指定します。HoldoutSeed の値を指定すると、Analysis Services によるサンプリングの開始時にその値が使用されます。指定しないと、サンプリング時に、マイニング構造の名前に対してハッシュ アルゴリズムを使用してシード値が作成されます。

注意

EXPORT ステートメントおよび IMPORT ステートメントを使用してマイニング構造のコピーを作成すると、新しいマイニング構造でも同じパーティション定義が使用されます。エクスポート プロセスでは新しい ID が作成されますが、同じ名前が使用されるからです。一方、2 つのマイニング構造の基になるデータ ソースが同じでも、名前が異なる場合は、それぞれのマイニング構造に作成されるパーティションも異なります。

構造のプロパティの変更

マイニング構造を作成および処理した後にテスト パーティションを追加する場合は、マイニング構造のプロパティを変更できます。データのパーティション分割方法を変更するには、次のプロパティを編集します。

プロパティ

説明

HoldoutMaxCases

テスト セットに含めるケースの最大数を指定します。

HoldoutMaxPercent

テスト セットに含めるケースの数を、データセット全体に対する割合で指定します。データセットを含めないようにするには、0 を指定します。

HoldoutSeed

パーティションのデータをランダムに選択するときにシードとして使用する整数値を指定します。この値は、トレーニング セット内のケース数には影響を与えずに、パーティションを反復可能にします。

パーティションを既存の構造に追加したり変更したりした場合、構造および関連するすべてのモデルを再処理する必要があります。また、パーティションを追加すると、異なるデータ サブセットでモデルがトレーニングされるようになるため、モデルの結果が変化する場合があります。

プログラムによる HOLDOUT の指定

DMX ステートメント、AMO、または XML DDL を使用して、パーティション分割されたデータ マイニング構造を作成できます。

  • DMX   データ マイニング拡張機能 (DMX) 言語では CREATE MINING STRUCTURE ステートメントが拡張されており、WITH HOLDOUT 句を使用できます。CREATE STRUCTURE ステートメントの構文と例については、「CREATE MINING STRUCTURE (DMX)」を参照してください。

    注意

    ALTER MINING STRUCTURE ステートメントは、提示パラメータの使用をサポートしていません。

  • ASSL   Analysis Services スクリプト言語 (ASSL) を使用すると、パーティション分割されたマイニング構造を新しく作成することも、既存のデータ マイニング構造にパーティションを追加することもできます。詳細については、「MiningStructure 要素 (ASSL)」を参照してください。

  • AMO   また、AMO を使用してパーティションを表示および変更することもできます。詳細については、「AMO の概念とオブジェクト モデル」を参照してください。

データ マイニング スキーマ行セットに対してクエリを実行すると、既存のマイニング構造のパーティションに関する情報を表示できます。これを行うには、DISCOVER ROWSET を呼び出すか、DMX クエリを使用できます。詳細については、「データ マイニング スキーマ行セット」または「データ マイニング スキーマ行セットのクエリ (Analysis Services - データ マイニング)」を参照してください。

パーティション情報の使用

既定では、トレーニング パーティションとテスト パーティションに関する情報はすべてキャッシュされるので、既存のパーティションを使用して新しいモデルをトレーニングし、テストできます。データのサブセットに対してモデルを評価できるように、キャッシュ済みの提示パーティションに適用するフィルタをユーザーが定義することもできます。詳細については、「マイニング モデルのフィルターの作成 (Analysis Services - データ マイニング)」を参照してください。

ケースがどのようにパーティション分割されるかは、提示データの構成方法、および指定したデータによって異なります。各パーティション内のケース数を確認したり、トレーニング セットとテスト セットに含まれているケースの詳細を調べたりするには、DMX クエリを作成してモデル構造にクエリを実行します。たとえば、次のクエリでは、モデルのトレーニング セットで使用されたケースが返されます。

SELECT * from <structure>.CASES WHERE IsTrainingCase()

テスト ケースのみを取得し、さらにマイニング構造内のいずれかの列でテスト ケースをフィルタ処理するには、次の構文を使用します。

SELECT * from <structure>.CASES WHERE IsTestCase() AND <structure column name> = '<value>'

提示データの使用に関する制限事項

  • 提示データを使用するには、マイニング構造の MiningStructureCacheMode プロパティが既定値の KeepTrainingCases に設定されている必要があります。CacheMode プロパティを ClearAfterProcessing に変更してマイニング構造を再処理すると、パーティションが失われます。

  • タイム シリーズ モデルでパーティションを使用することはできません。したがって、パーティションを作成し、Microsoft タイム シリーズ アルゴリズムを使用してモデルを作成するように指定した場合、パーティション分割が無効になります。また、ケース テーブル レベルまたは入れ子になったテーブル レベルで、マイニング構造に KEY TIME 列が含まれている場合も、パーティション分割が無効になります。

  • データセット全体をテストに使用し、トレーニングにはまったく使用しないように、パーティションを誤って構成してしまうことがあります。ただし、この問題を修正できるように、Analysis Services によりエラーが生成されます。また、50% を超えるデータがテスト用に提示されていると、構造の処理時に Analysis Services により警告が表示されます。

  • 多くの場合、提示データの既定値である 30 を使用すると、トレーニング データとテスト データのバランスがとれます。十分なトレーニングのためにデータセットをどの程度大きくするか、また、オーバーフィットを回避するためにトレーニング セットをどの程度小さくするかを、単純に算出する方法はありません。ただし、モデルを作成した後、クロス検証を使用して、特定のモデルについてデータセットを評価できます。詳細については、「クロス検証 (Analysis Services - データ マイニング)」を参照してください。

  • AMO と XML DDL には、前の表に示したプロパティに加えて、読み取り専用プロパティ HoldoutActualSize が用意されています。ただし、構造が処理されるまではパーティションの実際のサイズを正確に知ることができないため、HoldoutActualSize プロパティの値を取得する前に、モデルが処理済みであるかどうかを確認する必要があります。