Настоящая статья является продолжением серии, описывающей IBM Netezza In-Database Analytics на Python. В первой статье была описана установка пакета nzpyida и использование двух его основных компонентов: IdaDataBase и IdaDataFrame. Также было показано, как установить очень полезный инструмент для запуска кода Python под названием Jupyter Notebook. Обладая этими знаниями, теперь мы можем сосредоточиться на анализе базы данных.

Установление соединения с базой данных (напоминание)

Эта тема уже объяснялась в предыдущей статье, поэтому напоминаем, что нам нужен Netezza Server с установленным Netezza Analytics и базой данных, поддерживающей аналитику. Нам также понадобится Jupyter Notebook и nzpyida, установленные в среде Python 3 на рабочей станции.

Соединение с сервером из блокнота должно быть установлено с помощью класса IdaDataBase и сохранено в переменной — назовем ее idadb. Кроме того, нам следует импортировать некоторые важные классы, чтобы избежать повторения этого много раз в будущем. Вот пример кода, который должен быть в начале нашего блокнота:

from nzpyida import IdaDataBase, IdaDataFrame
nzpy_cfg = _SET_YOU_DATABASE_CONFIG_HERE_
idadb = IdaDataBase(nzpy_cfg)

Если вы не знаете, что здесь происходит, читайте предыдущую статью.

В противном случае давайте перейдем в мир аналитики!

Возвращение IdaDataFrame

Прежде чем углубляться в функции обработки данных, давайте рассмотрим один важный аспект этого API — возврат результатов в виде объекта IdaDataFrame.

Каждый IdaDataFrame поддерживается каким-либо объектом в базе данных — это может быть таблица или представление. Если этот объект будет удален, фрейм данных станет недействительным, и попытка его вызова вызовет исключение. Это означает, что функции, которые возвращают новые наборы данных (например, гистограмму входной таблицы прогнозов, сделанных на основе модели и входных данных), не могут просто создавать и возвращать экземпляр класса IdaDataFrame — они также должны создавать стол. Каков должен быть жизненный цикл такой таблицы?

Есть два варианта:

1. Мы хотим, чтобы таблица результатов была доступна в течение некоторого времени или чтобы к ней можно было получить доступ из SQL, возможно, из-за пределов кода Python.

2. Нас не волнует таблица, нам просто нужен фрейм данных в Python для ее обработки (например, использования его в качестве входных данных для другой функции, расчета некоторых условий и отображения результатов или извлечения и преобразования данных в другой формат). )

В первом случае мы хотели бы назвать создаваемую таблицу, чтобы позже мы могли получить к ней доступ по этому имени, используя SQL или создав другой IdaDataFrame. Когда таблица перестанет быть нужна, мы удалим ее вручную. Чтобы использовать эту опцию, мы обычно передаем имя создаваемой таблицы с помощью параметра функции out_table.

Например, предположим, что мы хотим получить выборку из 10 % строк из таблицы IRIS (которую мы создали в предыдущей статье), представленной фреймом данных idadf, и сохраните результаты в таблице iris_sample. Вот код:

from nzpyida.analytics import random_sample
idadf = IdaDataFrame(idadb, 'IRIS')
res = random_sample (idadf, fraction=0.10, out_table='iris_sample')

Таблица iris_sample не будет удалена автоматически — мы обязаны сделать это, когда она больше не понадобится.

Во втором случае нам не нужно знать имя таблицы, и мы не хотим заморачиваться с ее удалением. Чтобы это работало, вызов функции должен быть обернут контекстным менеджером AutoDeleteContext. Реализация обнаруживает, что функция вызывается внутри контекстного менеджера AutoDeleteContext, и генерирует новое имя для таблицы результатов, которое затем регистрируется в менеджере. При выходе из контекста менеджер удаляет все зарегистрированные в нем таблицы. Это применимо только к таблицам с сгенерированными именами — если в вызове функции используется параметр out_table с именем таблицы, AutoDeleteContext не удалит эту таблицу.

Вот пример кода:

from nzpyida.analytics import random_sample, AutoDeleteContext
idadf = IdaDataFrame(idadb, 'IRIS')
with AutoDeleteContext(idadb):
  res = random_sample (idadf, fraction=0.10)
  # use res data frame here, but not outside of the context

Обязательно либо укажите имя таблицы результатов с помощью параметра out_table, либо вызовите функцию внутри AutoDeleteContext — в противном случае возникает исключение.

Для простоты предположим, что AutoDeleteContext импортирован в Python. Мы можем добиться этого, добавив эту строку в код, где было установлено соединение с базой данных и назначена переменная idadb:

from nzpyida.analytics import AutoDeleteContext

Исследование данных

Базовые функции для исследования данных включены в класс IdaDataFrame — он был описан в предыдущей статье. Существует также расширенный набор функций, доступных в виде глобальных функций. Эти функции обычно получают на входе кадр данных и набор параметров и возвращают новый кадр данных с запрошенными данными. Например, вот пример кода для расчета и печати 50 и 90 квантилей столбца sepal_width кадра данных IDADF:

from nzpyida.analytics import quantile
idadf = IdaDataFrame(idadb, 'IRIS')
with AutoDeleteContext(idadb):
  quan_df = quantile(idadf, in_column='sepal_width', quantiles=[0.5,0.9])
  print(quan_df.as_dataframe())

Другая интересная функция вычисляет различные описательные статистические данные, такие как среднее, минимальное, максимальное, стандартное отклонение и дисперсию, для данного столбца с данными, сгруппированными по другому столбцу:

from nzpyida.analytics import moments
idadf = IdaDataFrame(idadb, 'IRIS')
with AutoDeleteContext(idadb):
  ret = moments(idadf, in_column='sepal_width', by_column='species')
  print(ret.as_dataframe())

Результат выглядит следующим образом:

    COLUMNNAME  COUNTT  AVERAGE  VARIANCE    STDDEV  SKEWNESS  KURTOSIS   
0  sepal_width      50    2.974  0.104004  0.322497  0.351311  0.449371  \
1  sepal_width      50    2.770  0.098469  0.313798 -0.348331 -0.499306   
2  sepal_width      50    3.428  0.143690  0.379064  0.039520  0.669337   

   MINIMUM  MAXIMUM     species  
0      2.2      3.8   virginica  
1      2.0      3.4  versicolor  
2      2.3      4.4      setosa

Другие функции исследования данных позволяют вычислять:

Распределение данных:

  • Выбросы
  • Одномерная и двумерная частота
  • Гистограмма

Идентификация связи столбцов:

  • Корреляция Пирсона, Спирмена и каноническая корреляция
  • Ковариация
  • Взаимная информация
  • Тест хи-квадрат
  • Т-тест
  • Тест Манна-Уитни-Уилкоксона
  • Тест Уилкоксона
  • Дисперсионный анализ и МАНОВА

Преобразование данных

Другая группа функций отвечает за подготовку данных для использования в аналитике. Одной из рассматриваемых тем является дискретизация. Его можно использовать, когда мы хотим уменьшить количество возможных значений некоторой метрики, разделив весь диапазон на некоторое количество бинов и затем заменив значения идентификаторами этих бинов. Существует несколько способов найти границы интервала:

  • Учитывая количество бункеров с одинаковой шириной каждого бункера
  • Учитывая количество ячеек с одинаковой частотой данных в каждой ячейке
  • Минимизация энтропии данных в каждом контейнере

Если необходимо дискретизировать несколько столбцов таблицы, каждый из них может иметь свои ячейки.

Вот вам пример:

from nzpyida.analytics import EWDisc
idadf = IdaDataFrame(idadb, 'IRIS')
with AutoDeleteContext(idadb):
  disc = EWDisc(idadb, bins=5)
  bins = disc.fit(idadf[['sepal_length', 'sepal_width']])
  idadf_discr = disc.apply(idadf, bins)
  print(idadf_discr.as_dataframe())

Этот код использует дискретизацию одинаковой ширины (EWDisc) для двух столбцов данного кадра данных. Сначала вызывается функция fit, которая вычисляет и возвращает границы интервалов. Затем функция apply использует ранее вычисленные интервалы и применяет дискретизацию к кадру данных. Различение создания и применения бинов позволяет повторить операцию с тем же набором бинов в другом кадре данных (но, очевидно, он должен содержать тот же набор столбцов для дискретизации).

И вот как это работает на практике. Первые несколько строк во фрейме входных данных выглядят следующим образом:

      ID  sepal_length  sepal_width  petal_length  petal_width     species
0      0           5.9          3.0           5.1          1.8   virginica
1      1           6.3          3.3           6.0          2.5   virginica
2      2           5.7          2.8           4.1          1.3  versicolor
3      3           5.1          2.5           3.0          1.1  versicolor
4      4           6.2          2.9           4.3          1.3  versicolor
145 rows (skipped)

Сгенерированные диапазоны ячеек:

        COLNAME  BREAK
0  sepal_length   5.02
1  sepal_length   5.74
2  sepal_length   6.46
3  sepal_length   7.18
4   sepal_width   2.48
5   sepal_width   2.96
6   sepal_width   3.44
7   sepal_width   3.92

Таблица результатов выглядит следующим образом:

      ID sepal_length sepal_width  petal_length  petal_width     species
0      0            3           3           5.1          1.8   virginica
1      1            3           3           6.0          2.5   virginica
2      2            2           2           4.1          1.3  versicolor
3      3            2           2           3.0          1.1  versicolor
4      4            3           2           4.3          1.3  versicolor
145 rows (skipped)

Обратите внимание, что были изменены только данные для дискретных столбцов.

Еще одна полезная функция — train_test_split, которая позволяет разделить кадр входных данных на обучающую и тестовую части. Его использование очень просто:

from nzpyida.analytics import train_test_split
with AutoDeleteContext(idadb):
  train_df, test_df = train_test_split(idadf, fraction=0.8, id_column='ID')

Код разделяет idadf на train_df и test_df, присваивая 80 % первому и оставшиеся 20 % второму фрейму данных. Если по какой-то причине нам необходим доступ к таблицам результатов, вместо использования AutoDeleteContext мы должны явно назвать выходные таблицы:

train_df, test_df = train_test_split(idadf, fraction=0.8, out_table_train='train_data', out_table_test='test_data', id_column='ID')

Другие функции подготовки используются для:

  • Стандартизация и нормализация
  • Вменение отсутствующих значений — для выбранных столбцов (возможно, всех) найдите недостающие точки данных и замените их средним, медианным, наиболее частым или заданным значением.
  • Случайная выборка — извлечение заданной части кадра данных в новый кадр данных (например, 10%).

Вызов аналитики

nzpyida содержит классы, реализующие несколько категорий прогнозной аналитики. Сюда входят классификация, регрессия, кластеризация, временные ряды и другие алгоритмы. И хотя каждый алгоритм различен, интерфейс их вызова схож. Чтобы понять это, давайте посмотрим на пример проблемы, которую можно решить с помощью алгоритма классификации, называемого деревом решений.

Определение проблемы

Вот в чем проблема: мы работаем на оператора телекоммуникационной сети и получили задание поддержать процесс обнаружения мошенничества с использованием расширенной аналитики. SIM-бокс — это устройство, на котором размещена одна или несколько SIM-карт, подключено к Интернету и может туннелировать вызовы между мобильной сетью через Интернет (голос через IP) к другому SIM-боксу и, наконец, ко второй мобильной сети. Таким образом, международный (дорогой) звонок становится местным (дешевым или бесплатным) звонком (+ небольшая плата тому, кто владеет этими SIM-боксами). Похоже, это хороший бизнес! — но не для телекоммуникационных компаний. Они рассматривают такие процедуры как мошенничество и делают все возможное, чтобы обнаружить и блокировать задействованные SIM-карты.

Мы хотим улучшить процесс обнаружения SIM-боксов, который сейчас осуществляется менее сложными (ручными) методами. Для достижения цели мы хотим использовать набор данных из прошлого, описывающий поведение абонентов сети (или просто SIM-карт). Сюда входит статистическая информация о каждом абоненте за определенный период, такая как среднее количество совершенных и принятых вызовов в час, средняя продолжительность вызова, количество набранных различных телефонных номеров, соотношение совершенных и принятых вызовов, среднее значение количество совершенных и принятых международных звонков в час, среднее количество используемых базовых станций (BTS) в день и другие.

В дополнение к этой статистике нам также необходимо знать, какие SIM-карты были идентифицированы как SIM-боксы. При этом мы хотим иметь возможность классифицировать SIM-карту как SIM-бокс или «обычную» карту на основе ее поведения (выраженного в статистике, как описано выше). Для этого мы хотим создать модель классификации и использовать методы обучения с учителем, чтобы научить ее распознавать SIM-боксы на основе прошлых данных, описывающих поведение SIM-карты, а затем использовать эту модель для распознавания SIM-боксов в новых наборах данных.

Данные для процесса обучения уже подготовлены и сохранены в таблице TRAINING_DATA в Netezza. Вот структура этой таблицы:

CREATE TABLE TRAINING_DATA
(
 "IMSI"                               INTEGER,
 "AVG_DAILY_MSISDNS_CALLED"           FLOAT,
 "MSISDNS_TO_ALL_CALL"                FLOAT,
 "MT_AVG_DAILY_ALL_CALL_DURATION"     FLOAT,
 "MT_AVG_DAILY_CALL_COUNT"            FLOAT,
 "MT_AVG_CALL_DURATION"               FLOAT,
 "MO_AVG_DAILY_ALL_CALL_DURATION"     FLOAT,
 "MO_AVG_DAILY_CALL_COUNT"            FLOAT,
 "MO_AVG_CALL_DURATION"               FLOAT,
 "INTERN_AVG_DAILY_ALL_CALL_DURATION" FLOAT,
 "INTERN_AVG_DAILY_CALL_COUNT"        FLOAT,
 "INTERN_AVG_CALL_DURATION"           FLOAT,
 "AVG_DAILY_LOCATIONS"                FLOAT,
 "CALLS_TO_LOCATIONS"                 FLOAT,
 "MO_CALLS_TO_MT_CALLS"               FLOAT,
 "INTERN_TO_ALL_CALLS"                FLOAT,
 "IMSI_PER_CUST"                      BIGINT, 
 "TRUSTED"                            INTEGER,
 "IS_FRAUD"                           CHARACTER VARYING(1)
 )

Каждая строка содержит описание одной SIM-карты. Значение столбца IMSI однозначно идентифицирует SIM-карту. Следующий набор столбцов типа FLOAT содержит статистику SIM-карты, рассчитанную за заданный период (скажем, 3 месяца). Для именования этих столбцов используются следующие сокращения: MT = входящие вызовы с мобильных устройств (входящие вызовы), MO = исходящие вызовы с мобильных устройств (совершенные вызовы), INTERN = международные звонки и LOCATIONS = местоположение BTS. IMSI_PER_CUST показывает количество SIM-карт, принадлежащих одному клиенту. TRUSTED позволяет пропускать доверенные SIM-карты, включая специальных «доверенных» клиентов, а также внутренние устройства и датчики (которые по своей конструкции могут вести себя странно), которые не должны распознаваться как SIM-боксы. Наконец, IS_FRAUD сообщает нам, была ли данная SIM-карта распознана как SIM-бокс (значение 1) или нет (значение 0).

Как загрузить образец набора данных

Если вы хотите запустить код из этой статьи, вам необходимо загрузить пример набора данных в Netezza. Файл данных можно скачать по этому адресу:

https://www.kaggle.com/datasets/marcinlabenski/imsi-stats

В базе данных, поддерживающей INZA, создайте таблицу с именем PAST_DATA. Вы можете использовать оператор CREATE TABLE, представленный выше. Просто измените имя таблицы с TRAINING_DATA на PAST_DATA.

После копирования файла в вашу систему Netezza войдите в эту систему, распакуйте и загрузите данные (замените MYDBNAME на имя вашей базы данных):

unzip archive.zip
nzload -df imsi_stats.csv -t PAST_DATA -db MYDBNAME -skipRows 1 -delim "|"

Вы также можете загрузить данные удаленно. В этом случае вам все равно потребуется установить утилиту nzload (из клиента Netezza для вашей операционной системы) и использовать команду, аналогичную приведенной выше, но с именем хоста Netezza (-host). , добавлены порт (-port), имя пользователя (-u) и пароль (-pw).

Теперь давайте разделим таблицу PAST_DATA на обучающий и тестовый наборы, используя функцию Python train_test_split, описанную ранее:

idadf = IdaDataFrame(idadb, 'PAST_DATA', indexer='IMSI')
from nzpyida.analytics import train_test_split
train_test_split(idadf,fraction=0.8, out_table_train='TRAINING_DATA', out_table_test='TEST_DATA')

Чтобы создать таблицу NEW_DATA, давайте просто возьмем 10 % от PAST_DATA и удалим столбец IS_FRAUD:

from nzpyida.analytics import random_sample
idadf = IdaDataFrame(idadb, 'PAST_DATA', indexer='IMSI')
del idadf['IS_FRAUD']
random_sample(idadf, fraction=0.1, out_table='NEW_DATA')

Решение

Чтобы использовать данные в качестве входных данных для аналитики, давайте представим таблицу TRAINING_DATA как объект IdaDataFrame:

train_df = IdaDataFrame(idadb, 'TRAINING_DATA', indexer='IMSI')

На этом этапе все должно быть ясно. Мы создали фрейм данных train_df, который указывает на таблицу TRAINING_DATA в базе данных, подключенной через объект idadb. Столбец, идентифицирующий строки в таблице, называется IMSI.

Давайте воспользуемся хорошо известным алгоритмом классификации, называемым деревом решений. На основе набора входных данных алгоритм строит двоичное дерево, в котором каждый внутренний узел содержит условие для входного столбца (например, это может быть что-то вроде CALLS_TO_LOCATIONS › 5), а две вершины представляют условие результаты оценки (TRUE или FALSE), соединяющие узел с двумя дочерними узлами. Листья этого дерева дают итоговую оценку: 1 для SIM-боксов и 0 для остальных.

Вот как мы можем построить такое дерево в коде Python:

from nzpyida.analytics import DecisionTreeClassifier
model = DecisionTreeClassifier(idadb, model_name='simbox_predict')
model.fit(in_df=train_df, target_column='IS_FRAUD', eval_measure='gini', min_improve=0, min_split=200)

Вторая строка создает объект, который представляет модель классификатора дерева решений, хранящуюся в базе данных. Конструктор ожидает подключение к базе данных и имя модели. Модель может существовать, а может и не существовать. В первом случае мы могли бы сразу использовать его для прогнозов. В последнем случае нам нужно создать его, запустив процесс обучения. Если мы попытаемся запустить процесс обучения существующей модели, она будет переобучена и перезаписана.

Третья линия проводит обучение. Входные данные поступают из фрейма данных train_df. Большинство алгоритмов прогнозирования требуют, чтобы кадр входных данных имел уникальный идентификатор строки. Его можно указать как параметр id_column (например, id_column='imsi') или, если этот параметр опущен, как в примере выше, столбец индексатора фрейма данных. будет использован. Если id_column опущен и индексатор не определен, выдается исключение.

Чтобы выполнить контролируемое обучение, нам нужно знать имя целевого столбца. В нашем случае это столбец, в котором хранится информация о том, является ли данная SIM-карта SIM-боксом — это столбец IS_FRAUD, а его имя задается в конструкторе в target_column параметр.

По умолчанию в процесс обучения включаются все столбцы таблицы, кроме идентификатора строки и целевого столбца. Их называют функциями. Мы можем настроить функции, используя параметр in_columns со списком, в котором указана роль каждого столбца. Это позволяет нам игнорировать столбцы, которые мы не хотим использовать. Другие параметры, eval_measure, min_improve и min_split, настраивают алгоритм классификации дерева решений.

Когда метод fit завершается без ошибок, процесс обучения завершается, и в базе данных создается модель. Но хорошая ли это модель, дающая качественные прогнозы? Если бы у нас было больше «известных» данных, мы могли бы попытаться сделать прогнозы на основе модели, а затем сравнить их с фактическими результатами, суммируя результаты как одно число от 0 до 1, где 0 означает отсутствие совпадения (ужасное качество модели) и 1 идеально подходит (качественная модель). Этот процесс называется скорингом модели.

test_df = IdaDataFrame(idadb, 'TEST_DATA', indexer='IMSI')
print(model.score(in_df=test_df, target_column='IS_FRAUD'))

Приведенный выше код должен печатать одно число, например 0,9998.

Более подробную информацию о качестве модели возвращает функция conf_matrix(). Он возвращает таблицу, в которой для каждого целевого значения указано количество правильных и неправильных прогнозов.

with AutoDeleteContext(idadb):
  mat, _, _ = model.conf_matrix(in_df=test_df, target_column='IS_FRAUD')
  print(mat.as_dataframe())

Результат:

  REAL PREDICTION     CNT
0    1          0      11
1    0          1      14
2    1          1     182
3    0          0  197993

Если оценка низкая, нам следует попробовать изменить параметры алгоритма, определить другой набор функций или использовать другой алгоритм или комбинацию алгоритмов. В противном случае мы готовы прогнозировать новые и неизвестные данные. Предположим, что новые строки хранятся в таблице NEW_DATA. И на этот раз мы не знаем, какая SIM-карта является SIM-боксом (а не столбцом IS_FRAUD), поскольку именно это мы и хотим предсказать.

Самый простой способ сделать это выглядит так:

pred_df = IdaDataFrame(idadb, 'NEW_DATA') 
with AutoDeleteContext(idadb):
  res_df = model.predict(in_df=pred_df) 
  # Put your code to use res_df here

Первая строка создает фрейм данных для таблицы NEW_DATA. Таблица должна содержать тот же набор столбцов, выбранных в качестве функций, используемых для обучения модели. Конечно, нет необходимости в целевом столбце, поскольку это значение, которое мы должны спрогнозировать.

Также нет необходимости отмечать индексатор или идентификатор строки, поскольку обязательно использовать тот же столбец, который использовался для обучения.

Вторая строка создает контекстный менеджер. Это необходимо, поскольку прогнозы возвращаются в кадре данных. Альтернативно мы могли бы использовать параметр out_table метода predict.

Третья строка делает прогнозы для объектов из pred_df и возвращает объект IdaDataFrame с результатами. Каждая строка этого фрейма данных представляет SIM-карту из pred_df. Кадр данных имеет два столбца: ID с идентификатором строки — в нашем случае это значение IMSI из входных данных, и CLASS с прогнозируемым значением — в нашем случае 1 для SIM-бокса и 0 для остальных, т.к. такая кодировка использовалась для обучения.

Теперь мы можем использовать фрейм данных в нашем коде Python. Временная таблица, созданная для хранения прогнозов, будет автоматически удалена при выходе из контекста, определенного с помощью оператора with. Если нам также необходимо получить доступ к таблице непосредственно из SQL, вместо использования AutoDeleteContext мы должны установить параметр out_table метода прогнозирования и явно назвать таблицу, которая будет создана (это было объяснено в начале статьи). В этом случае мы также несем ответственность за удаление таблицы, если она больше не используется. Предполагая, что мы назвали эту таблицу RESULTS, это можно сделать с помощью следующего кода:

idadb.drop_table('RESULTS')

Наконец, давайте сохраним список подозрительных SIM-карт в файле. Следующий код должен располагаться под комментарием «Разместите здесь свой код для использования res_df»:

res_df[res_df['CLASS']==1]['ID'].as_dataframe().to_csv('suspected_sim_boxes.csv', header=False, index=False)

Вот что мы делаем: берем кадр данных результата прогнозирования и включаем только строки с CLASS==1 (другими словами SIM-боксы), выбираем только столбец ID ( со значением IMSI, идентифицирующим SIM-карту), преобразовать IdaDataFrame в фрейм данных Pandas (на этом этапе данные извлекаются с сервера базы данных) и, наконец, сохранить содержимое этого фрейма данных в файл с именем suspected_sim_boxes.csv. Первые 5 строк файла могут выглядеть так:

3009230
9000217
9000260
9000382
9000409

ПРИМЕЧАНИЕ. Если ваша Netezza была инициализирована с идентификаторами в нижнем регистре, столбцы в таблице прогнозирования имеют имена в нижнем регистре: class и id, и их необходимо использовать в этом формате в предыдущем фрагмент кода.

Другая аналитика

Дерево решений — это лишь один из многих алгоритмов, доступных в nzpyida. И хотя алгоритмы разные, общие правила их использования схожи. Вот несколько важных правил:

  • Каждый алгоритм представлен классом с конструктором, ожидающим подключения к базе данных, и именем модели (за исключением редких ситуаций, когда данный алгоритм не создает модель).
  • Если данная модель существует в базе данных, ее можно использовать сразу (вы можете вызвать predict или score) — в противном случае необходимо обучение модели.
  • Метод тренировки называется fit. Он создает или воссоздает модель в базе данных, а затем обучает ее на основе предоставленных данных.
  • Входные данные представляют собой объект IdaDataFrame.
  • Если на выходе есть таблица данных, это объект IdaDataFrame. Необходимо указать параметр out_table или использовать контекстный менеджер AutoDeleteContext, как описано в начале этой статьи.
  • Оценка модели обрабатывается методом score, который делает прогнозы для заданных данных и сравнивает результаты с ожидаемыми.

Алгоритмы, включенные в пакет:

  • Дерево решений (классификация)
  • Наивный Байер (Классификация)
  • K-Ближайшие соседи (Классификация)
  • Дерево регрессии (Регрессия)
  • Линейная регрессия (Регрессия)
  • Обобщенная линейная модель (регрессия)
  • KMeans (кластеризация)
  • Разделение KMeans пополам (кластеризация)
  • Разделительная кластеризация (Кластеризация)
  • Прогнозирование временных рядов
  • Правила ассоциации

Подробнее об этих алгоритмах можно прочитать в документации nzpyida:



Управление моделями

Поскольку алгоритмы прогнозирования из nzpyida создают свои модели в базе данных, нам нужен способ управлять ими. Базовые функции для этого описаны непосредственно в классе IdaDataFrame. Сюда входит перечисление моделей, проверка наличия модели с данным именем и удаление моделей. Дополнительные функции доступны в специальном классе ModelManager. Использовать этот класс просто:

from nzpyida.analytics import ModelManager
mm = ModelManager(idadb)
print(mm.list_models().as_dataframe())
mm.copy_model(name='simbox_predict', copy_name='simbox_predict_COPY')
if mm.model_exists('simbox_predict_COPY'):
  mm.drop_model('simbox_predict')

Приведенный выше код создает экземпляр в ModelManager, передавая ему объект подключения к базе данных (2-я строка). Затем он перечисляет и печатает существующие модели (3-я строка), копирует модель simbox_predict в simbox_predict_COPY (4-я строка), а затем проверяет существование этой модели (5-я строка) и удаляет скопированная модель (6-я строка). Эта последовательность операций, возможно, не имеет какого-либо более глубокого смысла — она предоставлена ​​только для демонстрации API.

ModelManager позволяет:

  • Листинг моделей
  • Проверка существования модели с заданным именем
  • Удаление моделей
  • Копирование моделей
  • Изменение свойств моделей
  • Перечисление привилегий моделей
  • Предоставление пользователям прав на модели
  • Отзыв прав на модели у пользователей

В статье описывалось, как исследовать и подготавливать данные, а также как запускать алгоритмы машинного обучения. Всего этого можно достичь с помощью языка Python и стиля выполнения в базе данных на Netezza Performance Server. В следующей статье мы узнаем, как использовать функцию раскрытия кода Python.

Еще не все!

Рекомендации

Документация nzpyida: https://nzpyida.readthedocs.io/en/latest/

Репозиторий nzpyida на github: https://github.com/IBM/nzpyida

nzpyida на PyPI: https://pypi.org/project/nzpyida/

Документация INZA на github: https://github.com/IBM/netezza-utils/tree/master/analytics