Prediction Queries (Data Mining)
適用対象:SQL Server 2019 以前の Analysis Services Azure Analysis Services Fabric/Power BI Premium
重要
データ マイニングは SQL Server 2017 Analysis Services で非推奨となり、SQL Server 2022 Analysis Services で停止されました。 非推奨および停止された機能については、ドキュメントの更新は行われません。 詳細については、「Analysis Services 下位互換性」を参照してください。
一般的なデータ マイニング プロジェクトの目標は、マイニング モデルを使用して予測を行うことです。 たとえば、あるサーバーの集まりのダウンタイムを予測したり、顧客区分が広告キャンペーンに反応するかどうかを示すスコアを生成したりする場合があります。 これらすべてを行うには、予測クエリを作成します。
クエリに対する入力の種類に応じて、さまざまな機能の予測クエリが SQL Server でサポートされています。
クエリの型 | [クエリ オプション] |
---|---|
単一予測クエリ | 1 つまたは複数の新しいケースについて結果を予測する場合に、単一クエリを使用します。 入力値をクエリに直接指定し、クエリは単一セッションとして実行されます。 |
バッチ予測 | 外部データをモデルに供給して、予測のベースとして使用するときは、バッチ予測を使用します。 データ全体について予測するには、外部ソースのデータをモデルの列にマップしてから、出力する予測データの種類を指定します。 データセット全体のクエリが単一セッションで実行され、複数のクエリを繰り返すよりも効率が高くなります。 |
時系列予測 | いくつかの期間に対して値を予測するときは、時系列クエリを使用します。 SQL Server データ マイニングでは、時系列クエリに次の機能も用意されています。 新しいデータをクエリの一部として追加して、既存のモデルを拡張し、複合系列に基づいて予測を行うことができます。 REPLACE_MODEL_CASES オプションを使用して既存のモデルを新しいデータ系列に適用できます。 クロス予測を実行することができます。 |
以下の各セクションで、予測クエリの一般的構文、さまざまな種類の予測クエリ、および予測クエリの結果の操作方法について説明していきます。
予測クエリの基本デザイン
予測を作成するときには、モデルに新しいデータを渡して、その新しいデータに基づいて予測を生成するように要求するのが一般的です。
バッチ予測クエリでは、 予測結合を使用してモデルを外部ソースのデータにマップします。
単一予測クエリでは、入力として使用する 1 つ以上の値を入力します。 単一予測クエリを使用して複数の予測を作成することができます。 ただし、多数の予測を作成する必要がある場合は、バッチ クエリを使用するとパフォーマンスが向上します。
単一クエリとバッチ予測クエリの両方で、PREDICTION JOIN 構文を使用して新規データを定義します。 違いは、予測結合の入力側の指定方法です。
バッチ予測クエリでは、データは OPENQUERY 構文を使用して指定する外部データ ソースから提供されます。
単一予測クエリでは、データはクエリの一部としてインラインで提供されます。
時系列モデルの場合、入力データは常に必要となるわけではありません。モデルに既に含まれるデータのみを使用して予測することができます。 ただし、新しい入力データを指定した場合は、新しいデータ更新を使用してモデルを更新して拡張するか、モデルで使用されていた元の系列データを置換するかを決定する必要があります。 これらのオプションの詳細については、「 Time Series Model Query Examples」をご覧ください。
予測関数の追加
予測クエリをカスタマイズすると、値を予測するだけでなく、その予測に関連するさまざまな種類の情報を取得することができます。 たとえば、予測によりある顧客に推奨する製品の一覧を作成する場合、各予測が当たる確率を取得するのも良いでしょう。各予測をランク付けし、上位の推奨品だけをその顧客に勧めます。
これを行うには、クエリに 予測関数 を追加します。 サポートされる関数は、モデルやクエリの種類ごとに決まっています。 たとえばクラスター モデルでは、モデルによって作成されたクラスターに関する追加情報を提供する特殊な予測関数がサポートされています。一方、タイム シリーズ モデルには、時間経過に伴って生じる違いを計算する関数があります。 ほぼすべての種類のモデルで使用できる汎用の予測関数もあります。 さまざまな種類のクエリでサポートされる予測関数の一覧については、DMX リファレンスの 「General Prediction Functions (DMX)」を参照してください。
単一予測クエリの作成
単一予測クエリは、予測をリアルタイムですぐに作成する場合に便利です。 一般的な使用手順としては、Web サイトのフォームを使用して顧客から情報を取得し、そのデータを入力として単一予測クエリに提出します。 たとえば、顧客が一覧から製品を選択すると、その選択内容を、お勧め製品を予測するクエリの入力として使用できます。
単一予測クエリには、入力を格納する独立したテーブルは必要ありません。 代わりに、入力として 1 行以上の値をモデルに提供し、1 件以上の予測をリアルタイムに取得します。
警告
名前にもかかわらず、シングルトン予測クエリは単一の予測を行うだけでなく、入力セットごとに複数の予測を生成できます。 入力ケースごとに SELECT ステートメントを作成し、それらを UNION 演算子で組み合わせて、複数の入力ケースを指定します。
単一予測クエリを作成するときには、新しいデータを PREDICTION JOIN の形式でモデルに渡す必要があります。 したがって、実際のテーブルにマップするわけではなくても、新しいデータをマイニング モデルの既存の列に必ず一致させる必要があります。 新しいデータ列と新しいデータが正確に一致する場合、SQL Server Analysis Servicesによって列がマップされます。 これを NATURAL PREDICTION JOINと呼びます。 一方、列が一致しない場合 (モデルに含まれているのと同じ種類および量のデータが新しいデータに含まれていない場合) は、モデルのどの列を新しいデータにマップするのかを指定するか、不足値を指定する必要があります。
バッチ予測クエリ
バッチ予測クエリが役立つのは、予測の作成に使用できる外部データがある場合です。 たとえば、オンラインでの操作と購入履歴に基づいて顧客を分類するモデルを構築したとします。 このモデルを、新しく獲得した見込み客の一覧に適用すると、売上予測の作成、または提案されたキャンペーンの目標設定を行うことができます。
予測結合を実行するときは、モデルの列を新しいデータ ソースの列にマップする必要があります。 このため、入力用に選択するデータ ソースは、モデルのデータと類似したデータである必要があります。 新しい情報は、厳密に一致する必要はなく、完全でなくてもかまいません。 たとえば、モデルが所得と年齢に関する情報を使用してトレーニングされ、予測に使用する顧客リストには年齢情報があり、所得に関する情報はないとします。 この状況でも、新しいデータをモデルにマップし、各顧客の予測を作成できます。 ただし、所得がモデルの重要な予測子である場合、完全な情報がないことは予測の品質に影響します。
最良の結果を得るためには、新しいデータとモデルの間で一致する列をできるだけ多く結合する必要があります。 ただし、一致する列がなくてもクエリは成功します。 結合されている列がない場合は、マージナル予測が返されます。これは、PREDICTION JOIN 句を含まない SELECT <predictable-column> FROM <model>
ステートメントと同じです。
関連するすべての列を正常にマップしたら、クエリを実行し、SQL Server Analysis Servicesモデルのパターンに基づいて新しいデータの各行の予測を行います。 外部データを含むデータ ソース ビューの新しいテーブルに結果を保存するか、SQL Server Data ToolsまたはSQL Server Management Studioを使用しているデータをコピーして貼り付けることができます。
警告
SQL Server Data Toolsでデザイナーを使用する場合は、まず外部データ ソースをデータ ソース ビューとして定義する必要があります。
DMX を使用して予測結合を作成する場合は、OPENQUERY、OPENROWSET、または SHAPE の各コマンドを使用して外部データ ソースを指定できます。 DMX テンプレートの既定のデータ アクセス メソッドは OPENQUERY です。 これらのメソッドの詳細については、「ソース データ クエリ>」を参照してください<。
時系列マイニング モデルの予測
時系列モデルは他の種類のモデルとは異なります。モデルをそのまま使用して予測を作成することも、モデルに新しいデータを渡し、モデルを更新して、最新の傾向に基づいて予測を作成することもできます。 新しいデータを追加する場合は、新しいデータの使用方法を指定できます。
モデル ケースの拡張 では、時系列モデルの既存のデータ系列に新しいデータを追加します。 その後、新しい組み合わせの系列に基づいて予測が行われます。 このオプションは、既存のモデルに追加するデータ ポイントが少ないときに適しています。
たとえば、前年の売上データでトレーニングされた既存の時系列モデルがあったとします。 新しい売上データを数か月にわたって収集した後、現在の年の売上予測を更新します。 この場合は、予測結合を作成して、新しいデータを追加してモデルを更新し、新しい予測が行われるようにモデルを拡張します。
モデル ケースの置換 では、トレーニング済みのモデルは保持されますが、基になるケースが新しいケース データのセットで置換されます。 モデルの傾向を維持して、別のデータ系列に適用するときは、このオプションが便利です。
たとえば、元のモデルが、売上高が非常に高いデータ セットでトレーニングされたとします。新しい系列 (売上高が低い店舗のデータ) で元のデータを置換すると、傾向は保持されますが、置換系列の値に基づいた予測が開始されます。
どちらの方法を使用する場合も、予測の開始位置は常に元の系列の末尾になります。
時系列モデルで予測結合を作成する方法の詳細については、「 時系列モデル クエリの例 」または「 PredictTimeSeries (DMX)」を参照してください。
予測クエリの結果の操作
データ マイニング予測クエリの結果を保存するオプションは、クエリの作成方法に応じて異なります。
SQL Server Management StudioまたはSQL Server Data Toolsのいずれかで予測クエリ ビルダーを使用してクエリを作成する場合は、予測クエリの結果を既存のSQL Server Analysis Services データ ソースに保存できます。 詳しくは、「 予測クエリの結果の表示および保存」をご覧ください。
SQL Server Management Studioの [クエリ] ペインで DMX を使用して予測クエリを作成する場合は、クエリ出力オプションを使用して、結果をファイルまたはクエリ結果ペインにテキストまたはグリッドとして保存できます。 詳細については、「クエリ エディターとテキスト エディター (SQL Server Management Studio)」を参照してください。
Integration Services コンポーネントを使用して予測クエリを実行する場合、タスクでは、使用可能な ADO.NET 接続マネージャーまたは OLEDB 接続マネージャーを使用して結果をデータベースに書き込む機能が提供されます。 詳細については、「 Data Mining Query Task」をご参照ください。
予測クエリの結果は、関連する値の単一行を常に返すリレーショナル データベースに対するクエリの結果とは異なることに注意してください。 クエリに追加した DMX 予測関数からそれぞれ独自の行セットが返されます。 このため、単一のケースについて予測を行った結果、予測値と共に、入れ子になったテーブルの複数列が返され、余分な詳細が含まれていることもあります。
1 つのクエリで複数の関数を組み合わせて使用した場合、返される結果は常に階層的な行セットとして結合されます。 たとえば、次の DMX ステートメントのようなクエリを使用して、タイム シリーズ モデルを使用して売上高と販売数量の将来の値を予測するとします。
SELECT
PredictTimeSeries([Forecasting].[Amount]) as [PredictedAmount]
, PredictTimeSeries([Forecasting].[Quantity]) as [PredictedQty]
FROM
[Forecasting]
このクエリの結果には 2 つの列 (予測値を格納する入れ子になったテーブルを各行に含む予測系列ごとに 1 つの列) があります。
PredictedAmount
$TIME | Amount |
---|---|
201101 | 172067.11 |
$TIME | Amount |
---|---|
201102 | 363390.68 |
PredictedQty
$TIME | Quantity |
---|---|
201101 | 77 |
$TIME | Quantity |
---|---|
201102 | 260 |
階層的な行セットを処理できないプロバイダーを使用している場合は、予測クエリ内で FLATTEN キーワードを使用して結果をフラット化することができます。 フラット化された行セットの例など、詳細については、「 SELECT (DMX)」を参照してください。