Статьи

Разработка модели глубокого обучения с использованием SQL в базе данных Oracle: прогнозирование цен на жилье в Бостоне

Модель глубокого обучения с SQL.

В этой статье я построю модель глубокого обучения и проведу простой регрессионный анализ с использованием нейронных сетей, одного из новых алгоритмов, представленных Oracle 18c для расширенных аналитических опций. Я надеюсь, что это будет полезно в смысле осознания.


Вам также может понравиться:
Что такое глубокое обучение?

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

Oracle поддерживает методы и алгоритмы для решения проблем под этими заголовками с пакетом DBMS_DATA_MINING. Благодаря этой инфраструктуре Oracle позволяет пользователям разрабатывать приложения машинного обучения с использованием SQL.

С пакетом DBMS_DATA_MINING мы можем создавать такие модели, как Кастеринг, Классификация, Регрессия, Обнаружение аномалий, Извлечение признаков и Правила связывания, а затем передавать и интерпретировать наши данные. Результаты, полученные из этих моделей, могут быть использованы в качестве входных данных в наших бизнес-сценариях.

Пакет DBMS_DATA_MINING по умолчанию не установлен в базе данных Oracle. Поэтому, чтобы воспользоваться этой поддержкой, необходимо сначала установить следующий пакет. Вы можете установить Oracle Data Mining в своей базе данных, перейдя по ссылке ниже

https://docs.oracle.com/cd/E11882_01/datamine.112/e16807/install_odm.htm#DMADM117 .

Мне не нужна дополнительная установка, потому что я сделаю это приложение в автономном хранилище данных (БД), которое предлагается в качестве службы в Oracle Cloud. Я могу использовать эти алгоритмы в автономном хранилище данных. Вы можете бесплатно получить услугу «Автономное хранилище данных», которая является одной из услуг, объявленных как « Всегда бесплатные» в Oracle Open World 2019, и использовать ее в облаке в течение нескольких минут без установки. Вы можете перейти по ссылке для получения подробной информации.

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

Вместе с 18c Oracle запустила инфраструктуру, которая позволяет нам строить модели нейронных сетей без необходимости переноса данных в другую среду в базе данных. Теперь давайте рассмотрим пример использования этой инфраструктуры и ее детали.

Мне нужен набор данных и проблема для его реализации. Я выбираю цены на жилье в Бостоне как проблему. Чтобы решить эту проблему, я построю регрессионную модель. Я получаю набор данных из Kaggle ( Boston Housing ).

Давайте сначала рассмотрим набор данных BOSTON_HOUSING .

Имя столбца Описание Тип данных
CRIM уровень преступности на душу населения по городам. номер
гп доля жилой земли зонирована под участки более 25 000 кв. футов. номер
промышл доля неторговых площадей на город. номер
Чес Фиктивная переменная реки Чарльз (= 1, если тракт ограничивает реку; 0 в противном случае). номер
NOx концентрация оксидов азота (частей на 10 миллионов). номер
комната среднее количество комнат в доме. номер
возраст доля домовладельцев, построенных до 1940 года. номер
дис средневзвешенное расстояние до пяти бостонских центров занятости. номер
радиан индекс доступности к радиальным магистралям. номер
налог ставка налога на имущество на полную стоимость за 10 000 долларов США. номер
ptratio соотношение ученик-учитель по городу. номер
черный 1000 (Bk — 0,63) ^ 2, где Bk — доля черных в городе. номер
lstat более низкий статус населения (в процентах). номер
MEDV средняя стоимость домов, занимаемых владельцами, в 1000 долларов.

номер

Теперь, когда мы проверили детали с нашим набором данных, давайте загрузим BOSTON_HOUSING, который мы загрузили, в нашу базу данных Oracle.

Сначала создайте таблицу Oracle, в которую мы будем загружать загруженный набор данных (train.csv).

CREATE TABLE BOSTON_HOUSING
(
   ID        NUMBER,
   CRIM      NUMBER,
   ZN        NUMBER,
   INDUS     NUMBER,
   CHAS      NUMBER,
   NOX       NUMBER,
   RM        NUMBER,
   AGE       NUMBER,
   DIS       NUMBER,
   RAD       NUMBER,
   TAX       NUMBER,
   PTRATIO   NUMBER,
   BLACK     NUMBER,
   LSTAT     NUMBER,
   MEDV      NUMBER
);

Теперь, когда мы создали нашу таблицу, мы загрузим в таблицу набор данных, который мы скачали как CSV; у нас есть несколько способов сделать это:

  • Использование Oracle External Table.
  • Использование Oracle SQL Loader.
  • Использование редакторов SQL-PL / SQL (Oracle SQL Developer, Toad, PL / SQL Developer и т. Д.).

Я загружу набор данных с помощью редактора, который я использую. Я использую Oracle SQL Developer в качестве редактора. С Oracle SQL Developer вы можете загружать данные следующим образом .

SELECT * FROM BOSTON_HOUSING;

Мы завершили процесс загрузки набора данных.

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

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

НАИМЕНОВАНИЕ НАСТРОЙКИ НАСТРОЙКА ЗНАЧЕНИЯ ОПИСАНИЕ
NNET_HIDDEN_LAYERS Неотрицательное целое число Определяет топологию по количеству скрытых слоев.
Значением по умолчанию является 1.
NNET_NODES_PER_LAYER Список целых положительных чисел Определяет топологию по количеству узлов на слой. Разные слои могут иметь разное количество узлов.
Значение должно быть неотрицательными целыми числами и разделяться запятыми. Например, 10, 20, 5. Значения параметров должны соответствовать NNET_HIDDEN_LAYERS. По умолчанию количество узлов на слой равно количеству атрибутов или 50 (если количество атрибутов> 50).
NNET_ACTIVATIONS Список следующих строк: Определяет функцию активации для скрытых слоев. Например, «NNET_ACTIVATIONS_BIPOLAR_SIG», «NNET_ACTIVATIONS_TANH».
«NNET_ACTIVATIONS_LOG_SIG» Разные слои могут иметь разные функции активации.
«NNET_ACTIVATIONS_LINEAR» Значением по умолчанию является «NNET_ACTIVATIONS_LOG_SIG».
«NNET_ACTIVATIONS_TANH» Количество функций активации должно соответствовать NNET_HIDDEN_LAYERS и NNET_NODES_PER_LAYER.
«NNET_ACTIVATIONS_ARCTAN» Примечание:
«NNET_ACTIVATIONS_BIPOLAR_SIG» Все кавычки одинарные, а две одинарные кавычки используются для экранирования одинарных кавычек в операторах SQL.
NNET_WEIGHT_LOWER_BOUND Реальное число Параметр задает нижнюю границу области, где веса инициализируются случайным образом. NNET_WEIGHT_LOWER_BOUND и NNET_WEIGHT_UPPER_BOUND должны быть установлены вместе. Установка одного, а не установка другого вызывает ошибку. NNET_WEIGHT_LOWER_BOUND не должен превышать NNET_WEIGHT_UPPER_BOUND. Значением по умолчанию является –sqrt (6 / (l_nodes + r_nodes)). Значение l_nodes для:
плотные атрибуты входного слоя (1 + количество плотных атрибутов)
разреженные атрибуты входного слоя — это число разреженных атрибутов
каждый скрытый слой (1 + количество узлов в этом скрытом слое)
Значение r_nodes — это количество узлов в слое, к которому подключается вес.
NNET_WEIGHT_UPPER_BOUND Реальное число Этот параметр указывает верхнюю границу области, в которой инициализируются веса. Он должен быть установлен в паре с NNET_WEIGHT_LOWER_BOUND, и его значение не должно быть меньше значения NNET_WEIGHT_LOWER_BOUND. Если не указано, значения NNET_WEIGHT_LOWER_BOUND и NNET_WEIGHT_UPPER_BOUND определяются системой.                                                                                                                   
Значением по умолчанию является sqrt (6 / (l_nodes + r_nodes)). Смотрите NNET_WEIGHT_LOWER_BOUND.
NNET_ITERATIONS Положительное число Этот параметр указывает максимальное количество итераций в алгоритме нейронной сети.
Значение по умолчанию 200
NNET_TOLERANCE TO_CHAR (0 <numeric_expr <1) Определяет настройку допуска сходимости алгоритма нейронной сети.
Значением по умолчанию является 0,000001.
NNET_REGULARIZER NNET_REGULARIZER_NONE Настройка регуляризации для алгоритма нейронной сети. Если общее количество обучающих строк превышает 50000, по умолчанию используется NNET_REGULARIZER_HELDASIDE. Если общее количество обучающих строк меньше или равно 50000, по умолчанию используется NNET_REGULARIZER_NONE.
NNET_REGULARIZER_L2
NNET_REGULARIZER_HELDASIDE
NNET_HELDASIDE_RATIO 0 <= numeric_expr <= 1 Определите коэффициент удержания для метода удержания в стороне.
Значение по умолчанию составляет 0,25.
NNET_HELDASIDE_MAX_FAIL Значение должно быть положительным целым числом. С NNET_REGULARIZER_HELDASIDE процесс обучения останавливается на ранней стадии, если производительность сети для данных проверки не улучшается или остается неизменной для эпох NNET_HELDASIDE_MAX_FAIL подряд.
Значением по умолчанию является 6.
NNET_REG_LAMBDA TO_CHAR (numeric_expr> = 0) Определяет параметр регуляризации L2 лямбда. Это не может быть установлено вместе с NNET_REGULARIZER_HELDASIDE.

Значением по умолчанию является 1.

Как видите, существует много параметров, которые мы можем использовать для создания модели. Мы можем использовать эти параметры с различными настройками в соответствии с топологией сети, которую мы хотим настроить.

Во-первых, мы должны сделать; создайте и сохраните операторы вставки, чтобы установить эти параметры способом, который мы хотим использовать. Нам просто нужно добавить параметры, которые мы хотим изменить, в эту таблицу. Oracle будет использовать оставшиеся параметры со значениями по умолчанию. Затем мы дадим эту таблицу в качестве параметра для чтения настроек алгоритма функции, которую мы будем использовать для создания нашей модели.

CREATE TABLE neural_network_settings (
    setting_name    VARCHAR2(1000),
    setting_value   VARCHAR2(1000)
);

BEGIN
    INSERT INTO neural_network_settings (
        setting_name,
        setting_value
    ) VALUES (
        dbms_data_mining.prep_auto,
        dbms_data_mining.prep_auto_on
    );

    INSERT INTO neural_network_settings (
        setting_name,
        setting_value
    ) VALUES (
        dbms_data_mining.algo_name,
        dbms_data_mining.algo_neural_network
    );

    INSERT INTO neural_network_settings (
        setting_name,
        setting_value
    ) VALUES (
        dbms_data_mining.nnet_activations,
        '''NNET_ACTIVATIONS_LOG_SIG'',''NNET_ACTIVATIONS_LOG_SIG'',''NNET_ACTIVATIONS_LOG_SIG'''
    );

    INSERT INTO neural_network_settings (
        setting_name,
        setting_value
    ) VALUES (
        dbms_data_mining.nnet_nodes_per_layer,
        '512,250,100'
    );

    COMMIT;
END;

select * from neural_network_settings;

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

Если мы объясним примерно три параметра, которые мы вставим;

  • Мы выбрали алгоритм в строке номер два.
  • В строке 4 мы определили, сколько слоев будет состоять из нейронной сети и сколько будет скрытых единиц. В этом примере мы создаем 3-уровневую сеть с 512 скрытыми единицами на первом уровне, 250 скрытыми единицами на втором уровне и 100 скрытыми единицами на последнем уровне.
  • В третьей строке мы определили функцию активации, которую мы хотим использовать в каждом слое. В этом примере мы объявили нашего пользователя SIGMOID с каждого уровня.

Да, мы загрузили данные наших тренировок. Мы установили настройки алгоритма. Теперь пришло время создать нашу модель (обучение).

BEGIN
   DBMS_DATA_MINING.CREATE_MODEL(
      model_name          => 'DEEP_LEARNING_MODEL',
      mining_function     => dbms_data_mining.REGRESSION,
      data_table_name     => 'BOSTON_HOUSING',
      case_id_column_name => 'ID',
      target_column_name  => 'MEDV',
      settings_table_name => 'neural_network_settings');
END;

Да, мы вызвали функцию, мы создадим нашу модель с необходимыми параметрами. Если мы посмотрим, что это за параметры.

  • Название модели:  уникальное название модели, которое мы дадим нашей модели.

  • Mining function: параметр, по которому мы сообщаем тип проблемы, которую нужно решить. Поскольку мы сделали регресс в этой задаче, мы выбрали этот параметр в качестве регрессии. Мы можем выбрать CLASSIFICATION или CLUSTERING и т. Д. В зависимости от типа проблемы.

  • Data_table_name:  параметр, к которому будет использоваться таблица при обучении.

  • Case_id_column_name:  параметр, который дает ключ, который разделяет данные, которые мы используем в обучении. Если есть составной ключ, мы должны создать новый атрибут перед созданием модели. Так как наш столбец идентификатора уникален в нашей таблице, мы смогли предоставить этот столбец напрямую.

  • Target_column_name:  где мы сообщаем, какой столбец наша модель должна использовать в качестве цели. Целевая переменная нашей модели. Другими словами, значение, которое предсказывает модель.

  • Settings_table_name:  настройка таблицы, где параметры, которые мы хотим использовать нейронной сети при написании модели.

Да, мы тренируем нашу модель. Все параметрические сведения о нашей модели можно получить, введя следующий запрос на этом шаге.

select * from all_mining_model_settings where model_name='DEEP_LEARNING_MODEL';

В таблице мы видим как параметры, которые мы даем извне, так и параметры модели, для которых присваивания выполняются со значениями по умолчанию.

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

Для достижения значений веса производится в каждом слое;

select * from DM$VADEEP_LEARNING_MODEL;

Для общей информации о модели;

select * from DM$VGDEEP_LEARNING_MODEL;

Достичь нормализации значений переменных;

select * from DM$VNDEEP_LEARNING_MODEL;

Теперь давайте посмотрим, как мы можем делать новые прогнозы для нашей модели. Мы можем сделать это двумя способами.

Во-первых, мы можем запустить нашу модель для всех агрегированных значений в таблице. Для этого мы будем использовать файл test.csv в файлах данных, которые мы скачали с Kaggle. Давайте создадим таблицу, куда мы будем загружать этот файл и загружать данные внутри.

CREATE TABLE BOSTON_HOUSING_TEST
(
   ID        NUMBER,
   CRIM      NUMBER,
   ZN        NUMBER,
   INDUS     NUMBER,
   CHAS      NUMBER,
   NOX       NUMBER,
   RM        NUMBER,
   AGE       NUMBER,
   DIS       NUMBER,
   RAD       NUMBER,
   TAX       NUMBER,
   PTRATIO   NUMBER,
   BLACK     NUMBER,
   LSTAT     NUMBER,
   MEDV      NUMBER
);

-- We can load the data with the method described above and query the table.

SELECT * FROM BOSTON_HOUSING_TEST;

Теперь давайте введем эти данные в нашу модель и сгенерируем прогнозы.

SELECT T.*,
 PREDICTION (DEEP_LEARNING_MODEL USING *) NN_RES
FROM BOSTON_HOUSING_TEST T;

Теперь давайте посмотрим, как мы можем прогнозировать с помощью одной записи.

SELECT prediction(DEEP_LEARNING_MODEL USING 0.02 as crim,
                                            12.5 as zn,
                                            8.01 as indus,
                                            0    as chas,
                                            0.48 as nox,
                                            6.25 as rm,
                                            15.4 as age,
                                            4.92 as dis,
                                            4.00 as rad,
                                            242  as tax,
                                            15.3 as pratio,
                                            399  as balck,
                                            4.09 as lstat) pred
FROM dual;

Как мы уже видели, мы смогли очень просто передать значения нашей модели и получить результат прогнозирования менее чем за секунду.

Дальнейшее чтение

Глубокое обучение и машинное обучение: часть I

Глубокое обучение с Python для начинающих

Глубокое обучение для компьютерного зрения: руководство для начинающих