Создание модели прогнозирования в Oracle Database!

Первые шаги с помощью функции интеллектуального анализа данных Oracle и способы улучшения ваших данных для получения точных прогнозов!

✨Мотивация

👩‍💻 Как специалист по обработке данных, я всегда хотел изучить возможности аналитики в базе данных Oracle. В рамках недавнего исследовательского проекта в университете у меня была возможность поэкспериментировать с функциями интеллектуального анализа данных в базе данных Oracles.

➡ Функции Oracle Machine Learning, Spatial и Graph с 5 декабря предоставляются бесплатно в Oracle Database!



❄ Дело ❄

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

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

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

💻 Настройка базы данных

Мы использовали Oracle Cloud для создания хранилища данных. Функции аналитики и интеллектуального анализа данных доступны на уровне Oracle Cloud Always Free Tier.

Для импорта данных (полученных от клиента в виде файлов Excel и CSV) очень полезна функция импорта SQL Developer.

📄 Подготовка набора данных

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

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

  • 📄 Все данные, которые необходимо проанализировать, должны быть в одной таблице или представлении.
  • 🔖 Данные должны быть хорошо помечены, аннотированы и очищены (ключи разрешения, агрегированные числа с необходимой степенью детализации).

Данные не обязательно должны быть сохранены в таблице для работы с моделью интеллектуального анализа данных. Его также можно подготовить как представление, если нет необходимости перемещать и дублировать данные.

Данные для интеллектуального анализа данных должны существовать в одной таблице или представлении. Информация по каждому делу (записи) должна храниться в отдельной строке. - Документация Oracle

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

🪓 Разделить набор данных на два

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



create table t_test_data as 
  select * from (
    select ora_hash(date_id, 1, 11) hashvalue, t.*
    from t_all_data t 
    order by date_id
  )
where hashvalue = 1;
  
create table t_training_data as 
  select * from (
    select ora_hash(date_id, 1, 11) as hashvalue, t.*
    from t_all_data t 
    order by date_id
  )
where hashvalue = 0;

Вышеупомянутый запрос генерирует два набора данных одинакового размера. Начальное значение - третий параметр в ora_hash - гарантирует воспроизводимость набора данных. Если два набора данных должны иметь распределение 80/20, максимальное значение сегмента - второй параметр в ora_hash - может быть изменено соответствующим образом. Однако хеш или хеш следует использовать только в том случае, если данные не искажены.

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

create table t_training_data as 
  select * from (
    select * from t_all_data SAMPLE (80) SEED (11)
);   
 
create table t_test_data as 
select * from (
   select * from t_all_data 
   MINUS 
   select * from t_training_data
);

🧮 Выберите алгоритм

Прежде чем мы смогли создать модель, нам нужно было выбрать алгоритм, который соответствует цели нашей задачи интеллектуального анализа данных. В документации DBMS_DATA_MINING перечислены все функции майнинга и алгоритмы на выбор.

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

→ Подробнее о регрессии и концепциях интеллектуального анализа данных Oracle



📜 Создать таблицу настроек

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

create table model_settings (
  setting_name  varchar2(30 char),
  setting_value varchar2(30 char));

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

begin 
  insert into lds_model_settings (setting_name, setting_value)  
    values (dbms_data_mining.algo_name, 
            dbms_data_mining.algo_generalized_linear_model);  
  insert into lds_model_settings (setting_name, setting_value) 
    values (dbms_data_mining.prep_auto,        
            dbms_data_mining.prep_auto_on);
  insert into lds_model_settings (setting_name, setting_value)  
    values (dbms_data_mining.odms_missing_value_treatment, 
            dbms_data_mining.odms_missing_value_mean_mode);   
  insert into lds_model_settings (setting_name, setting_value)   
    values (dbms_data_mining.glms_ridge_regression, 
            dbms_data_mining.glms_ridge_reg_enable);    
commit;
end;
/

Автоматическая подготовка данных (ADP) позволяет базе данных подготовить и преобразовать данные сборки в соответствии с требованиями выбранного алгоритма. Параметр odms_missing_value_mean_mode обрабатывает отсутствующие значения средним значением вместо удаления строки данных. При включенном glms_ridge_regression модель интеллектуального анализа данных не создает автоматически границ прогноза. Если этот параметр не установлен явно, модель сама определяет, следует ли использовать регрессию гребня.

🔨 Построение модели интеллектуального анализа данных

После того, как таблица настроек подготовлена, можно создать модель интеллектуального анализа данных. В команде создания необходимо указать имя таблицы данных (t_training_data), а также регистр (даты), имя целевого столбца для прогнозирования (лыжники) и имя таблицы настроек (model_settings).

begin
  dbms_data_mining.create_model(
    model_name          => 'skier_model',
    mining_function     => dbms_data_mining.regression,
    data_table_name     => 't_training_data',
    case_id_column_name => 'date_id',
    target_column_name  => 'amount_skiers',
    settings_table_name => 'model_settings');
end;
/

Создание модели интеллектуального анализа данных происходит довольно быстро. После того, как это будет сделано, можно делать прогнозы на основе тестовых данных.

🔮 Прогнозы с помощью модели

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

select 
   t.date_id, 
   t.amount_skiers, 
   prediction (skier_model using *) predicted_skiers
from t_test_data t ;

🧩 Получение более точного прогноза

Поскольку количество лыжников на горе сильно варьировалось в будние и выходные дни, прогнозы на выходные не были очень точными. У нас был довольно точный прогноз в будние дни (отклонение менее 10% от целевого числа), но в выходные с хорошей, холодной и солнечной погодой прогноз был сильно нецелевым (до 100% отклонения от целевого числа).

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

Поговорив со специалистами в данной области, мы решили построить две отдельные модели интеллектуального анализа данных - Спасибо,« Abi за подсказку!». Один для будних дней и один для выходных, чтобы исключить отклонения в количестве лыжников. Поскольку прогнозирование буднего дня уже было очень полезно, нам понадобился отдельный набор обучающих данных для выходных с более высокими целевыми числами.

Две модели были созданы так же, как и раньше. Мы разделили обучающие и тестовые данные на два набора, один для будних дней, а другой для выходных, и воссоздали модели прогнозирования. Чтобы предсказать временные рамки, тестовый запрос с тестовыми данными должен учитывать две модели соответственно. Прогнозы с двумя моделями были намного точнее, чем с предыдущей единственной моделью. С помощью двухмодельного подхода как в будние, так и в выходные дни мы достигли прогноза с точностью с отклонением менее 10% от нашей цели. Для укомплектования лыжным регионом точность + - 10% значительно упрощает планирование.

select 
   t.date_id,  
   t.amount_skiers,  
   prediction (skier_model_weekday using *) predicted_skiers
from t_test_data_weekday t
union all
select 
   t.date_id,  
   t.amount_skiers,  
   prediction (skier_model_weekend using *) predicted_skiers
from t_test_data_weekend t   
order by date_id asc;

🎉 Получение статистической информации

Когда в Oracle Database создается модель интеллектуального анализа данных, автоматически создаются диагностические таблицы со статистической информацией. После создания модели ищите новые таблицы в SQL Developer. В зависимости от алгоритма доступны также статистические функции, такие как get_model_details_glm для обобщенной линейной модели или get_model_details_global для глобальной статистической информации.

select * 
from table (dbms_data_mining.get_model_details_glm ('skier_model'));
select *
from table(dbms_data_mining.get_model_details_global('skier_model'))
order by global_detail_name;

Приведенные выше операторы select генерируют информацию о модели, такую ​​как R², стандартная ошибка, vif, f-значение и многое другое. Более подробную информацию о модели можно найти в Документации Oracle.

Резюме

➡️ Создавать модели интеллектуального анализа данных для машинного обучения очень просто после сбора и агрегирования данных. Выполнение аналитики и прогнозов, когда данные находятся в базе данных, эффективно, надежно и очень быстро. 💬 Несмотря на то, что раньше у меня не было большого опыта в области интеллектуального анализа данных, с некоторыми знаниями PL / SQL освоить интеллектуальный анализ данных легко, а документация Oracle очень помогает в решении проблем. Подготовка данных внутри базы данных, вероятно, самый быстрый из возможных способов.

Пожалуйста, поддержите эту статью своими аплодисментами👏👏👏, чтобы помочь ей распространиться среди более широкой аудитории. 💭 Не стесняйтесь писать мне, если у вас есть какие-либо мысли или вопросы по этой теме! Я в Твиттере → @ jasminfluri

Источники / ссылки