Гамбия |
DMX. Прогнозы
Сейчас мы подошли к одному из самых интересных этапов интеллектуального анализа - построению прогнозов. Как уже отмечалось в предыдущих разделах, задача прогнозирования в языке DMX также решается с помощью оператора SELECT. При этом чаще всего используется конструкция прогнозирующего соединения - PREDICTION JOIN. С ее помощью шаблонам модели сопоставляется набор данных из внешнего источника, что позволяет определить значение для прогнозируемого столбца.
Упрощенно это можно представить следующим образом. Модель содержит некоторое множество шаблонов, описывающих зависимость выходных параметров от входных. Например:
- Если Вход1=x, то Выход = "да"
- Если Вход1=y и Вход2=z, то Выход="нет"
- …
Для обработки модель получает входные данные из внешнего источника, определяет наиболее соответствующий шаблон и выдает результат. Например, входной вариант имеет атрибут "Вход1=x", применяя первое правило получаем "Выход = "да"".
Рассмотрим теперь синтаксис SELECT, использующийся для прогнозирующего соединения.
SELECT [FLATTENED] [TOP <n>] <select expression list> FROM <model> | <sub select> [NATURAL] PREDICTION JOIN <source data query> [ON <join mapping list>] [WHERE <condition expression>] [ORDER BY <expression> [DESC|ASC]]
где
n | целое число, указывающее количество возвращаемых строк; |
selectexpressionlist | разделенный запятыми список столбцов и/или выражений; |
model | название модели; |
subselect | внедренная (вложенная) инструкция SELECT; |
sourcedataquery | "исходный" запрос, описывающий набор данных, для которого производится прогнозирующее соединение. Исходный запрос для прогнозируемого соединения может представлять собой таблицу или одноэлементный запрос; |
joinmappinglist | логическое выражение включающее сравнения столбцов модели со столбцами, возвращаемыми запросом sourcedataquery; определяет условия соединения; |
conditionexpression | логическое выражение, ограничивающее множество возвращаемых значений, только теми, что соответствуют условию; условие WHERE можно применять только к прогнозируемым столбцам или к связанным столбцам; |
expression | выражение, определяющее упорядочение возвращаемого результата. ORDER BY может принять в качестве аргумента только один столбец, т. е. нельзя сортировать по нескольким столбцам. |
Предложение ON позволяет сопоставить столбцы исходного запроса со столбцами модели интеллектуального анализа данных (чтобы определить, какие значения рассматривать в качестве входных при прогнозировании). Столбцы в списке <joinmappinglist> соотносятся с помощью знака равенства (=), как показано в следующем примере:
[MiningModel].ColumnA = [source data query].Column1 AND [MiningModel].ColumnB = [source data query].Column2 AND ...
Инструкция NATURALPREDICTION JOIN автоматически сопоставляет имена столбцов исходного запроса, совпадающих с именами столбцов модели. В случае использования инструкции NATURALPREDICTION предложение ON можно пропустить.
В списке <selectexpressionlist> и выражении <conditionexpression> можно указывать прогнозирующие функции, не возвращающие табличного выражения.
Рассмотрим теперь несколько примеров построения прогнозов.
Одноэлементный запрос (прогноз в реальном времени)
Одноэлементным будем называть запрос, в котором исходные данные для прогнозирования не выбираются из источника, а явно указаны в тексте запроса. Такой запрос может формироваться "налету", например, на основе введенных пользователем данных и тут же выдавать результаты прогноза.
Ниже приведен пример подобного прогнозирующего запроса к модели [TMDecisionTree] для оценки того, станет ли покупателем велосипеда человек в возрасте 35 лет, проживающий в 2-5 милях от места работы, владеющий одним домом, двумя автомобилями,с двумя детьми в семье (значения перечислены в том порядке, как идут в листинге). Запрос возвращает прогнозируемое логическое значение столбца [BikeBuyer] и набор табличных значений, возвращенных функцией PredictHistogram, описывающих, как был сделан прогноз.
SELECT [TM Decision Tree].[Bike Buyer], PredictHistogram([Bike Buyer]) FROM [TM Decision Tree] NATURAL PREDICTION JOIN (SELECT 35 AS [Age], '5-10 Miles' AS [Commute Distance], '1' AS [House Owner Flag], 2 AS [Number Cars Owned], 2 AS [Total Children]) AS t
Здесь нужно отметить, что за счет использования конструкции NATURALPREDICTION JOIN определять соответствия между столбцами модели и набора входных данных не потребовалось.
Запрос с использованием функции OPENQUERY
В том случае, когда требуется сделать прогноз для множества вариантов, которые берутся из таблицы базы данных, можно использовать функцию OPENQUERY, аналогично тому, как это делалось при заполнении структуры. При этом предварительно требуется создать представление источника данных (например, с помощью BI DevStudio).
В приведенном ниже примере имена столбцов таблицы отличаются от имен столбцов, содержащихся в модели интеллектуального анализа данных, поэтому нужно использовать предложение ON. Запрос возвращает список имен ([FirstName])и фамилий ([LastName]) каждого человека в таблице [ProspectiveBuyer] наряду с логическим столбцом, указывающим на вероятность покупки им велосипеда, где 0 означает "вероятно, не будет покупать велосипед", а 1 означает "вероятно, купит велосипед". Последний столбец содержит значение вероятности прогнозируемого результата, возвращаемое функцией PredictProbability.
SELECT t.[LastName], t.[FirstName], [TM Decision Tree].[Bike Buyer], PredictProbability([Bike Buyer]) From [TM Decision Tree] PREDICTION JOIN OPENQUERY([Adventure Works DW2008R2], 'SELECT [LastName], [FirstName], [MaritalStatus], [Gender], [YearlyIncome], [TotalChildren], [NumberChildrenAtHome], [Education], [Occupation], [HouseOwnerFlag], [NumberCarsOwned] FROM [dbo].[ProspectiveBuyer] ') AS t ON [TM Decision Tree].[Marital Status] = t.[MaritalStatus] AND [TM Decision Tree].[Gender] = t.[Gender] AND [TM Decision Tree].[Yearly Income] = t.[YearlyIncome] AND [TM Decision Tree].[Total Children] = t.[TotalChildren] AND [TM Decision Tree].[Number Children At Home] = t.[NumberChildrenAtHome] AND [TM Decision Tree].[Education] = t.[Education] AND [TM Decision Tree].[Occupation] = t.[Occupation] AND [TM Decision Tree].[House Owner Flag] = t.[HouseOwnerFlag] AND [TM Decision Tree].[Number Cars Owned] = t.[NumberCarsOwned]
Использование функции Predict
Функция Predict возвращает спрогнозированное значение или набор значений для заданного столбца. Она является полиморфной и ее поведение зависит от того, подставляется ли скалярное значение (уровня вариантов) или ссылка на столбец страницы (т.е. вложенную таблицу). Синтаксис будет следующим:
Predict(<scalar column reference>, [option1], [option2], [option n], [INCLUDE_NODE_ID], n)
ИЛИ
Predict(<table column reference>, [option1], [option2], [option n], [INCLUDE_NODE_ID], n)
В то же время просто выбор прогнозируемого столбца в заголовке SELECT аналогичен вызову функции PREDICT с параметрами по умолчанию. Например, если при создании модели указано что столбец [Gender] (пол) - прогнозируемый, то SELECT [Gender] будет аналогично Predict([Gender], EXCLUDE_NULL). Где опция EXCLUDE_NULL указывает на то, что пустые значения исключаются.
Более подробно с возможностями функции PREDICT можно ознакомиться в справочнике по функциям расширений интеллектуального анализа данных [13].
Прогнозирование наиболее вероятного значения
Если использовать следующий синтаксис оператора SELECT
SELECT <expression list> [TOP <n>] FROM <model> [WHERE <condition list>] [ORDER BY <expression> [DESC|ASC]]
и в списке <expressionlist> указать только прогнозируемые столбцы, то оператор выполнит пустое прогнозируемое соединение и возвратит наиболее вероятные значения для указанных столбцов. Для создания прогноза используется только содержимое модели интеллектуального анализа данных.
Например:
SELECT ([Bike Buyer]) FROM [TM_Naive_Bayes]
выдаст наиболее часто встречающееся значение столбца [BikeBuyer].
Создание копии модели - оператор SELECT INTO
В заключение обзора возможностей оператора SELECT рассмотрим создание копии существующей модели интеллектуального анализа данных. Для этого используется синтаксис:
SELECT INTO <new model> USING <algorithm> [(<parameter list>)] [WITH DRILLTHROUGH[,] [FILTER(<expression>)]] FROM <existingmodel>
где
newmodel | имя для новой создаваемой модели; |
algorithm | название используемого новой моделью алгоритма интеллектуального анализа данных; |
parameterlist | cписок через запятую параметров алгоритма; |
expression | выражение, определяющее фильтр для значений, попадающих в новую модель; |
existingmodel | имя существующей модели для копирования. |
Если существующая модель является обученной, новая модель автоматически обрабатывается при выполнении этой инструкции. В противном случае новая модель оставляется необработанной.
Например, приведенный ниже фрагмент кода создает новую модель [New_Clustering] на базе существующей модели интеллектуального анализа данных [TMClustering]. В обоих случаях используется алгоритм кластеризации. Но в новой модели параметр CLUSTER_COUNT изменяется так, чтобы существовало максимум пять кластеров, тогда как значение по умолчанию равно 10.
SELECT * INTO [New_Clustering] USING [Microsoft_Clustering] (CLUSTER_COUNT = 5) FROM [TM Clustering]