Uploaded by Симовин Кирилл Константинович

Отчет о НИР: Интеллектуальный анализ данных

advertisement
Министерство науки и высшего образования Российской Федерации
Федеральное государственное автономное образовательное
учреждение высшего образования
«Самарский национальный исследовательский университет
имени академика С.П. Королева»
Институт информатики и кибернетики
Кафедра технической кибернетики
Отчёт о научно-исследовательской работе
бакалавра
Семестр 7
Направление подготовки: 01.03.02 Прикладная математика и информатика:
Профиль "Компьютерные науки"
Студент Симовин Кирилл Константинович
группы 6407-010302D института информатики и кибернетики
Тема научно исследовательской работы: Исследование методов и алгоритмов
интеллектуального анализа данных
Научный руководитель: Благов Александр Владимирович, кандидат
технических наук, доцент кафедры технической кибернетики
Научный руководитель
________________________
(подпись)
“___”_____________ 20___ г.
Студент
________________________
(подпись)
“___”_____________ 20___ г.
Самара 2024
РЕФЕРАТ
Отчет по научно-исследовательской работе: 25 c. 7 рисунков, 1
таблица, 14 источников, 2 приложения.
CATBOOST, БУСТИНГ, ГРАДИЕНТНЫЙ БУСТИНГ, НЕЙРОННЫЕ
СЕТИ, LSTM, ДИФФУЗОР.
Работа
посвящена
рассмотрению
CatBoost
и
разработке
предсказательных моделей с использованием CatBoost и нейронных сетей для
предсказания оптимальной геометрии диффузора по заданным параметрам:
входному давлению и проценту потерь.
Значительная часть работы отводится под описание процесса разработки
предсказательных моделей.
В ходе работы были разработаны две модели и сопоставлены результаты
их работ.
2
СОДЕРЖАНИЕ
Введение ................................................................................................................... 4
1 CatBoost ................................................................................................................. 5
2 Практическая часть .............................................................................................. 9
2.1 Постановка задачи .......................................................................................... 9
2.2 Подготовка данных ...................................................................................... 10
2.3 Моделирование с использованием CatBoost ............................................. 10
2.4 Моделирование с использованием нейронной сети ................................. 12
2.5 Результаты моделирования ......................................................................... 15
Заключение ............................................................................................................ 17
Список использованных источников .................................................................. 18
Приложение А. Код алгоритма с использованием CatBoost ............................ 21
Приложение Б. Код алгоритма с использованием нейронной сети ................. 24
3
ВВЕДЕНИЕ
Для проектирования камер сгорания требуется много ресурсов. В связи
с этим предпринимаются попытки по оптимизации этого процесса.
На данный момент построение геометрии при моделировании камер
сгорания происходит посредством использования специализированных
программных средств (оптимизаторов), с помощью которых находится
оптимальная геометрия при самом, насколько это возможно, минимальном
проценте потерь [1, 2]. При этом время работы оптимизатора для решения
обозначенной задачи достаточно продолжительно – от нескольких часов до
нескольких дней. Использование интеллектуальных методов в решении
различных технических задач зачастую дает существенный выигрыш во
времени [3].
Применение интеллектуальных методов для решения этой задачи
позволит
оптимизировать
процесс
расчёта
геометрии
и
подбирать
геометрические параметры для камер сгорания с наименьшими процентами
потерь.
В данной работе планируется использовать CatBoost и нейронную сеть,
с целью обучения моделей на наборе геометрических параметров различных
диффузоров с различным процентом потерь с целью сравнения точности и
времени выполнения с расчетами, полученными в ANSYS, аналогично тому,
как в [4] использовали ANOVA для проверки результатов, полученных с
использованием собственных моделей. В случае если результаты одной из
моделей будут иметь допустимую погрешность, возникает целесообразность
в использовании соответствующего алгоритма для нахождения оптимальной
геометрии диффузора при заданном проценте потерь и входном давлении.
В первом разделе подробно рассматривается CatBoost, его реализация с
математической точки зрения, области его применения.
Во втором разделе описывается процесс реализации нейронной сети,
CatBoost и приводятся соответствующие выводы.
4
1 CatBoost
CatBoost является библиотекой от Яндекс, реализующей градиентный
бустинг над деревьями решений (GBDT) [5]. Изучив официальный сайт
библиотеки [5], можно заметить, что она превосходит по качеству (как с
настроенными весами, так и без) и скорости обучения (и на GPU, и на CPU)
LightGBM, XGBoost и H2O.
Одним из преимуществ алгоритма от Яндекс является более точный
результат при относительно небольшом количестве обучающих данных [6], в
то время как подобные алгоритмы реализованы с использованием
искусственных нейронных сетей, которые требуют обучающие выборки
больших размеров.
Также CatBoost позволяет работать с категориальными данными –
данными, принимающими ограниченное число уникальных значений. Такие
данные могут быть как текстовыми, так и числовыми.
Отличительным признаком данной библиотеки является наличие
эффективного метода кодирования, уменьшающего переобучение [7].
Поскольку CatBoost построен на градиентном бустинге, здесь
применяется тот же алгоритм – реализация сильного классификатора,
позволяющего снизить ошибку в результате за счет использования
композиции
более
слабых
классификаторов,
имеющих
точность
классификации более 0,5.
На вход алгоритма с использованием бустинга поступает два множества
– 𝑋 (множество признаков) и 𝑌 (множество классов). Также дополнительно
вводится множество ℝ – пространство оценок.
Рассмотрим выше описанный принцип бустинга с математической точки
зрения. Для этого рассмотрим следующий алгоритм в виде суперпозиции [7]:
𝑎(𝑥) = 𝐶(𝑏(𝑥)),
(1)
где 𝑏 ∶ 𝑋 → ℝ – алгоритмический оператор (базовый алгоритм), а функция 𝐶 ∶
ℝ → 𝑌 называется решающим правилом.
5
Принцип работы алгоритмов, описываемый формулой (1):
1. Вычисляются оценки принадлежности объекта классам.
2. С использованием функции 𝐶 оценки переводятся в соответствующие
номера классов. От значения оценки зависит степень уверенности
классификации.
Алгоритм 𝑎 ∶ 𝑋 → 𝑌 вида
𝑎(𝑥) = 𝐶 (𝐹(𝑏1 (𝑥), … , 𝑏𝐾 (𝑥))) , 𝑥 ∈ 𝑋
(2)
является алгоритмической композицией [3]. Она составлена из рассмотренных
̅̅̅̅̅
ранее базовых алгоритмов 𝑏𝑘 ∶ 𝑋 → 𝑅, 𝑘 = 1,
𝐾, функции 𝐶 и корректирующей
операции 𝐹 ∶ 𝑅𝐾 → 𝑅.
Слабые
классификаторы
строится
последовательно.
Данные
классификаторы имеют единственное отличие – веса обучающих данных.
Поскольку
образование
классификаторов
последовательное,
каждый
последующий классификатор использует данные предыдущих, в зависимости
от которых каждому объекту текущего классификатора присваивается
определенный вес.
Заключительным этапом в формировании весов объектов является их
пересчет – производится весовое мажоритарное голосование. В зависимости
от корректности определения класса объекта алгоритмическим оператором 𝑏𝑘
соответственно изменяется вес объекта – в случае правильного определения
вес уменьшается экспоненциально, иначе повышается. Таким образом,
проблемным объектам присваиваются наибольшие веса. На рисунке 1
приведена схема алгоритма бустинга.
6
Рисунок 1 – Схема алгоритма бустинга
От
градиентного
бустинга
CatBoost
унаследовал
следующую
квадратичную функцию потерь [8]:
𝑁
1
2
𝐿(𝑦, 𝑥) = ⋅ ∑(𝑦𝑖 − 𝑎(𝑥𝑖 )) → min,
2
(3)
𝑖=1
где 𝑦𝑖 – ожидаемый результат, а 𝑎(𝑥𝑖 ) – значение линейной комбинации
слабых классификаторов для объекта 𝑥𝑖 .
Таким образом, используя композицию слабых классификаторов,
каждый из которых корректно отрабатывает в определенной ситуации,
формируется сильный классификатор.
За счет своей универсальности и высокой точности, CatBoost
используется в различных сферах человеческой жизни. Так, в статье [7]
CatBoost используется для предсказания оттока абонентов. В этой работе было
заключено, что алгоритм Яндекса имеет лучшие результаты по сравнению с
другими рассмотренными алгоритмами классификации.
В работе [9] CatBoost использовался для предсказания речного стока в
горных водосборах. По результатам исследования CatBoost показал лучшие
результат среди моделей, использующих параметры по-умолчанию.
В исследовании [10] рассматривается применение CatBoost для
автоматического определения пола и возраста по голосу по коротким речевым
высказываниям. Решение использовать CatBoost для такого типа задач было
7
продиктовано
отсутствием
удовлетворительных
результатов
других
исследований. В результате была достигнута точность 89,62% при
определении пола, 72,29% при распознавании возраста, и 71,96% при
распознавании одновременно обоих признаков.
Также CatBoost используется и в медицине [11]. В данной работе
библиотека используется для анализа и классификации частоты сердечных
сокращений. По результатам исследования было выяснено, что алгоритм с
применением CatBoost показывает отличные результаты по чувствительности
и точности в отличие от других моделей. Также преимуществом библиотеки
от Яндекс является скорость вычислений – она максимальна, благодаря чему
выводы делаются очень быстро.
Экология является одной из наиболее важных составляющих жизни
современного человека. В работе [12] был разработан ансамблевый алгоритм
для прогнозирования вредного цветения водорослей. Ансамбль моделей
градиентного бустинга состоял из XGBoost, LightGBM и CatBoost. По
результатам исследования был сделан вывод об оптимальности использования
такого ансамбля в прогнозировании вредного цветения водорослей, так как
будет использована сильная сторона каждого алгоритма.
8
2 Практическая часть
2.1 Постановка задачи
Рассмотрим построение геометрических параметров на примере
диффузора камеры сгорания, вариант конструкции которого представлен на
рисунке 2.
Рисунок 2 – Вариант конструкции диффузора
В данном случае геометрия задается с помощью следующих параметров:
H55 – длина диффузора сверху, V56 – радиус осевой линии на входе, A55 –
угол наклона осевой линии диффузора, A57 – угол раскрытия диффузора, A58
– угол раскрытия диффузора, H44 – длина диффузора снизу.
Оптимальность геометрии определяется по проценту потерь, который
вычисляется по следующей формуле:
𝐿𝑝 =
𝐵−𝐴
⋅ 100%,
𝐵
(4)
где 𝐿𝑝 – процент потерь, 𝐵 – значение на входе, 𝐴 – значение на выходе. Чем
меньше процент потерь, тем лучше.
9
2.2 Подготовка данных
Для работы с таблицами будет использована библиотека pandas.
Данные для обучения были предоставлены НОЦ ГДИ Самарского
университета.
Для начала подготовим таблицу с обучающими данными. Изначально
таблица пришла в не валидной форме для чтения: лишние столбцы, наличие
картинки в таблице, общий заголовок с пояснениями, дополнительные
заголовки столбцов. Уберём всё лишнее и приступим к обработке данных
непосредственно с помощью Python.
Теперь очистим данные от пропусков в строках – таковые наблюдаются
на пересечении со столбцами “Полное давление на выходе” и “Процент
потерь”. Пропуски связаны с тем, что при определенных геометрических
параметрах алгоритм, используемый в ANSYS для вычисления выходного
давления при заданных параметрах, не сходится – не имеет решения. После
очистки было удалено 56 строк.
Заключительным этапом подготовки стало разбиение выборки в
соотношении, представленном на рисунке 3.
Рисунок 3 – Визуализация разбиения входных данных на выборки
2.3 Моделирование с использованием CatBoost
Особенность CatBoost в том, что модель может по некоторому
количеству признаков определить лишь один класс параметров, поэтому
10
необходимо построить несколько моделей для определения всех нужных
параметров.
Каждой последующей модели добавлялись столбцы, используемые
предыдущими. Также всем моделям, кроме первой, было задано одинаковое
количество итераций для обучения – 100, в качестве метрики для всех была
выбрана accuracy. У первой модели, предсказывающей длины диффузора
сверху и снизу, на маленьком количестве итераций была малая точность – 0,2
против 0,8 и более у других моделей. В результате для первой модели было
установлено число итераций, равное 2800, благодаря чему точность
предсказания была повышена до 0,68. Время обучения первой модели
составило 10 минут, каждая последующая обучалась в среднем 33 секунды.
После обучения моделей на имеющихся данных, на вход был получен
вектор ожидаемых процентов потерь и вектор соответствующих им входных
давлений. В результате моделью для каждой пары входных значений были
предсказаны геометрические параметры.
Из сформированного моделью набора данных была выбрана наиболее
оптимальная геометрия с процентом потерь, равным 0,397%. Для сравнения с
помощью оптимизации в программном комплексе ANSYS Fluid, были
подобраны характеристики с аналогичными потерями. Полученные с
помощью CatBoost геометрические параметры были также загружены в
ANSYS с целью вычисления погрешности предсказанных параметров,
процент потерь при этом получился 0,403%. В таблице 1 представлено
сравнение геометрий.
На
рисунке
4
представлено
визуальное
полученной CatBoost и оптимизированной ANSYS.
11
сравнений
геометрии,
Рисунок 4 – Визуальное сравнение геометрий: красная – CatBoost, зелёная –
оптимизированная ANSYS
2.4 Моделирование с использованием нейронной сети
Нейронная сеть написана с использованием библиотеки keras.
В отличие от CatBoost, при использовании нейронной сети не требуется
строить несколько моделей.
В качестве признаков были выбраны столбцы, соответствующие
входному и выходным давлениям, проценту потерь. Классами же были
определены геометрические параметры модели.
Данная модель реализована с применением Long short-term memory
(LSTM) – долгой краткосрочной памяти. LSTM является модификацией RNN
(рекуррентной нейронной сетью). Если в рекуррентных нейронных сетях с
увеличением расстояния между информацией теряется связь между смыслом
и значением, долгая краткосрочная память позволяет хранить информацию
долгое время.
Используя именно это свойство LSTM, будем строить свою нейронную
сеть, состоящую из:
12
1. Входного слоя с использованием LSTM, состоящего из 3 нейронов –
по количеству признаков. На данном слое была применена функция активации
ReLu. Данная функция активации возвращает значение 𝑥, если оно
положительно, в противном случае будет возвращен ноль. В большинстве
случаев она является отличным аппроксиматором и менее требовательным к
вычислительным ресурсам [13]. На рисунке 5 представлена схема работы
ReLu.
Рисунок 5 – Схема работы ReLu [13]
2. Скрытого слоя, также использующего LSTM, состоящего из 3
нейронов – по количеству входных признаков. Данный слой также
использовал ReLu.
3. Выходного слоя, имеющего полносвязную модель и состоящего так
же из 6 нейронов.
На рисунке 6 представлена схема сформированной нейронной сети.
13
Рисунок 6 – Сформированная нейронная сеть
Данная модель в качестве регуляризатора использовался оптимизатор
Adam – метод стохастического градиентного спуска, основанный на
адаптивной оценке моментов первого и второго порядков [14].
В качестве функции потерь использовалась MSE (Mean Squared Error) –
среднеквадратическая ошибка, записываемая в виде:
𝑛
1
2
𝑀𝑆𝐸 = ⋅ ∑(𝑦𝑖 − 𝑦̂)
,
𝑖
𝑛
(5)
𝑖=1
где 𝑦𝑖 – ожидаемый результат (геометрический параметр в нашем случае), 𝑦̂𝑖 –
спрогнозированный геометрический параметр.
При обучении модели было выяснено, что после 200 эпох наступает
переобучение, поэтому с текущими параметрами сеть была обучена на 200
эпохах. На рисунке 7 представлен график зависимости потерь нейронной сети
от эпох в процессе обучения.
14
Рисунок 7 – Зависимость процента потерь от эпох обучения
Как можно заметить, в ходе обучения процент потерь уменьшался,
однако оставался высоким – примерно 500, что достаточно велико.
Из спрогнозированного набора данных была также был выбран набор
геометрических параметров, соответствующий проценту потерь 0,397%.
Данный вектор параметров был загружен в ANSYS Fluid для проверки
полученных результатов. По итогам проверки было установлено, что при
полученной геометрии алгоритм, используемый в ANSYS для вычисления
выходного давления при заданных параметрах, не сходится – не имеет
решения.
2.5 Результаты моделирования
15
Оптимизир
ованный
CatBoost
V56
A55
A57
A58
H44
79,2
205,3
2,7
7,4
7,4
79,2
80,8
174,4
2,3
6,8
7,2
80,8
80,8
174,4
2,3
6,8
7,2
80,8
70,5
254,0
1,7
5,1
6,8
70,5
Проверка в
ANSYS
CatBoost
Нейронная
сеть
31917
32045
94,1
27
31916
32045
22,3
27
31916
32045
22,3
27
31918
32045
05
27
Процент потерь
Па
Полное давление на входе, Па
H45
Полное давление на выходе,
мм
Длина диффузора снизу,
диффузора, град
Угол раскрытия
диффузора, град
Угол раскрытия
линии диффузора, град
Угол наклона осевой
выходе, мм
Радиус осевой линии на
мм
Варианты
Длина диффузора сверху,
Таблица 1 – Параметры геометрии диффузора
0,397
0,397
0,403
0,397
Проверка в
ANSYS
нейронной
Решение не сошлось
сети
После проверки полученных геометрий, можно сделать вывод, что при
используемом подходе, алгоритм на основе нейронной сети предсказывает
некорректные параметры.
Проверив в ANSYS результат, полученный CatBoost, можно сделать
вывод, что вычислительная погрешность, рассчитанная по формуле (4),
составила 1,48%, что является допустимым в подобных задачах. При этом
время вычисления параметров с помощью CatBoost составило до 20 минут с
учётом обучения, при времени аналогичного вычисления в ANSYS равном
нескольким часам.
16
ЗАКЛЮЧЕНИЕ
В данной работе был подробно описан алгоритм, заложенный в
CatBoost,
рассмотрены
области
его
применения.
CatBoost
является
универсальным средством и практически во всех рассмотренных работах с его
использованием получались наилучшие результаты.
В настоящей работе были разработаны модели для предсказания
геометрических параметров простого диффузора. Модель нейронной сети
была построена с использованием полносвязной нейронной сети и LSTM.
Алгоритм с использованием CatBoost состоит из моделей, предсказывающих
определенный геометрический параметр. Для модели, предсказывающей
параметры H44 и H45 – длину диффузора сверху и снизу, было увеличено
число итераций с целью достижения оптимальной точности. Все модели были
обучены на 480 признаках.
Проведённое исследование показало, что алгоритм на базе нейронной
сети требует доработки и в текущем виде непригоден для решения подобных
задач.
Алгоритм с использованием CatBoost показал, что модели без точечной
настройки, обученные лишь на 480 признаках, показывают успешный
результат. Также длительность работы по обучению моделей совместно с
предсказанием геометрии по заданным входным параметрам занимает
значительно
меньше
времени,
чем
длительность
вычислений
на
специализированном программном обеспечении.
В дальнейшем планируется доработка обоих алгоритмов и повторное
сравнение.
17
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1 Бирюк, В. В. Расчёт на прочность элементов ДВС с помощью ANSYS с
учётом тепловых процессов в камере сгорания / В. В. Бирюк, А. А.
Горшкалёв, С. С. Каюков, Е. А. Сайгкаков // Вестник Самарского
государственного аэрокосмического университета им. академика СП
Королёва (национального исследовательского университета). – 2015. –
Т. 14. – №. 2. – С. 35-43. – URL: https://cyberleninka.ru/article/n/raschyotna-prochnost-elementov-dvs-s-pomoschyu-ansys-s-uchyotom-teplovyhprotsessov-v-kamere-sgoraniya (дата обращения: 25.12.2023).
2 Тихонов, О. А. Моделирование процесса горения в камере сгорания НК38СТ на базе программного комплекса ANSYS / О. А. Тихонов, А. Н.
Сабирзянов, А. В. Бакланов, Р. А. Шайдуллин // Перспективы развития
двигателестроения: материалы междунар. науч.-техн. конф. им. НД
Кузнецова (21–23 июня 2023 г.): в 2 т. – Текст: электронны. – 2023. –
URL:
http://repo.ssau.ru/handle/Perspektivy-razvitiya-
dvigatelestroeniya/Modelirovanie-processa-goreniya-v-kamere-sgoraniyaNK38ST-na-baze-programmnogo-kompleksa-ANSYS-105941
(дата
обращения: 25.12.2023).
3 Хлопков,
Ю.
И.
аэродинамических
Разработка
характеристик
нейронных
сетей
высокоскоростных
для
расчета
летательных
аппаратов / Ю. И. Хлопков, Е. А. Дорофеев, М. Зея, М. С. Поляков, А.
Ю. Хлопков, И. Агаева // Фундаментальные исследования. – 2013. - №.
11-9. – С. 1834-1840. – URL: https://s.fundamental-research.ru/pdf/2013/119/33466.pdf (дата обращения: 25.12.2023).
4 Nabhani, M. An empirical-statistical model for laser cladding of Ti-6Al-4V
powder on Ti-6Al-4V substrate / M. Nabhani, R. S. Razavi, M. Barekat //
Optics & Laser Technology. – 2018. – V. 100. – P. 265-271. URL:
https://www.sciencedirect.com/science/article/pii/S0030399217310927
(дата обращения: 25.12.2023).
18
5 CatBoost – open-source gradient boosting library [Electronic resource]. –
URL: https://catboost.ai/ (Дата обращения: 26.12.2023).
6 Перевезенцев, Е. Е. Аспекты реализации библиотеки градиентного
бустинга CatBoost / Е. Е. Перевезенцев, В. В. Ромашкова //
Информационные
технологии.
–
–
2018.
С.
69-71.
–
URL:
(дата
https://elibrary.ru/download/elibrary_36519582_87723824.pdf
обращения: 02.01.2024). – Режим доступа: для зарегистр. пользователей.
7 Арзамасцев, С. А. Предсказание оттока абонентов: сравнение методов
машинного обучения / С. А. Арзамасцев, М. В. Бгатов, Е. Н. Картышева,
В. А. Деркунский, Д. Н. Семенчиков // Компьютерные инструменты в
образовании.
–
2018.
–
№.
–
5.
С.
5-23.
–
URL:
https://cyberleninka.ru/article/n/predskazanie-ottoka-abonentov-sravneniemetodov-mashinnogo-obucheniya (дата обращения: 02.01.2024).
8 Учебник по машинному обучению [Электронный ресурс]. – URL:
https://academy.yandex.ru/handbook/ml (Дата обращения: 02.01.2024).
9 Szczepanek, R. Daily Streamflow Forecasting in Mountainous Catchment
Using XGBoost, LightGBM and CatBoost / R. Szczepanek // Hydrology. –
2022. – V. 9. – №. 12. – P. 226. – URL: https://www.mdpi.com/23065338/9/12/226 (дата обращения: 02.01.2024).
10 Badr, A. A. CatBoost Machine Learning Based Feature Selection for Age and
Gender Recognition in Short Speech Utterances / A. A. Badr, A. K. AbdulHassan // International Journal of Intelligent Engineering & Systems. – 2021.
– V. 14. – №. 3. – URL: https://www.inass.org/2021/2021063014.pdf (дата
обращения: 02.01.2024).
11 Dhananjay, B. Analysis and classification of heart rate using CatBoost feature
ranking model / B. Dhananjay, J. Sivaraman // Biomedical Signal Processing
and
Control.
–
2021.
–
V.
68.
–
P.
102610.
–
URL:
https://www.sciencedirect.com/science/article/pii/S174680942100207X
(дата обращения: 02.01.2024).
19
12 Ahn, J. M. Ensemble Machine Learning of Gradient Boosting (XGBoost,
LightGBM, CatBoost) and Attention-Based CNN-LSTM for Harmful Algal
Blooms Forecasting / J. M. Ahn, J. Kim, K. Kim // Toxins. – 2023. – V. 15. –
№. 10. – P. 608. – URL: https://www.mdpi.com/2072-6651/15/10/608 (дата
обращения: 02.01.2024).
13 Милютин, И. Функции активации нейросети: сигмоида, линейная,
ступенчатая, ReLu, tahn : [сайт] / И. Милютин // Neurohive/ - 2018. – URL:
https://neurohive.io/ru/osnovy-data-science/activation-functions
(дата
обращения: 03.01.2024).
14 Keras 3 API documentation : [сайт]. – 2024. – URL: https://keras.io/api (дата
обращения: 03.01.2024).
20
ПРИЛОЖЕНИЕ А
Код алгоритма с использованием CatBoost
import pandas as pd
import numpy as np
from catboost import CatBoostClassifier, metrics
from sklearn.model_selection import train_test_split
# считываем данные
df = pd.read_excel('diff.xlsx')
# смотрим количество пустых значений
df.isnull().sum()
# удаляем лишнее
df = df.dropna()
# переименовываем столбцы
df.columns = ["H45", "V56", "A55", "A57", "A58", "H44", "OutP", "InP", "Loss"]
# разделяем данные на выборки
df_train_main, df_validation = train_test_split(df, train_size=0.8)
df_train, df_test = train_test_split(df_train_main, train_size=0.7)
def split_data(X_keys, Y_key):
return df_train[X_keys], df_test[X_keys], df_train[Y_key], df_test[Y_key]
# По OutP, InP, Loss найти H44 и H45
X_h44 = df_train_main[["OutP", "InP", "Loss"]]
Y_h44 = df_train_main.H44
X_test_h44 = df_test[["OutP", "InP", "Loss"]]
X_h44_train, X_h44_test, Y_h44_train, Y_h44_test = split_data(["OutP", "InP",
"Loss"], "H44")
cat_features_h44 = np.where(X_h44.dtypes != float)[0]
# Тренировка модели
modelH44 = CatBoostClassifier(iterations=2800, eval_metric=metrics.Accuracy())
modelH44.fit(
X=X_h44,
y=Y_h44,
cat_features=cat_features_h44,
eval_set=(X_h44_test, Y_h44_test),
verbose=False,
plot=True
)
# По H44, H45, OutP, InP, Loss найти V56
X_v56 = df_train_main[["H44", "OutP", "InP", "Loss"]]
Y_v56 = df_train_main.V56
X_test_v56 = df_test[["H44", "OutP", "InP", "Loss"]]
X_v56_train, X_v56_test, Y_v56_train, Y_v56_test = split_data(["H44", "OutP", "InP",
"Loss"], "V56")
21
cat_features_v56 = np.where(X_v56.dtypes != float)[0]
modelV56 = CatBoostClassifier(iterations=100, eval_metric=metrics.Accuracy())
modelV56.fit(
X=X_v56,
y=Y_v56,
cat_features=cat_features_v56,
eval_set=(X_v56_test, Y_v56_test),
verbose=False,
plot=True
)
# По V56, H44, H45, OutP, InP, Loss найти A55
X_a55 = df_train_main[["V56", "H44", "OutP", "InP", "Loss"]]
Y_a55 = df_train_main.A55
X_test_a55 = df_test[["V56", "H44", "OutP", "InP", "Loss"]]
X_a55_train, X_a55_test, Y_a55_train, Y_a55_test = split_data(["V56", "H44", "OutP",
"InP", "Loss"], "A55")
cat_features_a55 = np.where(X_a55.dtypes != float)[0]
modelA55 = CatBoostClassifier(iterations=100, eval_metric=metrics.Accuracy())
modelA55.fit(
X=X_a55,
y=Y_a55,
cat_features=cat_features_a55,
eval_set=(X_a55_test, Y_a55_test),
verbose=False,
plot=True
)
# По V56, A55, H44, H45, OutP, InP, Loss найти A57
X_a57 = df_train_main[["V56", "A55", "H44", "OutP", "InP", "Loss"]]
Y_a57 = df_train_main.A57
X_test_a57 = df_test[["V56", "A55", "H44", "OutP", "InP", "Loss"]]
X_a57_train, X_a57_test, Y_a57_train, Y_a57_test = split_data(["V56", "A55", "H44",
"OutP", "InP", "Loss"], "A57")
cat_features_a57 = np.where(X_a57.dtypes != float)[0]
modelA57 = CatBoostClassifier(iterations=100, eval_metric=metrics.Accuracy())
modelA57.fit(
X=X_a57,
y=Y_a57,
cat_features=cat_features_a57,
eval_set=(X_a57_test, Y_a57_test),
verbose=False,
plot=True
)
# По A57, V56, A55, H44, H45, OutP, InP, Loss найти A58
X_a58 = df_train_main[["A57", "V56", "A55", "H44", "OutP", "InP", "Loss"]]
Y_a58 = df_train_main.A58
22
X_test_a58 = df_test[["A57", "V56", "A55", "H44", "OutP", "InP", "Loss"]]
X_a58_train, X_a58_test, Y_a58_train, Y_a58_test = split_data(["A57", "V56", "A55",
"H44", "OutP", "InP", "Loss"],
"A58")
cat_features_a58 = np.where(X_a58.dtypes != float)[0]
modelA58 = CatBoostClassifier(iterations=100, eval_metric=metrics.Accuracy())
modelA58.fit(
X=X_a58,
y=Y_a58,
cat_features=cat_features_a58,
eval_set=(X_a58_test, Y_a58_test),
verbose=False,
plot=True
)
# Тест
def test(validation_df):
valid = validation_df.copy()
outP = []
# находим выходное давление
for i in range(valid.shape[0]):
inP = valid.loc[valid.index.values[i]].InP
loss = valid.loc[valid.index.values[i]].Loss
outP.append(inP - ((loss * inP) / 100))
valid.insert(0, "OutP", outP, False)
# находим H44 и H45
predictions_h44 = modelH44.predict(valid)
valid.insert(0, "H44", predictions_h44, False)
# находим V56
predictions_v56 = modelV56.predict(valid)
valid.insert(0, "V56", predictions_v56, False)
# находим A55
predictions_a55 = modelA55.predict(valid)
valid.insert(1, "A55", predictions_a55, False)
# находим A57
predictions_a57 = modelA57.predict(valid)
valid.insert(2, "A57", predictions_a57, False)
# находим A58
predictions_a58 = modelA58.predict(valid)
valid.insert(3, "A58", predictions_a58, False)
valid.insert(0, "H45", predictions_h44, False)
return valid
answer_df = test(df_validation[["InP", "Loss"]])
answer_df.to_excel('ResultCatBoost.xlsx')
23
ПРИЛОЖЕНИЕ Б
Код алгоритма с использованием нейронной сети
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import Dense, LSTM
df = pd.read_excel('diff.xlsx')
# удаляем лишнее
df = df.dropna()
# переименовываем столбцы
df.columns = ["H45", "V56", "A55", "A57", "A58", "H44", "OutP", "InP", "Loss"]
# Разделение на признаки и классы
y = df[["H45", "V56", "A55", "A57", "A58", "H44"]]
X = df[["OutP", "InP", "Loss"]]
# Разбиение выборок
X_train_main, X_validation, Y_train_main, Y_validation = train_test_split(X, y,
train_size=0.8)
X_train, X_test, Y_train, Y_test = train_test_split(X_train_main, Y_train_main,
train_size=0.7)
X_train = X_train.to_numpy()
X_test = X_test.to_numpy()
Y_train = Y_train.to_numpy()
Y_test = Y_test.to_numpy()
# Формирование и обучение модели
model = Sequential()
model.add(LSTM(X_train.shape[1], return_sequences=True,
input_shape=[X_train.shape[1], 1], activation='relu'))
model.add(LSTM(X_train.shape[1], return_sequences=False, activation='relu'))
model.add(Dense(Y_train.shape[1]))
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])
history = model.fit(X_train, Y_train, batch_size=1, epochs=200,
validation_data=(X_test, Y_test))
# График зависимости потерь от эпох
losses_history = history.history['loss']
plt.plot([(i + 1) for i in range(len(losses_history))], losses_history)
plt.title("Потери нейронной сети в ходе обучения")
plt.ylabel('Процент потерь')
plt.xlabel('Эпохи обучения')
plt.show()
# Тестирование
def test(df_validation):
valid = df_validation.copy()
outP = []
# находим выходное давление
24
for i in range(valid.shape[0]):
inP = valid.loc[valid.index.values[i]].InP
loss = valid.loc[valid.index.values[i]].Loss
outP.append(inP - ((loss * inP) / 100))
valid.insert(0, "OutP", outP, False)
return model.predict(valid.to_numpy())
test_var = pd.DataFrame({'InP': [3204527],
'Loss': [0.397], 'OutP': [3204527 - ((0.397 * 3204527) /
100)]}, index=[0])
result = model.predict(test_var.to_numpy())
res_df = pd.DataFrame({"H45": [result[0][0]],
"V56": [result[0][1]],
"A55": [result[0][2]],
"A57": [result[0][3]],
"A58": [result[0][4]],
"H44": [result[0][5]],
"OutP": [3204527 - ((0.397 * 3204527) / 100)],
"InP": [3204527],
"Loss": [0.397]}, index=[0])
res_df.to_excel('ResultNeuralNetwork.xlsx')
25
Download