/
Tags: искусственный интеллект
ISBN: 978-5-9729-1547-7
Text
f
I
П. А. Пылов
P. В. Майтак
А. В. Дягилева
ОСНОВЫ РАБОТЫ
С МОДЕЛЯМИ МАШИННОГО
И ГЛУБОКОГО ОБУЧЕНИЯ
П. А. Пылов, Р. В. Майтак, А. В. Дягилева
ОСНОВЫ РАБОТЫ С МОДЕЛЯМИ МАШИННОГО
И ГЛУБОКОГО ОБУЧЕНИЯ
Учебное пособие
Москва Вологда
«Инфра-Инженерия»
2023
УДК 004.8
ББК 32.813
П94
Рецензенты:
доктор технических наук, профессор, академик РЭА, ведущий научный сотрудник
АО «НЦ ВостНИИ» Вадим Васильевич Иванов;
доктор технических наук, профессор кафедры математики ФГБОУ ВО «Кузбасский
государственный университет имени Т. Ф. Горбачева» Инна Алексеевна Ермакова;
доктор технических наук, профессор, академик РЭА, ведущий научный со грудник
АО <<1Щ ВостНИИ» Виктор Семенович Зыков
Пылов, П. А.
П94 Основы работы с моделями машинного и глубокого обучения :
учебное пособие / П. А. Пылов, Р. В. Майтак, А. В. Дягилева. - Москва ;
Вологда : Инфра-Инженерия, 2023. - 256 с. : ил., табл.
ISBN 978-5-9729-1547-7
Представлены необходимые инструменты для программной и математической
разработки моделей прикладного машинного и глубокого обучения. Показаны базо-
вые принципы и аспекты, которыми оперирует область Data Science. Дан ознакоми-
тельный экскурс ио теоретической составляющей курса, для калетой рассмотренной
модели машинного/глубокого обучения поставлена в соответствие её прикладная реа-
лизация.
Для студентов, обучающихся по направлению подготовки «Искусственный ин-
теллект». Может быть полезно специалистам в области искусственного интеллекта.
УДК 004.8
ББК 32.813
ISBN 978-5-9729-1547-7
© Пылов П. А., Майтак Р. В.. Дягилева А. В., 2023
© Издательство «Инфра-Инженерия», 2023
© Оформление. Издательство «Инфра-Инженерия», 2023
Оглавление
Введение...........................................................5
Глава 1. Теоретические положения базовых алгоритмов машинного
и глубокого обучения............................................. 6
Алгоритм линейной рефессии..................................... 6
Алгоритм логистической регрессии................................10
Гребневая регрессия.............................................12
Алгоритм к ближайших соседей (к Nearest Neighbor)...............16
Алгоритм деревья решений (Decision Tree)........................20
Наивный Байес (классификатор)...................................28
Метод опорных векторов........................................ 31
Алгоритм кластеризации на основе плотности......................37
Генетические алгоритмы..........................................41
Алгоритм ансамблирования бэггинг................................47
Алгоритм ансамблирования стекинг................................51
Сеть векторного квантования (LVQ)...............................54
Кластеризация на основе распределений...........................57
Алгоритм кластеризации кластерный центроид......................65
Иерархические алгоритмы (иерархия кластеров)....................71
Искусственная нейронная сеть....................................72
Рекуррентная нейронная сеть.....................................85
Глава 2. Практическая реализация базовых алгоритмов машинного
и глубокого обучения на языке программирования Python 3.9.1.......93
Алгоритм линейной рефессии......................................93
Алгоритм логистической регрессии...............................116
Гребневая рефессия........................................... 121
Алгоритм к ближайших соседей (к Nearest Neighbor)..............126
Алгоритм деревья решений (Decision Tree).......................129
Наивный Байес (классификатор)..................................134
Метод опорных векторов....................................... 142
Ачгоритм кластеризации на основе плотности................... 162
Генетические алгоритмы.........................................178
Алгоритм ансамблирования бэггинг...............................185
Алгоритм ансамблирования стекинг............................. 193
Сеть векторного квантования (LVQ)..............................199
Кластеризация на основе распределений.........................209
Алгоритм кластеризации кластерный центроид....................215
Иерархические алгоритмы (иерархия кластеров)..................223
Искусственная нейронная сеть..................................232
Рекуррентная нейронная сеть...................................240
Библиографический список........................................247
Приложение А. Варианты заданий для самостоятельной реализации
моделей машинного и глубокого обучения..........................251
Введение
Настоящий учебно-методический комплекс предназначен для освоения
базовых принципов и аспектов, которыми оперирует область Data Science. По-
сле ознакомительного экскурса по теоретической составляющей курса для каж-
дой рассмотренной модели машинного / глубокого обучения поставлена в соот-
ветствие её прикладная реализация.
Освоение студентами навыков и умений по реализации алгоритмов ма-
шинного / глубокого обучения проверяется самостоятельным выполнением ими
контрольного задания в виде реализации изученной модели на новом наборе
данных в рамках отличающейся предметной области.
Это позволяет закрепить полученные умения и развивать творческое
мышление для решения задачи другой прикладной области.
Изучение алгоритмов может быть направлено как по последовательному
пути изучения (в порядке следования моделей машинного / глубокого обуче-
ния), так и в произвольном порядке, при условии сохранения целостности кор-
тежа теория - практика.
ГЛАВА 1. ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ БАЗОВЫХ
АЛГОРИТМОВ МАШИННОГО И ГЛУБОКОГО ОБУЧЕНИЯ
Алгоритм линейной регрессии
Линейная рецессия
Линейная регрессия - один из самых простых инструментов статистиче-
ского моделирования, но именно в его простоте и заключается его эффектив-
ность. Для начала необходимо понять значение термина. В упрощенном виде
регрессионный анализ можно определить, как способ описания взаимоотноше-
ний между зависимой переменной и набором независимых переменных.
Например, с помощью этого метода при наличии набора данных о росте, весе,
поле и других физических параметрах ребенка, мы можем описать влияние
этих переменных на целевую переменную - рост этого человека во взрослом
возрасте.
Что значит сам термин «регрессия»?. В основном, это просто дань тради-
ции: он возник несколько веков назад и прочно закрепился в обиходе. Суще-
ствует известный термин «регрессия к среднему значению». За ним скрывается
мысль о том, что данные могут отклоняться от ожидаемого «среднего» значе-
ния, но, если наблюдений много, они возвращаются или «регрессируют» к про-
гнозируемому значению. Например, у высокого человека почти наверняка бу-
дут высокие дети. Они могут «регрессировать» к среднему значению роста, но
вряд ли окажутся выше своего родителя.
Регрессия моделирует числовые отношения, то есть выходные данные ре-
грессионного анализа - всегда число. Этим он отличается от категоризации, ре-
зультатом которой является класс объектов или метка для исходных данных.
Вторая часть термина «линейная регрессия» подчеркивает линейный характер
зависимости между переменными.
Рассмотрим две непрерывные переменные х= (хь хз,хп), у=(уь У2, J/Л
Разместим точки на двумерном графике рассеяния и скажем, что име-
ем линейное соотношение, если данные аппроксимируются прямой линией. Ес-
ли полагать, что у зависит отх, причём изменения в у вызываются именно из-
менениями вх, можно определить линию регрессии (регрессия у на х), которая
лучше всего описывает прямолинейное соотношение между этими двумя пере-
менными.
Статистическое использование слова «регрессия» исходит из явления,
известного как регрессия к среднему, приписываемого сэру Френсису Гальтону
(1889).
Он показал, что, хотя высокие отцы имеют тенденцию иметь высоких
сыновей, средний рост сыновей меньше, чем у их высоких отцов. Средний рост
сыновей «регрессировал» и «двигался вспять» к среднему росту всех отцов в
популяции. Таким образом, в среднем высокие отцы имеют более низких (но
всё-таки высоких) сыновей, а низкие отцы имеют сыновей более высоких (но
всё-тики довольно низких).
Линия репрессии
Математическое уравнение, которое оценивает линию простой (парной)
линейной регрессии:
У= а + Ьх,
где х- независимая переменная или предиктор.
Y- зависимая переменная или переменная отклика. Это значение, которое ожи-
дается для у (в среднем), если знать величину х, т. е. это «предсказанное значе-
ние у»
а- свободный член (пересечение) линии оценки; это значение К, ко-
гда х=0 (рис. 1);
b - угловой коэффициент или градиент оцененной линии; она представляет
собой величину, на которую У увеличивается в среднем, если при этом уве-
личиваем х на одну единицу;
а и b называют коэффициентами регрессии оценённой линии, хотя этот тер-
мин часто используют только для Ь.
Парную линейную регрессию можно расширить, включив в нее более од-
ной независимой переменной; в этом случае она известна как множественная
регрессия.
Рисунок 1 - Линия линейной регрессии, показывающая пересечение а
и угловой коэффициент b (величину возрастания Y при увеличении х
на одну единицу)
Mei од наименьших квадраюв
Регрессионный анализ выполняется, используя выборку наблюдений,
где а и b - выборочные опенки истинных (генеральных) параметров, аир, ко-
торые определяют линию линейной регрессии в популяции (генеральной сово-
купности).
Наиболее простым методом определения коэффициентов а и Л являет-
ся метод наименьших квадратов (МНК).
Подгонка оценивается, рассматривая остатки (вертикальное расстояние
каждой точки от линии, например, остаток = наблюдаемому у - предсказан-
ный jv, рис. 2).
Линию лучшей подгонки выбирают так, чтобы сумма квадратов остатков
была минимальной.
Рисунок 2 - Линия линейной регрессии с изображенными остатками
(вертикальные пунктирные линии) для каждой точки
Предположения линейной peipeccnn
Для каждой наблюдаемой величины х остаток равен разнице у и соответ-
ствующего предсказанного У. Каждый остаток может быть положительным или
отрицательным.
Можно использовать остатки для проверки следующих предположений,
лежащих в основе линейной регрессии:
• между х и у сущеетвует линейное соотношение: для любых пар (х;у) дан-
ные должны аппроксимировать прямую линию. Если нанести на дву-
мерный график остатки, то необходимо наблюдать случайное рассеяние
точек, а не какую-либо систематическую картину;
• остатки нормально распределены с нулевым средним значением;
* остатки имеют одну и ту же вариабельность (постоянную дисперсию)
для всех предсказанных величину Если нанести остатки против пред-
сказанных величин У от v на графике будет случайное рассеяние точек.
Если график рассеяния остатков увеличивается или уменьшается с уве-
личением У. то это допущение не выполняется.
Если допущения линейности, нормальности и/или постоянной дисперсии
сомнительны, необходимо преобразовать .г или у и рассчитать новую линию ре-
грессии, для которой эти допущения удовлетворяются (например, использовать
логарифмическое преобразование или др.).
Оценка качества линейной регрессии: коэффициеш детерминации R-
Из-за линейного соотношения и х ожидается, что >’изменяется, по мере
того как изменяется х', и называется это вариацией, которая обусловлена или
объясняется регрессией. Остаточная вариация должна быть как можно меньше.
Если это так, то большая часть вариации у будет объясняться регрессией,
а точки будут лежать близко к линии регрессии, т. е. линия хорошо соответ-
ствует данным.
Долю общей дисперсии у которая объясняется регрессией называ-
ют коэффициентом детерминации, обычно выражают через процентное соот-
ношение и обозначают R ’ (в парной линейной регрессии это величина г, квад-
рат коэффициента корреляции), позволяет субъективно оценить качество урав-
нения регрессии.
Разность (100-R2) представляет собой процент дисперсии, который нельзя
объяснить регрессией. Нет формального теста для оценки /?-; необходимо по-
ложиться на субъективное суждение, чтобы определить качество подгонки ли-
нии регрессии.
Применение линии peipecemi для npoi низа
Можно применять регрессионную линию для прогнозирования у зна-
чения по значению х в пределе наблюдаемого диапазона (никогда не экстрапо-
лируйте вне этих пределов).
Предсказываем среднюю величину у для наблюдаемых, которые имеют
определенное значениех путем подстановки этого значениях в уравнение ли-
нии регрессии.
Итак, если х=хо прогнозируем у как Yo=a+bxo. Используем эту предска-
занную величину и ее стандартную ошибку, чтобы оценить доверительный ин-
тервал для истинной средней величины у в популяции.
Повторение этой процедуры для различных величин х позволяет постро-
ить доверительные границы для этой линии. Это полоса или область, которая
содержит истинную линию, например, с 95 % доверительной вероятностью.
Подобным образом можно рассчитать более широкую область, внутри
которой, как ожидается, лежит наибольшее число (обычно 95 %) наблюдений.
Эффективность модели линейной pci рессии
Модели линейной регрессии очень популярны в различных сферах иссле-
дований благодаря быстроте их создания и простоте интерпретации. Благодаря
возможности преобразования данных, они могут быть использованы для моде-
лирования широкого спектра зависимостей. Благодаря простоте формы, по
сравнению с нейронными сетями, их статистические параметры легко поддают-
ся анализу и сравнению, что позволяет извлекать из них пенную информа-
цию. Линейная регрессия используется не только в прогностических целях; она
также показала свою эффективность в описании систем.
Если существует необходимость смоделировать значения числовой пере-
менной, имеется относительно небольшой список независимых переменных,
скорее всего, выбор упадет именно на линейную регрессию в качестве инстру-
мента моделирования.
Алгоритм логистической регрессии
Основная идея логистической регрессии основана на линейной модели
классификации. Для линейной модели классификации с двумя классами при-
нимается конкретно заданная функция потерь, которая имеет следующий вид
(рисунок 1).
Рисунок 1 - Функция потерь логистической регрессии
Рисунок 1 характеризует гладкую оценку сверху (красный цвет графика)
для пороговой функции потерь (изображена синим цветом).
Функция потерь имеет строгий математический вид (1).
£(М) = log(l + (1)
Кроме этого, известно, что между функцией потерь и вероятностной мо-
делью данных существует связь. Она позволяет нам зафиксировать, что модель
является линейной, а функция потерь данной модели - логарифмической.
Такой вывод, который напрямую следует методом математической де-
дукции из законов линейных аппроксимирующих моделей, позволяет нам счи-
тать вероятности для объектов классов.
Иными словами, для каждого объектах который мы классифицируем, мы
можем точно определить, с какой вероятностью он будет отнесен к классу}’.
Модель условной вероятности (2) в явном виде вытекает из логарифмиче-
ской функции потерь (1):
P(y|x,w) = <г(М) = - 1 (2)
JL I Си
Формула (2) позволяет вычислять апостериорные вероятности классов,
что и является решением задачи регрессии (или решением задачи классифика-
ции, если номинальные признаки можно перевести в дихотомические).
Для того, чтобы получить формулу (2), также можно было возвести в экс-
понент линейную дискриминантную функцию (3), которая отвечает за миними-
зацию аппроксимированного эмпирического риска:
i
Q(w) = £(ytg(Xi, W))
1=1
-» min (3)
Отметим также, что сигмоидная функция сг(М) (изображена на втором
рисунке) из формулы (2) имеет свойство переводить любое действительное
число (от -оо до +ос) монотонным образом в оценку от нуля до единицы.
Рисунок 2 - Сигмоидная функция
Из рисунка 2 наиболее наглядна целостная геометрическая важность та-
кой коррекции: совершенно любое число признака переводится в диапазон зна-
чений, в котором лежат вероятности объектов классов (от 0 до J). Это позволя-
ет работать с признаками набора данных в вероятностных оценках, заметно
улучшая обобщающую способность алгоритма при решении прикладной зада-
чи, а также снижая трудоемкость написания модели машинного обучения.
Для чего может пригодиться вычислять вероятность классов в задаче
классификации'?
Это 1ребуется в любых задачах, где кроме классификации (принятия ре-
шения) нужно оценивать риски принятия такого решения. Поэтому судить о
том, насколько качественно выполнена классификация можно по контрольной
метрике, выполняя одновременно решение задачи регрессии и классификации.
Если же для ответа достаточно только отнести объект к заданному классу
(например, определить, является вино «плохим» или оно «хорошее»), то нет
необходимости решать задачу в терминах регрессионной аналитики, так как с
поставленными условиями идеально справляется задача классификации.
Обобщение логистической регрессии на произвольное число классов мо-
жет быть выражено в следующем виде (4).
а (%) = arg max(wv, х) (4)
yeY z
В формуле (4) параметры х, vvy е /?".
Таким образом, обобщение на многоклассовую задачу, разрешаемую ме-
тодом логистической регрессии, основано на аргументе максимизации (то есть
на основе модели логистической регрессии разрешается задача максимизации
правдоподобия).
Максимизация правдоподобия также может быть записана через миними-
зацию потери (ошибки) в строгом математическом виде в формате формулы
(5).
i
<?О) = ^log(l +ехр(-<и/,х;)у()) +|||w||2 -> min (5)
f=l
В формуле (5) решается обратная (по отношению к формуле (4)) задача -
минимизация потери алгоритма логистической регрессии, причем слагаемое
|||w||2 является регуляризацией алгоритма.
Регуляризация — это введение дополнительных ограничений в рамках те-
кущей математической архитектуры модели машинного обучения с той целью,
чтобы предотвратить переобучение алгоритма.
Процесс переобучения возникает в следствии того, что модель всегда
обучается на предоставленной выборке, не исследуя при этом всю генеральную
совокупность данных. Таким образом, слагаемое ^||w||2, которое дополни-
тельно вводится как ограничительное условие алгоритма, позволяет избежать
этой проблематики в случае с моделью логистической регрессии.
Гребневан регрессия
Для понимания применения гребневой регрессии, важно изучить,
что линейная зависимость устанавливает строгую функциональную связь меж-
ду зависимой переменной и независимой - линию лучшего совпадения и дает
прогноз на значение целевой числовой переменной. Другими словами, дает
прогноз взаимосвязи между независимыми и зависимыми переменными некого
свода данных.
Гребневая регрессия (ридж-регрессия)
Рисунок 1 - Графики гребневой регрессии
Сравнение погрешностей в зависимости лассо (слева) и гребневой зави-
симости (справа). Гребневая зависимость применяет регуляризацию L2, ее
площадь походит на круг, тогда как регуляризация лассо L1 обрисовывает
непосредственные прямые линии. Выделим для понимания двухмерное про-
странство независимых переменных. В случае зависимости лассо ограничение
на коэффициенты представляет собой ромб (|pi +’p2|<t|p! |+|p2|<t), в случае
гребневой регрессии - круг (/?21 + /322 < t2[312 + /722 < t2). Нужно снизить
до минимума функцию ошибки, но при этом учесть ограничения на коэффици-
енты. Непосредственно, с геометрической точки зрения задача состоит в том,
чтобы найти точку соприкосновения линии, которая показывает функцию
ошибки с фигурой, отражающей ограничения на рр. Из рисунка 1.1 видно, что в
случае лассо-регрессии, вероятно, точка будет расположена на углах ромба,
т. е. лежать на оси, тогда как в случае гребневой зависимости - происходит
очень редко. При приближении точки к оси, один из совокупностей данных ко-
эффициентов будет близок к нулю, а это значит, результат соответствующей
независимой переменной не учитывается.
В случае высокой коллинеарности переменных обычная линейная и по-
линомиальная регрессии делаются неэффективными. Коллинеарность - это от-
ношение самостоятельных переменных, близкое к линейному. Фактическое
присутствие коллинеарности определяется следующими особенностями:
* коэффициент зависимости не учитывается несмо!ря на то, что, теорети-
чески, аргумент может быть высок с корреляцией Y,
• при изменении переменной матрицы X, показатель зависимости стреми-
тельно меняется.
• переменные матрицы X имеют высокие попарные корреляции.
Первоначально возможно взглянуть на функцию оптимизации обычной
линейной регрессии для наилучшего понятия того, как возможно поможет
гребневая регрессия:
min || Xw — у ||2
где X - это матрица переменных, w - веса, у - достоверные данные. Гребневая
регрессия - это корректирующее ограничение для уменьшения коллинеарности
между предикторными переменными в модели зависимости. Коллинеарность -
явление, при котором некая переменная во множественной регрессионной мо-
дели может быть показана линейно, отталкиваясь от других параметров со зна-
чительной степенью точности. Исходя из этого, с помощью возвышенной кор-
реляции переменных, результат модели зависимости будет сведен к минималь-
ным пределам нахождения значения, то есть она имеет повышенную диспер-
сию.
Гребневая зависимость прибавляет маленький фактор квадратного сме-
щения ради снижения дисперсии:
min || Xw — у ||2 + z|| w ||2
Подобный фактор смещения иссечёт коэффициенты переменных из стро-
гих ограничений, вводя в модель незначительное смещение, но при этом суще-
ственно снижая дисперсию.
Несколько значительных пунктов о гребневой регрессии:
• Допущения предоставленной регрессии подобные же, как и в методе
минимальных квадратов, помимо такого факта, что нормальное распо-
ложение в гребневой регрессии не предполагается.
• Это сокращает значимость коэффициентов, сохраняя их ненулевыми,
что подразумевает дефицит отбора признаков.
Гребневая зависимость или Ridge regression сильно схожа на зависимость
ЛАССО в том, что она использует сжатие. Оба алгоритма подходят для наборов
предоставленных данных с великим числом признаков, которые не являются
самостоятельными друг от друга (коллинеарность).
Самос крупное расхождение среди них в том, что гребневая зависимость
применяет регуляризацию L2, то есть ни один из коэффициентов не становится
нулевым, будто это происходит в регрессии LASSO, взамен данного коэффици-
енты всё более близятся к нулю, но не обладают крупного стимула достигнуть
его из-за натуры регуляризации L2.
В лассо усовершенствование от погрешности 5 до ошибки 4 взвешивается
так же, как улучшение от 4 до 3, а также от 3 до 2, от 2 до 1 и от 1 по 0. Следо-
вательно, более коэффициентов доносится нуля и устраняется более признаков.
Тем не менее, в гребневой регрессии усовершенствование от почетно-
сти 5 до ошибки 4 рассчитывается как 52 - 42 = 9, тогда как усовершенствова-
ние от 4 до 3 взвешивается исключительно как 7. понемногу вознаграждение за
улучшение уменьшается; следовательно, устраняется менее признаков.
Гребневая зависимость скорее соотносится с условиями задачи в ситуа-
ции, если мы желаем совершить приоритетными крупное количество перемен-
ных, всякие из которых обладают маленьким эффектом. Если в модели необхо-
димо учитывать несколько переменных, любая из которых имеет средний или
большой эффект, наилучшим предпочтением будет лассо.
Стандартизация переменных представляет собой раннюю процедуру в за-
висимости хребта. Как самостоятельные, так и зависимые переменные требуют
стандартизации с помощью вычитания их средних значений и разделения ре-
зультата на стандартные аномалии. Традиционной практикой представляет со-
бой указание в формуле, выступают ли переменные в ней стандартизирован-
ными или нет.
Исходя из этого, все расчеты зависимости хребта используют стандарти-
зированные переменные, дабы избежать обозначений о том. были ли стандар-
тизированы отдельные переменные. Затем относительный показатель может
быть возвращен к их изначальному масштабу.
Гребневая зависимость представляет собой наилучшую вариацию, чем
зависимость наименьших квадратов, когда переменные вариации выше, чем
наблюдения. Метод наименьших квадратов не может обозначить разницу меж-
ду более полезными и менее полезными переменными предиктора и включает
все вариации при разработке модели. Таким образом, снижается верность мо-
дели, что приводит к переоснащению и избыточности.
Все вышеуказанные проблемы решаются регрессией гребня. Регрессия
хребта работает с тем преимуществом, что не требует беспристрастных оце-
нок - скорее, она дополняет смещение к оценкам, дабы снизить стандартную
ошибку. Это дополняет смещение, достаточное для того, дабы осуществить
оценки надежным представлением совокупности данных.
Анализ хребта - это инструмент усадки, который используется в зависи-
мости хребта. Анализ усадки - это параметр, который создает новые оценки,
которые были сокращены, дабы дать значение, более близкое к реальным ха-
рактеристикам популяции. Анализ наименьших квадратов может быть умень-
шен с помощью ]'ребневого оценщика, дабы усовершенствовать оценку, непо-
средственно, когда в данных имеется мультиколлинеарность.
Регуляризация в регрессии хребта включает использование штрафа к ко-
эффициентам. Усадка подразумевает использование одного и того же коэффи-
циента на коэффициенты. Это значит, что ни один коэффициент не будет
оставлен без внимания при формировании модели.
Алгоритм к ближайших соседей (к Nearest Neighbor)
В основе машинного обучения лежит идея создания модели, которая
сможет на основе некоторых имеющихся исторических данных изучить тен-
денцию и суметь воспроизвести её в дальнейшем на сопоставимых данных.
Рисунок 1 - Схема основного процесса машинного обучения
На примере рисунка 1 можно продемонстрировать основной процесс ма-
шинного обучения. Слева имеются исходные данные о фигурах и их положении
в пространстве. Эти данные переводятся в правила принятия решения. Для
определения, в какой квадрат попадет фигура, необходимо знать ширину и вы-
соту, на которой она находится. В свою очередь, квадрат, в который попала фи-
гура, определяет форму, которой она скорее всего будет обладать.
Для решения этой задачи можно использовать несколько моделей. Мо-
дель - это математическая формула, которая может быть использована для опи-
сания данных. В данном случае, можно воспользоваться линейной моделью,
которая использует линейную функцию у = ах + Ь. Такая модель еще называ-
ется линейной регрессией.
Линейная регрессия - зависимость одной переменной X от одной или не-
скольких других переменных (факторов, независимых переменных, регрессо-
ров). Эта модель проста в использовании, но не всегда даёт точные прогнозы.
Поэтому с развитием машинного обучения было придумано множество алго-
ритмов, которые лучше справляются со своей задачей. Алгоритм к ближайших
соседей является одним из них.
В сравнении с другими алгоритмами, можно выделить некоторые особен-
ности алгоритма:
• алгоритм к ближайших соседей является контролируемым алгоритмом
машинного обучения.
Различают контролируемые и неконтролируемые алгоритмы. Особен-
ность контролируемых алгоритмов заключается в том, что одновременно суще-
ствует два типа переменных: целевая и независимая.
Целевая (зависимая) переменная - переменная, которую необходимо
спрогнозировать. Она неизвестная заранее и зависит от других переменных.
Независимая (объясняющая) переменная - переменные, которые извест-
ны заранее.
Например, основываясь на рис. 1, целевая переменная - форма фигуры, а
высота и ширина - независимые переменные;
• алгоритм к ближайших соседей является нелинейным алгоритмом
обучения.
Линейный модели - модели, которые осуществляют прогнозирование при
помощи линий или гиперплоскостей.
Рисунок 2 - Линейная модель
На рисунке 2 слева изображены исходные данные. Справа - линейная мо-
дель, которая способна отделить треугольники от нетреугольников.
Нелинейная модель - любая модель, которая использует любой подход,
кроме линейного. Самый яркий пример - дерево решений, которое в своей ос-
нове представляет из себя длинные список перечисления операторов if...else.
Это позволяет рисовать не только линии, но и любые необходимые формы.
Фактические наблюдения
Нелинейные модели
Высота
Рисунок 3 - Нелинейное решение
Из рисунка 3 видно, как область разбивается на три квадрата и с имею-
щимися входными данными - высота и ширина - можно предсказать форму
фигуры. С применением операторов if...else выглядеть это будет следующим
образом:
• если у точки низкая высота, то это треугольник;
• иначе, если маленькая ширина, то это крест;
• иначе это звезда.
На практике алгоритм к ближайших соседей можно использовать для ре-
шения задачи классификации - задача, которая позволяет отнести объект к од-
ному из классов, которые были заранее определены, на основе его формализо-
ванных признаков (форме, цвете, расстоянии). Объект представляется в виде
вектора в N-мерном пространстве, где каждое из измерений является одним из
признаков объекта. Например, поставлена задача классификации телевизоров.
В данном случае измерениями будут являться: величина диагонали, соотноше-
ние сторон, стоимость, наличие SMART-TV, тип матрицы и др.
Для того, чтобы обучить классификатор, необходимо иметь набор дан-
ных, у которых уже известен класс. Такое множество называется обучающая
выборка.
Следующим шагом будет классификация нового объекта. Для этого необ-
ходимо первоначально задать количество соседей к, классы которых уже опре-
делены. На основе этой цифры выбирается к ближайших соседей объекта, ко-
торый необходимо классифицировать. Из этого множества определяется класс,
к которому принадлежит большинство соседей и к этому же классу относится
классифицируемый объект.
Рисунок 4 - Алгоритм k-ближайшего соседа
Например, как видно на рис. 4 определены две области. Область со
сплошным кругом определяет к=3 ближайших соседей. В этом случае опреде-
ляемый объект будет установлен как фиолетовый треугольник, т. к. их боль-
шинство. В случае с к=5 объект будет определен как оранжевый квадрат.
Нахождение ближайших соседей до объекта происходит при помощи вы-
числения евклидового расстояния до имеющихся точек в пространстве и
нахождении к ближайших.
Евклидово расстояние - расстояние между двумя точками, вычисляемое
по следующей формуле:
JCxi-Xy)2 + (У[-Уу)2
B(Xj.Yj)
A(XI. Yi)
Рисунок 5 - Евклидово расстояние между двумя точками
в двумерном пространстве
Таким образом работа алгоритма к ближайших соседей выглядит следу-
ющим образом:
• Обучение модели на обучающей выборке.
• Выбор количества соседей к.
• Вычисление евклидового расстояния, поиск ближайших соседей.
• Определение класса нового объекта.
Алгоритм деревья решений (Decision Tree)
Дерево решений (Decision Tree) - это инструмент интеллектуального ана-
лиза данных, помогающий в решении задач по классификации и регрессии.
По отношению к интеллектуальным системам деревья решений относятся
к моделям, основанным на обучении с учителем (Supervised Learning). Обуче-
ние с учителем подразумевает наличие некоторой выборки, состоящей из вхо-
дов и выходов, между которыми существует какая-либо зависимость. Целью
обучения является максимально точное определение этой зависимости.
Дерево решений представляет собой иерархическую древовидную струк-
туру, состоящую из правила вида «если ..., то ...».
Пример дерева решений. Пусть на основании некоторых данных необхо-
димо определить, можно ли выдать человеку кредит или ему нужно отказать
(рисунок 1).
Рисунок 1 - Пример работы дерева решений
В отличие от нейронных сетей, деревья решений как аналитические мо-
дели проще, потому что правила генерируются на естественном языке. Правила
генерируются за счет обобщения множества отдельных наблюдений (обучаю-
щих примеров), описывающих предметную область. Эти наблюдения называют
индуктивными правилами, а сам процесс обучения - индукцией деревьев реше-
ний.
В обучающем множестве для примеров должно быть задано целевое зна-
чение. так как деревья решений - модели, создаваемые на основе обучения с
учителем. По типу целевой переменной выделяют два типа деревьев:
деревья классификации - имеют дискретную целевую переменную;
деревья регрессии - имеют непрерывную целевую переменную.
Структура дерева решений
Дерево решений - это метод представления решающих правил в опреде-
ленной иерархии, включающей в себя элементы двух типов - узлов и листьев.
Узлы включают в себя решающие правила и производят проверку примеров на
соответствие выбранного атрибута обучающего множества.
В качестве примера рассмотрим простой случай: элементы данных попа-
дают в узел, проходят проверку на основании правила и разбиваются на два
подмножества:
• первое - те. которые удовлетворяют установленному правилу;
• второе - те, которые не удовлетворяют установленному правилу.
Далее к каждому подмножеству снова применяется правило, процедура
повторяется. Это продолжается, пока не будет достигнуто условие остановки
алгоритма. Последний узел, когда не осуществляется проверка и разбиение,
становится листом.
Лист определяет решение для каждого попавшего в него примера. Для
дерева классификации - это класс, ассоциируемый с узлом, а для дерева регрес-
сии - соответствующий листу модальный интервал целевой переменной. В ли-
сте содержится не правило, а подмножество объектов, удовлетворяющих всем
правилам ветви, которая заканчивается этим листом.
Пример попадает в лист, если он соответствует всем правилам на пути к
нему. К каждому листу есть только один путь. Таким образом, пример может
попасть только в один лист, что обеспечивает единственность решения.
Типы задач, решаемых с помощью деревьев решений
Деревья решений применяют для поддержки процессов принятия управ-
ленческих решений, используемых в статистике, анализе данных и машинном
обучении. Оно помогает решать следующие задачи:
• Классификация. Отнесение объектов к одному из заранее известных
классов. Целевая переменная должна иметь дискретные задачи.
* Регрессия (численное предсказание). Предсказание числового значе-
ния независимой переменной для заданного входного вектора.
* Описание объектов. Набор правил в дереве решений позволяет ком-
пактно описывать объекты. Поэтому вместо сложных структур, исполь-
зуемых для описания объектов, можно хранить деревья решений.
Процесс построения дерева решений
Основная задача при построении дерева решений - последовательно и
рекурсивно разбить обучающее множество на подмножества с применением
решающих правил в узлах. Этот процесс продолжается до тех пор, пока все уз-
лы в конце ветвей не станут листами.
Узел становится листом в двух случаях:
• естественным образом - когда он содержит единственный объект или
объект только одного класса;
• после достижения заданного условия остановки алгоритм - например,
минимально допустимое число примеров в узле или максимальная глу-
бина дерева.
В основе построения лежат «жадные» алгоритмы, допускающие локально-
оптимальные решения на каждом шаге (разбиения в узлах), которые приводят к
оптимальному итоговому решению. То есть при выборе одного атрибута и про-
изведении разбиения по нему на подмножества, алгоритм не может вернуться
назад и выбрать другой атрибут, даже если это даст лучшее итоговое разбиение.
Следовательно, на этапе построения дерева решений нельзя точно утверждать,
что удастся добиться оптимального разбиения.
Популярные алгоритмы, используемых для обучения деревьев решений,
строятся на базе принципа «разделяй и властвуй». Задают общее множество 5,
содержащее:
• п примеров, для каждого из которых задана метка класса С,-, i = 1 ...к;
• т атрибутов j = 1 ...m, которые определяют принадлежность объек-
та к тому или иному классу.
Тогда возможно три случая:
• примеры множества S имеют одинаковую метку Q, следовательно, все
обучающие примеры относятся к одному классу. В таком случае обуче-
ние не имеет смысла, потому что все примеры в модели будут одного
класса, который и «научится» распознавать модель. Само дерево будет
похоже на один большой лист, ассоциированный с классом Тогда его
использование не будет иметь смысла, потому что все новые объекты
будут относиться к одному классу;
• множество S - пустое множество без примеров. Для него сформируется
лист, класс которого выберется из другого множества. Например, самый
распространенный из родительского множества класс;
• множество 5 состоит из обучающих примеров всех классов Q. В таком
случае множество разбивается на подмножества в соответствии с клас-
сами. Для этого выбирают один из атрибутов множества S, состоящий
из двух и более уникальных значений: а2, ар, где р - число уни-
кальных значений признака. Множество 5 разбивают на р подмножеств
(Sx, 52, ..., 5р), состоящих из примеров с соответствующим значением
атрибута. Процесс разбиения продолжается, но уже со следующим атри-
бутом. Он будет повторяться, пока все примеры в результирующих под-
множествах не окажутся одного класса.
Третья применяется в большинстве алгоритмов, используемых для по-
строения деревьев решений. Эта методика формирует дерево сверху вниз, то
есть от корневого узла к листьям.
На сегодняшний день существует множество алгоритмов обучения, отно-
сящихся к деревьям решений. ID3, CART, С4.5, С5.0. Newld, ITrule, CHAID,
CN2 и другие. Самыми популярными считаются:
• 1D3 (Iterative Dichotomizer 3). Алгоритм позволяет работать только с
дискретной целевой переменной. Деревья решений, построенные на ос-
нове 1D3, получаются квалифицирующими. Число потомков в узле не-
ограниченно. Алгоритм не работает с пропущенными данными.
• С4.5. «Продвинутая» версия 1D3, дополненная возможностью работы с
пропущенными значениями атрибутов. В 200Х году издание Spring Sci-
ence провело исследование и выявило, что С4.5 - самый популярный ал-
горитм Data Mining.
* CARI' (Classification and Regression Tree). Алгоритм решает задачи
классификации и регрессии, так как позволяет использовать дискретную
и непрерывную целевые переменные. САЙ Г строит деревья, в каждом
узле которых только два потомка.
Основные этапы построения дерева решений
Для построения дерева решения необходимо выполнить 4 этапа:
1. Выбрать атрибут для осуществления разбиения в данном узле.
2. Определить критерий остановки обучения.
3. Выбрать метод отсечения ветвей.
4. Оценить точность построенного дерева.
Выбор атрибута разбиения
Разбиение должно осуществляться по определенному правилу, для кото-
рого и выбирают атрибут. Причем выбранный атрибут должен разбить множе-
ство наблюдений в узле так, чтобы результирующие подмножества содержали
примеры с одинаковыми метками класса или были максимально приближены к
этому. Иными словами - количество объектов из других классов в каждом из
этих множеств должно быть минимальным.
Критериев существует много, но наибольшей популярностью пользуются
теоретико-информационный и статистический.
Теоретико-информационный критерий
основе критерия лежит информационная энтропия:
где п - число классов в исходном подмножестве. Nt - число примеров i-ro клас-
са. N - общее число примеров в подмножестве.
Энтропия рассматривается как мера неоднородности подмножества по
представленным в нем классам. И даже если классы представлены в равных до-
лях, а неопределенность классификации наибольшая, то энтропия тоже макси-
мальная, Логарифм от единицы будет обращать энтропию в ноль, если все при-
меры узла относятся к одному классу.
Если выбранный атрибут разбиения Af обеспечивает максимальное сни-
жение энтропии результирующего подмножества относительно родительского,
его можно считать наилучшим.
Но на деле об энтропии говорят редко. Специалисты уделяют внимание
обратной величине - информации. В таком случае лучшим атрибутом будет
тот, который обеспечит максимальный прирост информации результирующего
узла относительно исходного:
Gain (A) = Info(S) — Info(SA)
где lnfo(S) - информация, связанная с подмножеством S до разбиения,
Info(SA) - информация, связанная с подмножеством, полученным при разбие-
нии атрибута А.
Задача выбора атрибута в такой ситуации заключается в максимизации
величины Ссп'п(Л), которую называют приростом информации. Поэтому теоре-
тико-информационный подход также известен под названием «критерий приро-
ста информации».
Статистический подход
В основе этого метода лежит использование индекса Джини. Он показы-
вает, как часто случайно выбранный пример обучающего множества будет рас-
познан неправильно. Важное условие - целевые значения должны браться из
определенного статистического распределения.
Иными словами, индекс Джини показывает расстояние между распреде-
лениями целевых значений и предсказаниями модели. Минимальное значение
показателя говорит о хорошей работе модели.
Индекс Джини рассчитывается по формуле:
Gini(Q) = 1
где Q - результирующее множество, п - число классов в нем, рг - вероятность
появления примера из i-ro класса (выраженная как относительная частота при-
меров соответствующего класса).
Значение показателя лежит в диапазоне от 0 до 1. Если индекс равен О,
значит, все примеры результирующего множества относятся к одному классу.
Если индекс равен 1, значит, классы представлены в равных пропорциях и рав-
новероятны. Оптимальным считают то разбиение, для которого значение ин-
декса Джини минимально.
Критерий остановки алгоритма
Алгоритм обучения может работать до получения «чистых» подмножеств
с примерами одного класса. В таком случае высока вероятность получить дере-
во, в котором для каждого примера будет создан отдельный лист. Такое дерево
не получится применять на практике из-за его переобучения (overfitting).
Переобучение в случае дерева решен nil имеет схожие с нейронными се-
тями последствия. Оно будет точно распознавать примеры из обучения, но не
сможет работать с новыми данными. Еще один минус - структура переобучен-
ного дерева сложна и плохо поддается интерпретации.
Для предотвращения появления проблемы переобучения рационально бу-
дет принудительно остановить процесс обучения дерева решений на некотором
этапе, основываясь, например, на числе примеров в получаемых листьях. та-
ком случае, модель, построенная на алгоритме дерева решений будет иметь
обоснованные показатели для её применения в условиях настоящей предметной
области и решения с её помощью задач на «новых», «неизвестных» данных
сходного типа.
Для этого используют несколько подходов:
• Ранняя остановка. Алгоритм останавливается после достижения задан-
ного значения критерия (например, процентной доли правильно распо-
знанных примеров). 1 Треимущество метода - сокращение временных за-
трат на обучение. Главный недостаток - ранняя остановка негативно
сказывается на точности дерева. Из-за этого многие специалисты сове-
туют отдават ь предпочтение отсечению ветвей.
• Ограничение глубины дерева. Алгоритм останавливается после до-
стижения установленного числа разбиений в ветвях. Этот подход также
негативно сказывается на точности дерева.
• Задание минимально допустимого числа примеров в узле. Устанав-
ливается ограничение на создание узлов с числом примеров меньше за-
данного. В таком случае не будут создаваться тривиальные разбиения и
малозначимые правила.
На практике вышеперечисленные подходы не могут однозначно решить
проблему переобучения на любых данных, так как разные данные варьируются
разным количеством информации, уникальными свойственными математиче-
скими характеристиками. Поэтому для решения возникшей проблемы, анали-
тикам требуется поочередно исследовать каждый подход и выбрать наилучший
из них для реализуемой модели.
Отсечение ветвей
Без ограничения «роста» дерево решений станет слишком большим и
сложным, что сделает невозможной дальнейшую его интерпретацию. А если
создавать решающие правила для создания узлов, в которые будут попадать по
2-3 примера, они не лишатся практической ценности.
Поэтому многие специалисты отдают предпочтение альтернативному ва-
рианту - построить все возможные деревья, а потом выбрать те, которые при
разумной глубине обеспечивают должный уровень точности и приемлемый
уровень ошибки распознавания. Основная задача в такой ситуации - поиск
наиболее выгодного баланса между сложностью и точностью дерева.
Возникает следующая проблема: такая задача относится к классу
NP-полных задач. NP-полные задачи - это задачи, относящиеся к задачам раз-
решимости. Такие задачи не имеют эффективных решений, поэтому прибегают
к методу отсечения ветвей, который реализуется в 3 niai а:
I. Строительство полного дерева, в котором листья содержат примеры
одного класса.
2. Определение двух показателей: относительную точность модели (от-
ношение числа правильно распознанных примеров к общему числу при-
меров) и абсолютную ошибку (число неправильно классифицированных
примеров).
3. Удаление листов и узлов, потеря которых минимально скажется на точ-
ности модели и увеличении ошибки.
Отсечение ветвей проводят противоположно росту дерева, то есть снизу
вверх, путем последовательного преобразования узлов в листья.
Главное отличие метода отсечения ветвей от преждевременной остановки
заключается в том, что удается найти оптимальное соотношение между точно-
стью и интерпретируемостью. При этом уходит больше времени на обучение,
потому что в рамках этого подхода изначально строится полное дерево.
Извлечение правил
Иногда упрощения дерева недостаточно, чтобы оно легко воспринима-
лось и интерпретировалось. Тогда специалисты извлекают из дерева решающие
правила и составляют из них наборы, описывающие классы.
Для извлечения правил нужно отслеживать все пути от корневого узла к
листьям дерева. Каждый путь дает правило с множеством условий, представ-
ляющих собой проверку в каждом узле пути.
Если представить сложное дерево решений в виде решающих правил
(вместо иерархической структуры узлов), оно будет проще восприниматься и
интерпретироваться.
Преимущества и недостатки дерева решений
Преи му шее i ва:
• При возможности сформировать четкие и понятные правила деревья
решений являются очень эффективным инструментом.
• Способны генерировать правила в областях, где специалисту трудно
формализовать свои знания.
• Легко визуализируются, то есть могут «интерпретироваться» не только
как модель в целом, но и как прогноз для отдельного тестового субъекта
(путь в дереве).
• Быстро обучаются и прогнозируют.
• Не требуется много параметров модели.
• Поддерживают как числовые, так и категориальные признаки.
Недостатки:
• Деревья решении чувствительны к шумам во входных данных. Неболь-
шие изменения обучающей выборки могут привести к глобальным кор-
ректировкам модели, что скажется на смене правил классификации и
интерпретируемости модели.
• Разделяющая граница имеет определенные ограничения, из-за чего де-
рево решений по качеству классификации уступает другим методам.
• Возможно переобучение дерева решений, из-за чего приходится прибе-
гать к методу отсечения ветвей, установке минимального числа элемен-
тов в листьях дерева или максимальной глубины дерева.
• Сложный поиск оптимального дерева решений: это приводит к необхо-
димости использования эвристики типа жадного поиска признака с мак-
симальным приростом информации, которые в конечном итоге не дают
100-процентной гарантии нахождения оптимального дерева.
• Дерево решений делает константный прогноз для объектов, находящих-
ся в признаковом пространстве вне параллелепипеда, который охватыва-
ет не все объекты обучающей выборки.
Применение деревьев решений
Модули для построения и исследования деревьев решений входят в со-
став множества аналитических платформ. Это удобный инструмент, применяе-
мый в системах поддержки принятия решений и интеллектуального анализа
данных.
Успешнее всего деревья решений применяются в следующих областях:
• Банковское дело. Оценка кредитоспособности клиентов банка при вы-
даче кредитов.
• Промышленность. Контроль качества продукции (обнаружение дефек-
тов в готовых товарах), испытания без нарушений (например, проверка
качества сварки) и т. п.
• Медицина. Диа1 ностика заболеваний разной сложности.
• .Молекулярная биология. Анализ строения аминокислот.
• Торговля. Классификация клиентов и товар.
Это не исчерпывающий список областей применения дерева решений.
Круг использования постоянно расширяется, а деревья решений постепенно
становятся важным инструментом управления бизнес-процессами и систем
поддержки принятия решений.
Наивный Байес (классификаюр)
В подразделе науки машинного обучения, который посвящен изучению
задач классификации принято разделение между различными типами класси-
фикационных методов.
Такая классификация позволяет сепарировать различные алгоритмы ис-
кусственного интеллекта по принципу их принадлежности к математической
основе, на которой они построены. Именно математическая основа (и, как след-
ствие, система её ограничений для условий задачи) в конечном счете останав-
ливает выбор исследователя данных на конкретном алгоритме.
В задачах классификации экстрагируют несколько обособленных классов
методов [1]:
• Линейные модели;
• Нелинейные модели, основанные на принципе разделимости:
• Логические классификаторы;
• Статистические классификаторы;
* Метрические классификаторы;
• Композиции.
Алгоритм классификации наивного Байеса принадлежит к группе стати-
стических методов классификации.
Принадлежность алгоритма наивного Байеса к этой группе очень легко
доказать:
Возьмём в качестве примера рассмотрения один класс (все его объекты).
Очевидно, что объекты одного класса будут составлять выборку, гак как
они являются конечным набором прецедентов, которые были выбраны опреде-
ленным образом из генеральной совокупности.
Поскольку объекты одного класса в задаче классификации содержат об-
щую метку целевого столбца, то параметр у; может быть исключен из рассмот-
рения.
Рассматривая объекты одного класса, у нас не существует каких-либо ма-
тематических ограничений на то, чтобы восстановить плотность.
Согласно базовым принципам функции распределения и её первой произ-
водной (статистические законы), решая задачу восстановления плотности рас-
пределения для каждого класса в отдельности, мы сможем решать и задачу
классификации в вероятностных терминах.
Из краткого доказательства следует, что у классификатора Байеса суще-
ствует частный случай, позволяющий довольно просто решать прикладные за-
дачи, в которых целевой столбец имеет равные априорные вероятности классов.
Априорная вероятность классов - это частотная оценка вероятности классов. Го
есть, например, априорная вероятность классов будет равна, когда в задаче
классификации с общим типом ответов «да» / «нет» будет находиться одинако-
вое количество ответов «да» и «нет». В таком случае каждый объект X будет
отнесен к тому классу, для которого плотность вероятности в точке X будет
максимальна. В строгом математическом виде это уравнение можно выразить в
виде формулы (1).
Алгоритм Байеса(X) = arg max р(х|у) (1)
у е Y
где р(х|у) — это совместная плотность распределения непрерывных объектов X
и дискретных значений Y.
Такой частный случай, который между тем является и самым простым
типом классификации Байеса, носит особое именование оптимального Байе-
совского классификатора.
Однако, стоит заметить, что такой классификатор не подходит для несба-
лансированных априорных вероятностей (целевых классов), которые очень ча-
сто встречаются на практике.
Кроме того, данная математическая реализация классификатора основы-
вается на оценке качества классификации по текущей выборке - а это прямой
путь к переобучению модели машинного обучения.
Наконец, задача оценивания плотности распределения путем минимиза-
ции ошибки численным интегрированием гораздо более сложнее, чем стан-
дартная задача классификации:
1. При решении задачи классификации строится функция, принимающая
конечное число значений. При восстановлении плотности процесс со-
стоит уже в работе с непрерывнозначной функцией. Получается, что
приходится решать задачу аппроксимации в более богатом классе функ-
ций.
2. При решении задачи классификации главная задача состоит в построе-
нии границы разделения классов - определении разделяющей плоскости
групп. При восстановлении плотности распределения классов большое
внимание уделяется на точность восстановления повсюду: не только в
тех местах, где находятся /раницы одного класса с другим, но и на пе-
риферии. Для классификации не нужно, чтобы восстановление плотно-
сти внутри определенного класса было таким же хорошим, как на его
границе с другими классами, поэтому несколько этапов подхода делает-
ся «впустую».
Основной проблемой в машинном обучении является нахождение грани-
цы между классами и правильное построение разделяющей плоскости. По этой
причине в прикладной алгоритм наивного Байеса были включены некоторые
видоизменения, которые, кроме его математической структуры, внесли свою
лепту в его современное название - наивный.
По какой причине классификатор стали называть наивным? Потому что в
его основе лежит предположение: признаки являются независимыми случай-
ными величинами с одномерными плотностями распределения, но зато в каж-
дом классе.
В таком случае математическая ситуация сводится почти к аналитиче-
скому решению (за исключением вероятностиoii части). Благодаря этому при-
кладное решение становится очень простым и позволяет перенести оптималь-
ный Байесовский классификатор с предположением независимости в про-
граммный вид, свободно' реализуемый на многих языках программирования.
Благодаря предположению открывается и простая возможность оценива-
ния алгоритма: оценки получаются одномерными, а восстанавливать одномер-
ные плотности (для каждого признака в отдельности) - это гораздо более про-
стая задача, нежели восстанавливать многомерные плотности.
К тому же практически пропадает сложнейшая зависимость от количества
признаков в наборе данных (столбцов): теперь их может быть сколь угодно
много, разница во временных затратах будет почти незаметной, чего нельзя
сказать о геометрически прогрессирующей сложности алгоритма от количества
столбцов набора данных в первом случае [2].
Получить математический вид наивного Байесовского классификатора
представляется весьма несложной задачей после факторизации плотности - за-
писи произведения одномерных плотностей по каждому признаку в совокупно-
сти. После этого, для получения итоговой формулы, достаточно прологарифми-
ровать вероятностные выражения по параметру argmax (2).
п
/пЛ,-*£(у) + ^1пр^\у)
/=1
где In Ai * Р(у) - это константа: In At - это натуральный логарифм штрафа по-
тери на объектах класса у. 1пР(у) - это натуральный логарифм априорного
распределения. Эти величины задаются самим исследователем: значение штра-
фа задается при реализации решения, а оценку частоты вероятности класса лег-
ко получить по самой выборке.
In Pj (xJ |у) - это сумма натуральных логарифмов одномерных плоскостей по
каждому признаку в каждом классе.
Оценивая два типа алгоритма классификации Байеса, необходимо отме-
тить, что первый тип наиболее часто используется в средствах математической
статистики и при решении аналитических задач математики. Это объясняется
тем, что априорные распределения классов и их функции правдоподобия чаще
Алгоритм Наивного Байеса(Х) = arg max
у € Y
' Дчя аппаратной и вычислительной части компьютерной системы.
всего известны, поэтому можно определить математическое ожидание потерь,
чтобы в дальнейшем его проинтегрировать.
На практике всегда используется алгоритм наивного Байесовского клас-
сификатора. Так получается, потому что совместная плотность X и Y неизвест-
на, то есть невозможно аналитически определить функции правдоподобия
классов. В связи с этим, нет никакого доступа к численному решению, тем бо-
лее в программном виде [3], где многие величины должны быть представлены
дискретно.
Благодаря математическим концепциям и законам, стало возможным пе-
ренести «наивное» утверждение в формализованный вид уравнения, создав тем
самым новую, особо значимую для прикладной реализации, модель машинного
обучения.
Mei од опорных векторов
Метод опорных векторов (Support Vector Machine) - это линейная модель
для задач классификации и регрессии. Он может решать линейные и нелиней-
ные задачи и хорошо подходит для многих практических задач. Идея SVM про-
ста: алгоритм создает линию или гиперплоскость, которая разделяет данные на
классы.
Метод опорных векторов относится к обучению с учителем - т. е. про об-
разцы объектов заранее известно, к каким классам они принадлежат. Известные
данные называются обучающей выборкой.
Для примера, подобные алгоритмы классификации активно применялись
для создания спам-фильтров. Сообщения, отправляемые в спам, принимались
как данные для обучения, где за основу брались такие параметры как средняя
длина сообщения, количество ссылок, картинок, повторение определенных
слов и т. д.
Цель алгоритма машины опорных векторов состоит в том, чтобы найти
гиперплоскость в N-мерном пространстве (N - количество объектов), которая
четко классифицирует точки данных. То есть, алгоритм получает данные и воз-
вращает линию, разделяющую эти данные. Уравнение разделяющей плоскости:
+ щ2х2 + —•" а)пхп + &>о = О
Которое можно привести к общему виду:
а)тх — b = О
где b = — а)0.
Рисунок 1 - Два класса точек в условном пространстве
Чтобы разделить два класса точек данных, можно выбрать множество
возможных гиперплоскостей. Наша цель состоит в том, чтобы найти плоскость
с максимальным зазором (margin), то есть максимальным расстоянием между
точками данных обоих классов. Максимальное увеличение расстояния до гра-
ницы обеспечивает некоторое усиление, чтобы будущие точки данных можно
было классифицировать с большей уверенностью.
Для этого алгоритм находит точки, находящиеся ближе всего к линии
разделения. Эти точки называются опорными векторами.
Линия разделения
Опорные векторы
Рисунок 2 - Схема разделяющей полосы
Алгоритм вычисляет расстояние между опорными векторами и разделя-
ющей плоскостью. Это расстояние и является нашим зазором. Чем больше рас-
стояние, тем лучше.
Для нахождения опорных векторов нам нужно правильно задавать веса
обучения алгоритма со и Ь.
Вектор со - вектор нормали к разделяющей гиперплоскости.
2
IHI
шах — максимальный зазор
||ш|| min
(О1 (О
—------> min
Отступом объекта X называется величина М = у(а)1 х — Ь). В случаях ко-
гда М >= 1, принадлежность X к классу Y установлена правильно, если 0 < М < 1,
значит обьект попал в границы отступа, если М < 0, объект оказался на противо-
положной стороне от границы своего класса, а значит классифицирован не верно.
Соответственно, мы можем вынести следующую условие, т. с. алгоритм выполня-
ется когда:
— b) > 1
Вместе эти выражения дают нам условие для Hard-margin (жесткий зазор)
настройки SVM, т. е. объектам нельзя попадать в зону разделения и соответ-
ственно точками для опорного вектора выбираются ближайшие к линии разде-
ления.
। (j)1 (й/2 -> min
ly(aiTx — b) > 1
Бывают случаи, когда данные невозможно разделить линейно на плоско-
сти. В таком случаи добавляется еще одно измерение. В данном виде появляет-
ся возможность провести гиперплоскость для разделения данных.
Рисунок 3 - Гиперплоскость разделения данных
При увеличении числа свойств число измерений также увеличивается, но
отобразить это графически начиная с четвертого измерения становится очень
затруднительно.
Для линейно неразделимых данных Hard-margin метод становится мало-
эффективен и для таких случаев предполагается использование функцию по-
терь Soft-margin (мягкий зазор).
Q = max(O,l — MJ + а(щгсо)/2
Q = max(O,l — уа)гх) + а(а)та))/2
Смысл функции заключается в том, что мы позволяем алгоритму допус-
кать ошибки (попадание объектов классов на линию разделения), при этом ми-
нимизируя количество ошибок в процессе работы. Имея возможность включать
объекты в линию разделения алгоритм может более адекватно находить опор-
ные векторы и тем самым более точно классифицировать объекты, что особен-
но помогает в ситуациях, когда объекты линейно неразделимы.
Уменьшая значения Функции потери, мы максимизируем наш зазор, уве-
личивая тем самым точность классификации. Минимизация функции потери
достигается за счет градиентного спуска.
В своей базовой форме SVM может решать лишь задачи бинарной (двух
классовой) классификации, то есть разделять данные, содержащие информацию
об объектах двух классов.
Для решения мульти классовой классификации необходимо разбить
мульти классовые данные на несколько задач бинарной классификации.
Одна SVM выполняет двоичную классификацию и может различать два
класса. Разделять данные можно по одному из следующих подходов:
• 1 к 1 - подход, при котором данные разделяются на отдельные пары
классов, каждому классу подбирается n-1 пар, где п - число классов.
• 1 к остальным - подход, при котором каждому классу подбирается пара
из остальных данных, соединённых в один класс.
Пример набора данных из трёх классов.
Х2
Рисунок 4 - I Тример набора из трех классов
Подход 1 к 1.
Для каждой пары классов нам нужно провести линию разделения при
этом игнорируя 3 класс.
Рисунок 5 - Подход «один к одному»
Подход 1 к остальным.
Мы должны провести линию, разделяя точки данных одного класса от
всех остальных.
Рисунок 6 - Подход «один к остальным»
Одной из наиболее распространенных реальных проблем для мульти
классовой классификации с использованием SVM является классификация тек-
ста. Например, классификация новостных статей, твитов или научных статей.
Плюсы метода опорных векторов:
• Хорошо работает с большим количеством свойств объекта.
• Может находить решения в случаях, когда количество свойств превы-
шает число записей.
• Нахождение максимального зазора между классами уменьшает вероят-
ность ошибок после обучения.
• Функцию разделения можно настраивать мере необходимости.
Минусы метода опорных векторов:
• При большом количестве данных сильно замедляется скорость обуче-
ния.
• Алгоритм не даёт вероятностную оценку отношения объекта к опреде-
ленному классу, вместо этого даётся точно определение класса.
• Алгоритм не может выявлять неверные данные, соответственно большое
количество шумовых данных во время обучения приведет к неверному
построению модели.
• Линейно неразделимые данные требуют высоких трудозатрат для пре-
образования.
Алгоритм кластеризации на основе плотности
Для начала рассмотрения темы, дадим определение кластеризации.
Кластеризация (или кластерный анализ) - представляет собой разбиение
объектов на группы, которые называются кластерами. В группе должны ока-
заться только похожие друг на друга объекты, объекты же разных групп долж-
ны быть максимально отличны. Отличием от классификации является тот факт,
что изначальное количество групп( кластеров) не задано, оно определяется в
процессе выполнения алгоритма.
Алгоритмы кластеризации имеет различные классификации, но общий
вид применения анализа сводится к следующим этапам:
1. выборка объектов;
2. определение множества переменных;
3. выявление меры сходства между объектами;
4. выполнение алгоритма кластеризации для создания групп похожих объ-
ектов;
5. вывод результата.
Для того чтобы выявить схожие элементы, необходимо составить пере-
чень числовых характеристик, по которым будет выявляться схожесть напри-
мер: дата, месяц, год, для календаря. Помимо этого, также существуют алго-
ритмы, работающие на основе качественных характеристик.
После того как мы выявили нужные характеристики, проводится норма-
лизация. В процессе нормализации значения приводятся к определенному диа-
пазону, например, [-1, -11 или |0, 11.
Для каждой пары объектов измеряется степень похожести.
Существует множество метрик, приведем пример основных:
Евклидово расстояние. Наиболее распространенная функция расстояния.
Представляет собой геометрическим расстоянием в многомерном пространстве
формула представлена на рис. 1.
Рисунок 1 - Формула Евклидова расстояния
Квадрат евклидова расстояния. Применяется для придания большего веса
более отдаленным друг от друг а объектам (рис. 2).
п
р(х:х') = V(Xf -х,)2
I
Рисунок 2 - Формула квадрата Евклидова расстояния
Расстояние городских кварталов (манхэттенское расстояние). Это рассто-
яние является средним разностей по координатам (рис. 3).
Х-х!.г,) = 21х>-х.1
г
Рисунок 3 - Формула манхэттенского расстояния
Расстояние Чебышева. Это расстояние может оказаться полезным, когда
нужно определить два объекта как «различные», если они различаются по ка-
кой-либо одной координате (рис. 4)
р(х.х') = тах(|х,. -х( |)
Рисунок 4 - Формула расстояние Чебышева
Степенное расстояние. Применяется в случае, когда необходимо увели-
чить или уменьшить вес, относящийся к размерности, для которой соответ-
ствующие объекты сильно отличаются (рис. 5).
.т') =
Рисунок 5 - Формула степенного расстояния
Выбор метрики полностью лежит на исследователе, поскольку результа-
ты кластеризации могут существенно отличаться при использовании разных
мер.
Алгоритм кластеризации на основе плотное in
Алгоритм кластеризации на основе плотности определяет область, в ко-
торой концентрируются точки группирует их в кластер. Точки, которые не по-
пали в кластер, определяются как шум (рис. 6).
• Cluster 1
• Cluster 2
• Cluster 3
* Noise
Рисунок 6 - Формирование кластеров
на основе пространственного распределения
Процесс проектирования алгоритма в общем представляет собой пере-
чень этапов:
• Формирование группы (кластеры) из параметров входных точек объекта
и выделяет шум.
• Выбор метода из существующих (их 3):
I. Алгоритм Заданное расстояние (DBSCAN) осуществляет поиск кла-
стера точек, которые находятся вблизи, на основе расстояния поиска,
которое задается вручную и является статичным (т. е. не меняется).
2. Алгоритм Автонастройка (HDBSCAN) ищет кластеры точек так же,
как и DBSCAN, но расстояние поиска является динамическим (т. е.
может меняется), позволяя определить кластеры с меняющимися
плотностями, на основе вероятности кластеров.
3. Алгоритм Мультимасштабный (OP TICS) осуществляет упорядочи-
вает входных точек на основе минимального расстояния до следую-
щей точки. Затем строится плот доступности и извлекаются кластеры,
на базе наименьшего числа точек, входящих в кластер, расстояния по-
иска и характеристик плота доступности.
Создание выходного класса объектов с новым целочисленным по-
лем Clusterld, который показывает принадлежность точки к определенному
кластеру. Отображение по умолчанию основано на поле Colorld. Каждый кла-
стер имеет свой цвет. Причем распределение цветов происходит таким образом
чтоб соседние кластера не имели одинаковых цветов.
Создание сообщения и диаграммы, которые помогают воспринимать ха-
рактеристики идентифицированных кластеров.
Если выбрана метод HDBSCAN, выходной класс объектов должен со-
держать поля, которые содержат вероятность принадлежности точки к класте-
ру, параметр, позволяющий понять, что точка может быть выбросом (то есть
точке не принадлежащая кластеру) в своем кластере (чем выше значение, тем
больше вероятность, что точка является выбросом) и поле, которое выделяет
точки, которые вероятнее всего принадлежат кластеру.
Если выбран метод OPTICS для кластеризации, выходной класс объек-
тов должен содержать поля, где указан способ упорядочивания Входных то-
чечных объектов для анализа, и расстояние между каждой точкой и ближай-
шей не посещенной соседом.
Для DBSCAN и OPTICS, по умолчанию значением параметра Расстоя-
ние поиска есть наибольшее значение основного расстояния, найденное в
наборе входных данных, Кроме того для данных методов можно указать время
в параметре Поле времени, если данный параметр заполнен, то поиск будет с
учетом нахождение близости в пространстве и времени. Для того чтобы узнать
близость по времени, нужно задать параметр Интервал времени поиска.
Если задано значение Поле времени, то выходной класс объектов будет
включать график Временной диапазон на кластер, в котором будут показаны
временные диапазоны для каждого кластера пространство-время.
Параметр Ин1ервал времени поиска не управляет всем диапазоном
времени для итоговых пространственно-временных кластеров. Например, если
используется временной интервал в 3 дня, то в результате может получиться
кластер с точками в диапазоне 10 дней или больше. Это связано с тем, что ин-
тервал времени поиска используется только для определения того, включается
ли каждая отдельная точка в кластер. При формировании кластеров из несколь-
ких точек общий диапазон времени кластера может оказаться больше, чем ин-
тервал времени поиска.
Mei од Заданное расстояние (DBSCAN)
Рассмотрим более подробно метод Заданное расстояние (DBSCAN) (так
как на его основе будет сформирован программный код примера).
DBSC AN (Пространственная кластеризация приложений с шумом на ос-
нове плотности) - это, как уже было сказано выше, типичный алгоритм класте-
ризации на основе плотности, который осуществляет поиск кластера точек, ко-
торые находятся вблизи, на основе расстояния поиска, которое задается вруч-
ную и является статичным (то есть не меняется) далее это значение.
На вход данному алгоритму поступают 3 параметра:
1. Матрицу близости - входной массив точек.
2. Радиус окрестности.
3. Количество соседей.
Матрица близости представляет собой координаты точек, которые разме-
стились на плоскости.
Радиус окрестности, определяет, область в которую входят соседние точ-
ки. формируя при этом группу.
Количество соседей, это минимальная величина, от которой отталкивает-
ся алгоритм для объединения точке в кластер.
Математический смысл алгоритма состоит в следующем.
13ведём несколько определений. Пусть задана некоторая симметричная
функция расстояния р(х,у) и константы е и m (наши входные параметры). То-
гда Назовём область Е(х), для которой р(х,у) <= е, е-окрестностью объекта х.
Корневым объектом или ядерным объектом степени m называется объ-
ект, е-окрестность которого содержит не менее m объектов: Е(х)>=т.
Объект р доступен из объекта q, если р 6 и E(q), где q - корневой объект.
Выберем какой-нибудь корневой объект р из введенных данных, пометим
его и поместим всех его доступных соседей в список обхода. Теперь для каж-
дой q из списка: пометим эту точку, и, если она тоже корневая, добавим всех её
соседей в список обхода. Тривиально доказывается, что кластеры помеченных
точек, сформированные в ходе этого алгоритма максимальны (т. е. их нельзя
расширить ещё одной точкой, чтобы удовлетворялись условия) и связны в
смысле плотно-достижимости. Отсюда следует, что, если мы обошли не все
точки, можно перезапустить обход из какого-нибудь другого корневого объек-
та, и новый кластер не поглотит предыдущий.
По сути, имеем обход графа в ширину с ограничениями, только с допол-
нительными параметрами.
Данный алгоритм имеет смысл применять, когда:
• Большое количество входных координат.
• Заранее известна функция близости, симметричная, желательно, не
очень сложная.
• ]Тлотность границ меньше плотности наименее плотного кластера. Луч-
ше если кластеры вовсе отделены друг от друга.
• Сложность элементов входных координат значения не имеет. Однако их
должно быть достаточно, чтобы не возникало сильных разрывов в плот-
ности.
• Количество элементов в кластере может варьироваться до сколь угодно
большого числа.
• Количество выбросов значения не имеет (в разумных пределах и при
условии, что они рассеяны по большому объёму).
• Количество кластеров значения не имеет.
У DBSCAN есть история успешных применений. Например, можно отме-
тить его использование в задачах:
• Обнаружения социальных кружков.
• Сегментирования изображений.
* Моделирования поведения пользователей веб-сайтов.
• Предварительная обработка в задаче предсказания погоды.
Генет ические ал горит мы
Генетический алюритм (сокращенно «I А», от английского - genetic al-
gorithm) - это эвристический алгоритм поиска, используемый для решения за-
дач оптимизации и моделирования путём случайного подбора, комбинирования
и вариации искомых параметров с использованием механизмов, аналогич-
ных естественному отбору в природе.
Является разновидностью эволюционных вычислений, с помощью которых
решаются оптимизационные задачи с использованием методов естественной
эволюции, таких как наследование, мутации, отбор и кроссинговер. Отличи-
тельной особенностью генетического алгоритма является акцент на использо-
вание оператора «скрещивания», который производит операцию рекомбинации
решений-кандидатов, роль которой аналогична роли скрещивания в живой при-
роде.
Принцип работы ГА
Генетические алгоритмы оперируют совокупностью особей (популяцией),
которые представляют собой строки, кодирующие одно из решений задачи.
Этим ГА отличается от большинства других алгоритмов оптимизации, которые
оперируют лишь с одним решением, улучшая его.
С помощью функции приспособленности среди всех особей популяции
выделяют:
• наиболее приспособленные (более подходящие решения), которые полу-
чают возможность скрещиваться и давать потомство;
• наихудшие (плохие решения), которые удаляются из популяции и не
дают потомства.
Таким образом, приспособленность нового поколения в среднем выше
предыдущего.
В классическом ГА:
• начальная популяция формируется случайным образом;
• размер популяции (количество особей N) фиксируется и не изменяется в
течение работы всего алгоритма;
• каждая особь генерируется как случайная L-битная строка, где L - длина
кодировки особи;
• длина кодировки для всех особей одинакова.
Итак, все начинается с формирования популяции - множества особей од-
ного вида. Это обычные списки из нулей и единиц:
И это типовое представление особей. Каждую задачу для генетического
алгоритма стараются формализовать так, чтобы особи были представлены
списком целых или вещественных чисел. В этом случае мы получаем есте-
ственную биологическую интерпретацию этих списков как хромосом, состоя-
щих из генов (отдельных элементов):
хромосома
гены
О 1
Следующий важный вопрос: как сформировать начальную популяцию
индивидуумов? То есть, как подобрать начальные значения генов? Часто для
этого используют датчик случайных чисел и просто записывают то число, ко-
торое получилось на выходе этого датчика. В результате, получим множество
самых разных особей, что очень хорошо для дальнейшего процесса эволюци-
онной адаптации всей популяции.
Функция приспособленности (целевая функция)
Как мы знаем, в процессе эволюционного отбора в популяции, как прави-
ло, остаются наиболее приспособленные особи. И нам нужно уметь определять
эту степень приспособленности, чтобы имитировать процесс эволюции. Но что
определяет приспособленность в задачах генетического алгоритма? В приро-
де - это фактор выживаемости, а что у нас? У нас - это получение лучшего ре-
шения. То есть, те особи, которые представляют лучшее решение поставленной
задачи, считаются более приспособленными. А чтобы оценивать качество ре-
шения для каждого конкретного индивидуума, необходимо задать функцию
приспособленности (или, как еще говорят, - целевую функцию):
Jitness (individ)
где fitness - приспособленность, зависящая от хромосомы конкретного индиви-
да.
Для разных задач используется своя функция приспособленности, и ее
конкретный математический вид определяется разработчиком ГА, исходя из
поставленной задачи оптимизации.
После того, как у нас сформирована популяция и определена функция,
дающая оценку приспособленности каждой конкретной особи, мы готовы к
имитации эволюционного процесса. То есть, будем воспроизводить изменение
популяции от поколения к поколению в надежде получать все более и более
приспособленных особей, а значит идти по пути улучшения решения постав-
лен ной задачи.
Согласно Чарльзу Дарвину, движущая сила эволюции определяется сле-
дующими гремя процессами:
• отбор наиболее приспособленных особей;
• скрещивание родителей для получения новых индивидуумов;
• мутация - случайное изменение отдельных генов.
Отбор
Отбор - это первое действие, выполняемое в ГА при имитации эволюци-
онного процесса. Цель этого оператора - с одной стороны оставить в популя-
ции наиболее приспособленных особей, но с другой - сохранить популяцион-
ное разнообразие. Например, если оставлять только наиболее приспособлен-
ных, то можно потерять важные фрагменты хромосом у менее приспособлен-
ных особей. Возможно, оптимальное решение достигается скрещиванием одно-
го из наиболее приспособленного родителя с другим - наименее приспособлен-
ным. Если же на этапе отбора второй родитель окажется утерянным, то опти-
мальное решение, возможно, будет достигаться за большее число шагов работы
ГА. А может быть даже потеряется навсегда. Чтобы уменьшить вероятность та-
кого исхода в следующем поколении следует оставлять не только самых луч-
ших, но и давать возможность менее конкурентным оставаться в популяции.
Разберем способ турнирного отбора, который довольно часто использует-
ся на практике.
В начале во всей популяции случайным образом отбирается п индивиду-
умов (допустим три), а затем, среди них выбирается наиболее приспособлен-
ный:
Турнирный отбор
Популяция
11обедитель проходит отбор и будет использован как родитель в операции
скрещивания. Соответственно, этот турнирный отбор повторяется с исходной
популяцией до тех пор, пока не будет сформирован новый список особей того
же числа, что и исходная популяция.
Скрепки ванне
Этап скрещивания в научной литературе называют кроссинговером или
кроссовером (от англ, crossing - скрещивание). На этом этане происходит об-
мен данными между частями хромосом родителей. Обычно в популяции пере-
бирают нары родителей, и фрагменты их хромосом перемешивают, получая но-
вый набор генов в хромосомах их потомков:
Родитель 1
ГТ~Т"1 о [1 1
Родитель 2
В данном случае представлена схема одноточечного скрещивания, когда
случайным образом выбирается точка разреза хромосом у родителей, а затем,
осуществляется их обмен. Так появляется два потомка.
Эта операция выполняется с некоторой (высокой) вероятностью. При
этом родители, давшие потомство, как правило, не переходят в следующее по-
коление, а не давшие - сохраняются. В результате, размер популяции после
операции скрещивания не меняется.
Мутация
Последний оператор имитации процесса эволюции - это мутация. Она
применяется к полученной популяции и случайным образом с малой вероятно-
стью меняет значения отдельных генов.
В самом простом варианте двоичного кодирования генов, мутация вы-
полняет инвертирование бита:
Этот механизм позволяет расширять область поиска решения задачи и
сохранять разнообразие популяции. Возможно, благодаря полезной мутации,
особь приобретет новое свойство и станет более конкурентно-способной в сво-
ей популяции. В дальнейшем у нее есть все шансы дать потомство и закрепить
полезный признак. Так, через мутацию, происходит улучшение решения. Ко-
нечно. может произойти и обратный эффект - ухудшение приспособленности
индивидуума. Но тогда, он не сможет конкурировать с более приспособленны-
ми особями и вскоре будет отсеян в процессе отбора.
Далее мы проверяем условие остановки ГА, и после того, как пройдем
определенно заданное количество раз данный цикл (отбор, скрещивание и му-
тацию), в последнем поколении выбираем лучшего индивидуума - это и будет
решением поставленной задачи с помощью ГЛ.
В итоге, схему ГА можно представить в следующем виде:
Имитация эволюционного процесса
Алгоритм ансамб.шрованин бэггинг
Введение
В задачах прогнозирования/регрессии/классификации зачастую ни один
из алгоритмов не обеспечивает желаемого качества восстановления зависимо-
сти. Решение - компенсация ошибок отдельных алгоритмов за счёт друг друга.
Для этого строят специальные алгоритмы.
Вводится вспомогательное множество, называемое пространством оце-
нок. Функция - алгоритмический оператор. Она устанавливает соответствие
между множеством объектов и пространством оценок. Также существует функ-
ция - решающее правило. Она устанавливает соответствие между простран-
ством оценок и множеством значений целевой функции. Вследствие чего, рас-
сматриваемые алгоритмы имеют вид суперпозиции алгоритмического операто-
ра и решающего правила. Такое общее определение алгоритмической компози-
ции даёт К). II. Журавлёв в своём труде об алгебраическом подходе к решению
задач распознавания или классификации. Во многих алгоритмах предваритель-
но вычисляются оценки принадлежности объекта классам. Впоследствии ре-
шающее правило переводит эти оценки в номер класса. Существует множество
вариантов значения оценки. Среди них такие как: вероятность принадлежности
объекта классу, расстояние от объекта до разделяющей поверхности, степень
уверенности классификации и т. и.
В публикации «Mixture of Experts» приводится ряд наиболее известных
базовых алгоритмов в композиции: голосование, взвешенное голосование,
смесь экспертов. Данные методы часто применяются, когда базовые алгоритмы
существенно отличаются друг от друга.
В случаях, когда необходимо построить композицию используя один ба-
зовый алгоритм, широко применяется бэггинг (bagging, boostrap aggregation),
суть которого заключается в том, что базовый алгоритм многократно обучается
на случайных подвыборках с повторениями из обучающей выборки. Такой ме-
тод генерации полвыборок называется бутсрап (bootsrap).
Существует весьма схожий с бэггингом метод. Этим методом выступает
метод случайных подпространств (random subspace method, RSM), идея которо-
го заключается в создании вариативности при обучении с помощью выбора
случайных подмножеств признаков. Наиболее известным примером использо-
вания бэггинга и RSM является случайный лес.
Другим известным способом ансамблирования базовых алгоритмов явля-
ется бустинг, смысл которого заключается в жадном выборе очередного алго-
ритма для добавления в композицию так, чтобы он максимально эффективно
компенсировал имеющиеся на этом шаге ошибки. Распространёнными приме-
рами бустинга являются AdaBoost и градиентный бустинг (Gradient boosting).
В общем виде стекинг (Stacked generalization) был предложен Д. Волпер-
том в его работе от 1992 года. Основной принцип стекинга заключается в ис-
пользовании базовых классификаторов для получения предсказаний (метаприз-
наков). А также в последующем использовании их как признаков для некоторо-
го «обобщающего» алгоритма (метаалгоритма). Иначе говоря, основной сутью
стекинга является преобразование исходного пространства признаков задачи в
новое пространство, точками которого будут являться предсказания базовых
алгоритмов. Предлагается:
• Выбрать ряд пар произвольных подмножеств из обучающей выборки;
• Для каждой пары обучить базовые алгоритмы на изначальном подмно-
жестве;
• Предсказать ими целевую переменную для второго подмножества.
После этого предсказанные значения становятся объектами нового про-
странства.
Развитие идеи стекинга для задач многоклассовой классификации проис-
ходит в работе, в которой рассматривается сведение задачи многоклассовой
классификации к набору задач одноклассовой классификации, которые под си-
лу решить базовым классификаторам, а также обучение метаклассификатора по
их предсказаниям. И в работе, где эта схема усложняется при помощи дополни-
тельного уровня базовых классификаторов, построенных на предсказаниях ба-
зовых классификаторов первого уровня.
Стекинг являлся основным способом ансамблирования базовых алгорит-
мов команд-победителей известного соревнования по машинному обучению
Netflix [12]. Командой BigChaos [10] использовалось разбиение обучающей вы-
борки на К неперссскающихся блоков (K-fold), благодаря чему формирование
метапризнаков производится при помощи всевозможных пар подмножеств, где
вторым подмножеством является один из блоков, а первым - все оставшиеся
блоки. Минусом такого подхода является то, что распределение значений мета-
признаков для разных блоков будут различаться по причине того, что для обу-
чения соответствующих базовых классификаторов обучающие выборки будут
взаиморазличны. Преимущество заключается в том, что использование такого
разбиения позволяет создавать метапризнаки для всех объектов в обучающей
выборке. Также в соревновании от Netflix был успешно использован вариант
стекинга под названием блендинг (blending, stacking ensembling) [8]. Он отлича-
ется выполнением лишь одной пары разбиений обучающей выборки (hold-out).
Преимуществами такого подхода являются меньшая вычислительная слож-
ность решения и отсутствие риска переобучения. В качестве недостатка можно
выделить необходимость подбора параметров разбиения и низкая эффектив-
ность использования обучающе]! выборки.
Постановка задачи и используемые обозначения
Пусть X - множество описаний объектов, a Y - множество ответов, и су-
ществует неизвестная «целевая зависимость» - отображение f: X -> Y значения
которой известны только на объектах конечной обучающей выборки
(X, Y) = (xl, yl), . . . , (x|(X,Y )|, y|(X,Y )). Требуется построить алгоритм а:
X -> Y, для аппроксимпзации целевой зависимости па множестве X.
Аналогично с множествами вводи гея и вспомогательное множество
R - пространство оценок. Алгоритмы, имеющие вид суперпозиции
а(х) = С(Ь(х)), где функция b: R - алгоритмический оператор, функция
С: R - решающее правило. Как упоминалось выше, предварительно происходит
вычисление оценок принадлежности объекта классам, затем перевод этих оце-
нок в номер класса за счёт решающего правила. В качестве оценки Ь(х) воз-
можно использовать вероятность принадлежности объекта х классу, расстояние
от объекта до разделяющей поверхности, степень уверенности классификации
и т. п.
Определение 1. Композицией Т алгоритмов at(x) = C(bt(x)), t = 1, . . . , Т
называется суперпозиция алгоритмических операторов bt : X —> R, корректи-
рующей операции F : RT —> R и решающего правила С : R —> Y :
а(х) = C(F (bl(x)..ЬТ (х)), х G X.
Алгоритмы at, а иногда и операторы bt, - базовые алгоритмы. Суперпози-
ции вида F (bl, . . . , ЬТ) являются алгоритмическими операторами. Это позво-
ляет строить иерархические композиции, применяя определение 1 рекурсивно.
Основываясь на вышеописанном, можно сделать вывод, что идеей сте-
кинга является использование в качестве алгоритмических операторов bt базо-
вых классификаторов А, а в качестве корректирующей операции F некоторого
метаклассификатора М.
Обзор известных методов ансамблирования
Бэггинг
Из изначальной обучающей выборки длины 1 формируются обучающие
под выборки той же длины 1 с помощью бутстрапа, то есть за счет случайного
выбора с возвратами. При этом некоторые объекты в подвыборке дублируются,
а некоторые не отображены ни разу. Можно выделить, что доля объектов, ока-
завшихся в каждой подвыборке, стремится к 1 = е-1 -> 0.632. Базовые алго-
ритмы, обученные по подвыборкам, объединяются в композицию с помощью
простого голосования. Об этом писал Л. Брейман в его работе 1996 года.
Эффективность бэггинга основывается на двух факторах. Первый - зача-
стую. объекты-выбросы не попадают в некоторые обучающие подвыборки.
Второй - взаимное компенсирование ошибок базовых алгоритмов при голосо-
вании, за счёт их различности. В таком случае алгоритм, построенный по под-
выборке, может оказаться даже точнее алгоритма, построенного по полной вы-
борке. Наибольшая эффективность бэггинга достигается на малых выборках,
когда исключение даже небольшой доли обучающих объектов приводит к по-
строению существенно различных базовых алгоритмов. При использовании
сверхбольших выборок возникает необходимость строить подвыборки меньшей
длины 10 1. Также в таком случае появляется задача подбора оптимального зна-
чения 10.
Стекинг
Постановка задачи классификации выглядит следующим образом:
11усть X - множество описаний объектов, Y - конечное множество номе-
ров (имён, меток) классов. Существует неизвестная «целевая зависимость» -
отображение f: X —> Y значения которой известны только на объектах конеч-
ной обучающей выборки (X, Y ) = {(xl, у Г), . . ., (x|(X,Y )|, y|(X,Y )|)}. Требует-
ся построить алгоритм а: X —» Y, классифицирующий произвольный объект
х G X.
Сначала вводятся дополнительные обозначения:
* М - некоторый метаклассификатор;
• Л - базовый классификатор, использующийся для построения метаприз-
нака;
• (ХО, Y0) - валидационная выборка;
• A.predictX) - функция, предсказывающая целевую переменную для X
классификатором А;
• A.fit(X, Y ) - функция обучения классификатора А на (X, Y );
• MF (X, А) - метапризнак, полученный классификатором А для выборки
X; Р - финальное предсказание стекинга для валидационной выборки;
concatV(Xi, Xj) - операция конкатенирования Xi и Xj по столбцам;
concatH(Xi, Xj) - операция конкатенирования Xi и Xj по строкам.
Суть стекинга заключается в обучении метаклассификатора М на (1) ис-
ходных признаках, матрице X, и (2) на предсказаниях (метапризнаках). Пред-
сказания получают с помощью базовых классификаторов (или одного). Мета-
признаки, полученные с помощью классификатора А для выборки X, обозна-
чаются MF (X, А). Принятым также является представление стекинга в виде
многоуровневой схемы, где признаки обозначаются как «уровень 0», метаприз-
наки, полученные с помощью обучения базовых классификаторов на призна-
ках, как «уровень 1», и так далее.
Алгоритм I
разбить обучающую выборку (X, Y ) на две части: (X1, Y1) и (Х2, Y2).
A.fit(Xl,Yl)
MF (Х2, А) := A.predict(X2)
MF (ХО, А) := A.predict(XO)
М .fit(concatV(X2, MF (Х2, A)), Y2)
Р := М .predict(concatV(X(), MF (ХО, А)))
Признаки
Метапризнаки
Финальное
предсказание
Целевая переменная
Валидационная
выборка
Обучающая
выборка
Недостатком этого варианта стекинга является то, что М обучается толь-
ко на части Х2 обучающей выборки, а часть XI им не используется. Во избежа-
ние этого, алгоритм повторяется с взаимозаменой (XI, Y1) и (Х2, Y2). В таком
случае получаются два предсказания для валидационной выборки, которые
можно усреднить. Более эффективным с точки зрения достижимого качества
решением этой проблемы является следующая идея повторения Алгоритма 1, с
использованием различного разбиения каждый раз и последующего усреднения
полученных предсказаний.
Алгоритм ансамб.шрования стекинг
Основными видами машинного обучения являются классическое обу-
чение, обучение с подкреплением, ансамбли и нейросети и глубокое обучение.
Мы поговорим подробнее про ансамбли.
Ансамблевые методы - это система теорий машинного обучения, в ко-
торой несколько не очень эффективных методов обучения обучаются исправ-
лять ошибки друг друга, и тем самым получают лучший результат.
В задачах прогнозирования, регрессии, классификации зачастую ни один
из алгоритмов не обеспечивает желаемого качества восстановления зависимо-
сти. Решение - компенсация ошибок отдельных алгоритмов за счёт друг друга.
Для этого строят специальные алгоритмы.
Чтобы реализовать ансамблевый метод нужно вначале отобрать слабые
методы (их еще называют слабыми учениками). Для их выбора самыми важны-
ми особенностями для модели являются слабое смещение и разброс модели.
Чтобы решение было возможным, мы хотим, чтобы в модели было достаточно
степеней свободы для разрешения базовой сложности данных, с которыми мы
работаем, но также, чтобы у нее было не слишком много степеней свободы,
чтобы избежать ее высокого разброса и быть более устойчивой. Это компро-
мисс между смещением и разбросом. В ансамблевом методе мы используем
«слабых учеников» для построения более сложной системы с помощью их объ-
единения.
Отдельно слабые методы работают не так точно, так как имеют высокое
смещение или большой разброс. Поэтому ансамблирование помогает умень-
шить смещение и разброс, объединяя их и создавая сильную модель способную
на лучший результат. Ансамбль можно собрать различными способами, но есть
три способа для получения наиболее точного результата:
• Бэггинг - из набора данных берутся случайные выборки, на них обуча-
ется один алгоритм много раз и в конце ответ усредняется. Пример бэг-
гинга поиск лиц людей в кадре телефона.
• Бустин! - алгоритмы обучаются последовательно, и следующий алго-
ритм учится на ошибках предыдущего. То есть из исходных данных бе-
рутся выборки для следующего алгоритма, в каждую новую выборку бе-
рутся части данных, в которых ошибся предыдущий алгоритм. Приме-
ром является поиск запроса в Яндексе.
• Стекинг - обучаются несколько разных алгоритмов, они передают их
результаты последнему, который принимает итоговое решение. Чаще
всего для решающего окончательного алгоритма берут регрессию. Сте-
кинг применяется очень редко, так как бэггинг и бустинг более точные
методы.
Рассмотрим подробнее способ собрания ансамбля - стекинг.
Главными двумя отличиями стекинга является использование слабых
учеников с разными алгоритмами и объединение моделей учеников в метамо-
дель. Стекинг более непредсказуем в работе чем остальные способы из-за раз-
ного обучения системы на входных данных.
Алгоритм обучения (рис. 1) начинается с деления выборки на к-фолдов.
k-Fold имеет отношение к кросс-валидации или по-другому перекрёстной про-
верке.
Перекрёстная проверка определяется как метод оценки модели и ее пове-
дение на ограниченной выборке независимых данных. k-Fold это к блоки, кото-
рые используются в одном из типов кросс-валидации: кросс-валидация по к
блокам. В этом типе данные делятся на части, количество которых равно к. Да-
лее для тестирования берется одна часть данных, а модель обучается на к-1 ча-
стях. Берется следующая часть данных для тестирования, и так происходит к
раз, пока каждая из частей будет использована для тестирования. В следствии
имеем к итоговых результатов, их количество равно количеству частей выборки
данных. Результаты усредняются и по итогу выводится оценка работы модели
на взятых данных.
Вторым шагом алгоритма будет создание набора прогнозов слабых уче-
ников для каждой k-части выборки. На полученных слабыми моделями резуль-
татах обучается мета модель.
Рисунок 1 - Алгоритм обучения метамодели
В практической части вы встретитесь с использованием One-hot кодиро-
вания. Одно-горячая кодировка или Быстрое кодирование - это методика
представления категориальных данных в виде двоичных векторов. Использовав
данный метод, мы делаем шаг в обработке наших данных. Но-другому, можно
сказать, что это метод, с помощью которого категориальные данные преобра-
зуются в подходящую форму алгоритмам машинного обучения.
К сожалению, искусственный интеллект еще не дошел до уровня пред-
сказания по изначальной таблице данных, поэтому перед созданием модели
необходимо предварительно подготовить данные, а именно закодировать дан-
ные в понятный компьютеру язык чисел.
Вторым важным шагом до моделирования является нормализация - это
изменение масштаба или распределения данных. Нормализация используется
как правило для лучшей работы и быстрого схождения алгоритмов машинного
обучения, то есть лучшей их производительности и для избегания смешения в
результате.
Стандартизация данных заключается в том, чтобы масштабировать дан-
ные таким образом, чтобы они попадали в небольшой конкретный интервал,
удалять единичные ограничения данных и преобразовывать их в безразмерное
чистое значение, чтобы можно было сравнивать и взвешивать показатели раз-
личных единиц или величин.
В Python в библиотеке skleam существует класс StandardScalerQ, который
можно использовать для нормирования набора данных перед работой с моделью.
Ceib векторного квашокания (LVQ)
Чго takoe сеть векюрно! о кван!окания
Сеть векторного квантования (англ. LVQ - learning vector quantization) -
это тип искусственной нейронной сети, который также вдохновлен биологиче-
скими моделями нейронных систем. Он основан на прототипе алгоритма клас-
сификации контролируемого обучения и обучил свою сеть с помощью алго-
ритма конкурентного обучения, аналогичного самоорганизующейся карте
(англ, self-organising maps, SOM).
Поскольку алгоритм использует контролируемое обучение, сети будет
предоставлен набор обучающих шаблонов с известной классификацией наряду
с начальным распределением выходного класса. После завершения процесса
обучения LVQ классифицирует входной вектор, назначая его тому же классу,
что и выходной блок.
LVQ алгоритм не особенно эффективен по сравнению с некоторыми дру-
гими, он на удивление прост и интуитивно понятен. Кроме того, у него есть не-
которые расширения, которые могут сделать алгоритм мощным инструментом
для решения множества задач, связанных с машинным обучением.
Как говорилось ранее LVQ - это так называемый метод обучения на ос-
нове прототипов. Один или несколько прототипов используются для представ-
ления каждого класса в наборе данных, каждый прототип описывается как точ-
ка в пространстве функций. Затем новым (неизвестным) точкам данных при-
сваивается ближайший к ним класс прототипа. Чтобы «ближайший» имел
смысл, необходимо определить меру расстояния. Можно выбрать любую мет-
рику расстояния (обычно Евклидово расстояние является предпочтительной
мерой расстояния).
Нет ограничений на количество прототипов, которые можно использо-
вать для каждого класса, единственное требование состоит в том, чтобы для
каждого класса был хотя бы один прототип.
На изображении ниже показана простая система LVQ, в которой каждый
класс (красный и синий) представлен одним прототипом (большие точки).
Рисунок 1 -2Г)-система LVQ с соответствующими прототипами,
представляющими каждый класс
Как же подобрать прототипы к каждому классу, чтобы они хорошо пред-
ставляли этот класс? Применим метрику евклидова расстояния.
Напомним, что евклидово расстояние между двумя векторами в N изме-
рениях определяется как квадратный корень из суммы квадратов разностей
между двумя векторами:
г/(/7. г) = ||/7 - г |
= \/( 1/1 - Г1Г2 + («2 - *’2>2 + + («о - ’’л)2
Каким образом этого можно достигнуть?
Первым шагом является инициализация каждого прототипа, обычно про-
тотипы инициализируются с использованием средств класса.
Следующим шагом является просмотр набора данных, по одному вектору
признаков за раз. Для каждого такого вектора признаков нам нужно вычислить
расстояние до каждого прототипа, используя выбранную меру расстояния. За-
тем мы делаем шаг обновления только до ближайшего прототипа. Если прото-
тип имеет ту же метку, что и вектор признаков, он смещается к вектору призна-
ков, в противном случае он отталкивается от него в противоположном направ-
лении. Величина толчка определяется скоростью обучения, которая является
одним из параметров алгоритма.
Как только мы сделаем это для каждой выборки в нашем наборе данных,
мы можем повторить этот процесс много раз, пока алгоритм не сойдется. Один
проход по набору данных также называется эпохой обучения. Для достижения
сходимости алгоритму обычно требуется несколько эпох, в за виси моста от
сложности задачи.
Архитектура
На следующем рисунке показана архитектура LVQ, которая очень похожа
на архитектуру KSOM. Как мы видим, существует «п» количество единиц вво-
да и «т» количество единиц вывода. Слои полностью взаимосвязаны с весом на
них.
Рисунок 2 - Архитектура LVQ
Используемые параметры
Ниже приведены параметры, используемые в процессе обучения LVQ, а
также в блок-схеме:
• х = вектор обучения (xj, ..., х„ ..., хп)
• Т = класс для обучающего вектора х
• Wj = весовой вектор для j-й единицы измерения
• Cj = класс, связанный с j-й единицей вывода
• х = вектор обучения (xi, ..., х.хп)
• Т = класс для обучающего вектора х
• Wj = весовой вектор для j-й единицы измерения
• Cj = класс, связанный с j-й единицей вывода
Алгоритм обучения
IJIar 1 - Инициализировать опорные векторы, что можно сделать следу-
ющим образом:
• Шаг 1 (а) - Из данного набора тренировочных векторов взять первые «ш»
(количество кластеров) тренировочных векторов и использовать их в ка-
честве весовых векторов. Остальные векторы могут быть использованы
для обучения.
• Шаг 1 (б) - Присвойте начальный вес и классификацию случайным обра-
зом.
• Шаг 1 (с) - Применение метода кластеризации К-средних.
Шаг 2 - Инициализировать опорный вектор alpha.
Шаг 3 - Продолжайте с шагов 4-9, если условие остановки этого алго-
ритма не выполняется.
Шаг 4 - Выполните шаги 5-6 для каждого входного вектора обучения х.
Шаг 5 - Рассчитать квадрат евклидова расстояния для j = 1 до m и i = от 1
доп
l)(j)= displaystyle sum limitni=l displaystyle sum limitmj=l(xi-wij)2
Шаг 6 - Получить выигрышную единицу J, где I) (j) минимально.
Шаг 7 - Рассчитайте новый вес выигрышной единицы по следующему
соотношению:
если Т = Cj,
то w1 (новый)=Wj (старый)+ alpha[x-Wj (старый)]
если Т Cj,
то Wj (новый)=Wj (старый)- alpha[x-w( (старый)]
Шаг 8 - Уменьшите скорость обучения alpha.
Шаг 9 - Проверка состояния остановки. Остановка обуславливается сле-
дующим:
• Максимальное количество эпох достигнуто;
• Скорость обучения снижена до незначительного значения.
Кластеризация на основе распределений
1. Введение
Ilpoipecc в области технологий считывания и хранения данных в цифро-
вом виде позволило упростить работу с ними, но в то же тремя привело к появ-
лению больших наборов данных.
Сообщения в социальных сетях, разнообразие фото и видео контента на
просторах интернета, всб-страницы, электронная почта - все это создает тера-
байты данных каждый день. Как правило большая часть их них не структури-
рована, что усложняет анализе. Например, в NASA, при исследовании космоса,
поступает огромное количество данных со спутников, телескопов, орбитальных
станций, которые не так легко и быстро можно обработать и проанализировать.
Итак, автоматическое понимание, обработка и обобщение данных необ-
ходима во многих сферах (робототехника, компьютерное зрение). На сего-
дняшний день все это во многом полагается на машинное обучение. Системе
даются обучающие данные (training data) I некоторые наблюдения и МО ис-
пользует эти данные и алгоритмы для получения «опыта» с постепенным по-
вышением точности.
Организация данных в разумные i руппы - одна из самых фундаменталь-
ных способов понимания и обучения.
Есть два различных стандартных способа обучения: методы классифика-
ции (к ближайших соседей) и кластеризации (K-Means...).
Классификация относится к контролируемому обучению (обучение с
учителем). Она хорошо работает, когда есть то, что называется помеченные
данные (обучающие шаблоны с известными метками категорий).
Кластеризация относится к методу обучения без учителя. Ее можно рас-
сматривать как форму классификации в том смысле, что она создает маркиров-
ку объектов с помощью меток классов (кластеров). Однако она выводит эти
метки только из данных. Поэтому кластеризацию иногда называют как некон-
тролируемую классификацию (неконтролируемое обучение). Кластеризация
включает немаркированные данные, что дает возможность использовать боль-
шие объёмы данных, поскольку их не нужно помечать руками для обучения, а
также это дает неясность измерения качества методов, из-за отсутствия таких
же прямолинейных и интуитивно понятных метрик, как в задачах обучения с
учителем.
Как говорилось ранее, машинное обучение предполагает работу с боль-
шим количеством данных. Нод работой имеется ввиду анализ. Кластеризация
помогает сгруппировать данные для дальнейшего более легкого и быстрого
анализа данных, выводов и предсказания. Иными словами, она позволяет полу-
чать нужную информацию из шаблонов данных.
В дальнейшем более подробно будет рассматриваться кластеризация.
2. Кластеризация
Кластер (англ, cluster) - это набор сгруппированных вместе сущно-
стей/объектов, схожих между собой больше, чем с элементами других класте-
ров (групп), иными словами - набор компактных и изолированных точек.
Кластеризация (англ, clustering) или кластерный анализ (англ, cluster
analysis) - это одна из самых фундаментальных проблем машинного обучения
без учителя. Ее основная цель заключается в разделении данных на кластеры
схожих точек данных.
Чем больше сходство внутри кластера и чем больше разница между кла-
стерами, тем отчетливее кластеризация.
Рисунок 1 - Пример кластеризации
Однако это довольно расплывчатое определение кластеризации. Оно
предполагает, что объекты для кластеризации представлены в виде точек в про-
странстве измерения. Объекты можно группировать в кластеры с разными це-
лями. Данные могут выявить кластеры разных форм, размеров и плотности.
Проблема усугубляется тем, что число объектов в кластерах может со временем
меняться (например, в звездных скоплениях - количество скоплений часто за-
висит от разрешения, с которым просматриваются данные. Наличие шума в
данных также затрудняет обнаружение кластеров.
Рисунок 2 - Вариан [ы кластеризации
Будет использован пример, для лучшего понимания сложности решения,
разделения на кластеры. Допустим у нас есть двадцать две точки - рисунок 3
(а). Можно разделить их на две-шесть групп соответственно (б-г). Тем не ме-
нее, разделение каждого из двух больших кластеров на еще три подкластера (г)
может быть очевидно только для человеческого зрения. Кроме того, может
быть неразумно говорить, что точки образуют пять кластеров (в). Тем самым
можно сказать, что определение кластера неточно.
Рисунок 3 - Различные варианты кластеризации
Вместо «сходства» иногда удобнее рассмотреть обратную сторону - по-
нятие «несходство». А естественным выбором для представления «несходства»
между парами точек может быть Евклидово расстояние:
= £ (to)* -(*Д)
где Xi - это вектор, а (х<)/ - это i-й элемент этого вектора.
Итак, можно сказать, что кластеризация - это совокупность методов и ал-
горитмов, для разбиения на кластеры схожих между собой сущностей на основе
такого критерия сходства, чтобы близость между ними в одном кластере была
высокая, в то время как сходство между сущностями из разных кластеров низ-
кое (например, исходя из информации о расстояниях или мерах близости).
Тем не менее наилучшее определение кластеров зависит от природы дан-
ных и желаемого результата.
3. Применение кластеризации
Кластеризация данных также известна как Q-анализ, типология, группи-
рование и таксономия в зависимости от области применения. Разработка ее ме-
тодологии была поистине междисциплинарной задачей. Люди из разных сфер
(социология, психология, статистика, биология, медицина и др.), которые соби-
рают и обрабатывают данные внесли свой вклад в ее развитие. Иными словами,
кластерный анализ распространен в любой дисциплине, которая включает ана-
лиз многомерных данных. Алгоритмы кластеризации также широко изучались
при интеллектуальном анализе данных.
Кластеризация используется во многих направлениях. Например, она мо-
жет использоваться для распознавания рукописных символов (переводчик,
бланки с ответами, формулы и др.), поскольку каждый пользователь пишет од-
ни и те же символы по-разному, в зависимости от почерка.
Также ее можно применять в поисковых запросах для вывода результата
в более организованном виде. Кластеризация i рун пирует результаты поиска в
небольшое количество кластеров, каждый из которых захватывает определен-
ный аспект запроса. Например, запрос «книга» возвращает Веб-страницы,
сгруппированные по таким категориям, как книжные магазины, подборка книг,
авторы и рецензия. Каждый кластер можно разбить на подкластеры, создавая
иерархическую структуру.
Кластеризация распространена и в медицине для выявления заболеваний,
установления диагноза, его лечения и предположения дальнейшего исхода.
Помимо собственных задач, кластеризация полезна для множества других
фундаментальных проблем. Например, она может служить для автоматической
маркировки данных в методах обучения с учителем, а также в качестве этапа
предварительной обработки для визуализации и анализа данных.
Кластеризация данных используется для следующих целей:
• Базовая структура - понимание данных, генерация гипотез, выявление
характерных особенностей.
• Естественная классификация - определение степени сходства между
объектами по признакам.
• Сжатие - сокращение объема исходных данных (метод организации
данных).
• Одноклассовая классификация - поиск сущностей, которые не входят ни
в один кластер (шум).
• Таксономия - построение иерархии множества объектов (например
классификация животных и растений К. Линнея).
4. Типы кластеризации
Секционированная кластеризация - сущности разделяются на непересе-
кающиеся подмножества (кластеры) так, чтобы каждая сущность находилась
ровно в одном подмножестве. Например, данную кластеризация можно пред-
ставить как взятую по отдельности каждую коллекцию кластеров на рисунке 3
(б-г).
Иерархическая кластеризация - это набор вложенных кластеров, органи-
зованных в виде дерева (у кластеров есть свои подкластеры). Например, есть
два кластера (рисунок 3 (б)), у которых есть подкластеры (рисунок 3 (в)), в
свою очередь, у которых тоже могут быть свои подкластеры и т. д. Иерархиче-
скую кластеризацию можно рассматривать как последовательность секциони-
рованных кластеризаций.
Полная кластеризация - сущности разделяются на кластеры таким обра-
зом, что каждая сущность может принадлежать лишь одному кластеру.
Частичная кластеризация - используется для отражения того факта, что
некоторые сущности в наборе данных могут не принадлежать к четко опреде-
ленным группам (кластерам). Например, это может быть шум.
Эксклюзивная кластеризация - кластеризация, которая, относит каждую
сущность к одному кластеру (рисунок 3 (а)).
Перекрывающаяся кластеризация - используется для отражения того
факта, что сущность можно поместить в несколько кластеров одновременно
(человек в театре может быть как зрителем, так и актером) или когда сущность
находится между кластерами и может быть разумно отнесена к любому из них.
Нечеткая кластеризация - используется для отражения того факта, что
сущность может состоять в нескольких кластерах, при этом указывается сте-
пень (вес) ее принадлежности для каждого из них. Сущность принадлежит каж-
дому кластеру с весом от 0 до 1, где 0 - абсолютно не принадлежит и 1 - абсо-
лютно принадлежит, а сумма весов для каждой сущности должна равняться 1.
Например, имеются три кластера, обозначенные разными цветами. Выберем
любую точку данных (рис. 4). Вероятность того, что она будет частью синего
кластера, равна I, а вероятность того, что она будет частью зеленого или корал-
лового равна 0.
Рисунок 4 - Точка в синем кластере
Однако если рассмотреть точку между зеленым и синим (рис. 5), то веро-
ятность того, что эта точка является частью кораллового кластера равна 0. Од-
нако вероятность того, что она принадлежит синему и зеленому уже составляет
0.7 и 0.3 соответственно.
Рисунок 5 - Точка между кластерами
5. Алгоритмы кластеризации
Существует огромное количество алгоритмов кластеризации. Ниже будут
приведены наиболее популярные.
• Алгоритм иерархической кластеризации (Hierarchical clustering) - это
спецификация шагов для выполнения иерархической кластеризации. Этот алго-
ритм основывается на расстоянии между сущностями.
Первый шаг - присвоение каждого элемента его собственному кластеру
(есть N элементов и N кластеров, каждый из которых содержит только один
элемент). Однако это решение банально. В таком случае накладывается какое-
либо ограничение (например, число кластеров или минимальное расстояние
между ними).
Второй шаг - найти наиболее похожую пару кластеров и объединить их в
один кластер, чтобы вместо N кластеров было N-1.
Далее второй шаг продолжается до тех пор, пока все элементы не будут
сгруппированы в один кластер размером N.
Последний шаг обычно останавливают где-то в процессе, т. е. создается
дендрограмма иерархической кластеризации (схема в виде дерева) для иллю-
страции расположения кластеров на соответствующем этапе.
Это называется агломератавная кластеризация, поскольку начинается с
множества вещей (создастся дерево от листьев к стволу). Обратный случай -
дивизионная кластеризация (от ствола к листьям).
• Метод k-средних (k-means) - это итеративный алгоритм, основанный на
прототипе методики секционированной кластеризации, который пытается найти
заданное количество кластеров К, которые представлены как центроиды. Он ос-
новывается на расстоянии между сущностями и центроидами, т. е. стремится
уменьшить суммарное квадратичное отклонение сущностей кластера от центро-
ида этого кластера. Также это более быстрый алгоритм и более полезный, когда
известно сколько кластеров нужно.
Сначала выбирается К сущностей в качестве центроидов (случайным об-
разом, равномерным распределением или с использованием более простого ал-
горитма кластеризации). Далее идет создание К кластеров путем назначения
каждой сущности ближайшему центроиду. Потом вычисляется новый центроид
усредняя сущности в каждом кластере. Данная итерация повторяется до тех
пор, пока на некотором этапе ни один центроид не будет изменен.
• Кластеризация на основе моделей распределения - это модель кластери-
зации, которая основывается на возможной вероятности того, что все точки
данных в кластере принадлежат одному и тому же распределению (нормально-
му, гауссовскому).
Полезной особенностью этого подхода является то, что он похож на вы-
борку случайных объектов из распределения для создания искусственного
набора данных.
Далее более подробно будет рассмотрена гауссова смесь распределений.
Производительность алгоритмов кластеризации зависит от многих факто-
ров: от выбора количества кластеров, от выбора центроидов (в случае k-means),
т. е. от типа входных данных (для разных задач и наборов данных мо1ут потре-
боваться разные меры сходства и разные методы разделения).
6. Выбор количества кластеров
Конечно, существуют алгоритмы, которые нс требуют указания количе-
ства кластеров (иерархическая кластеризация), однако есть и такие, где этот па-
раметр обязателен (GMM, k-means).
Рассмотрим некоторые варианты нахождения количества кластеров.
Определить число кластеров можно из контскста/знанию предметной об-
ласти задачи (например, существует четыре различных царств в биологи).
Также можно визуализировать данные.
Другой способ - попробовать разные правдоподобные значения К и оце-
нить качество результата на основе заранее определенного критерия.
Можно также использовать иерархическую кластеризацию для подмно-
жества данных.
7. Гауссова смесь распределений
Модели гауссовой смеси (GMM - Gaussian mixture models) - это алго-
ритм, основанный на смеси гауссовых распределений. Поскольку используется
нечеткая кластеризация, то параметром выступает смесь весов компонентов (л),
а также среднее значение (р) / ковариационная матрица (X) - для многомерного
случая.
Гауссово распределение (нормальное распределение) имеет форму коло-
колообразноп кривой, а точки данных симметрично распределены вокруг сред-
него значения (р).
Допустим, существует к гауссовских распределений со средними значе-
ниями (рк) и значениями ковариации (Lk). Также присутствует еще один пара-
метр. который определяет количество точек для распределения, т. е. плотность
распределения.
Для одномерной колоколообразной кривой плотность распределения:
f{x М,ст2) = —— е *2
у 2тг(т-
2
где р - среднее значение, а о- - дисперсия.
Рисунок 6 - ID Gaussian
Для двумерной кривой плотность распределения рассчитывается:
f(x р, Z ) = — - слр
<271121
где х - входной вектор, р - средний вектор, a Z - ковариационная матрица.
Рисунок 7 - 2D Gaussian
После определения количества кластеров и присваивания случайным об-
разом значения для среднего, ковариации и плотности, выполняется алгоритм
ожи д ан и я - макси м и за ц и и.
8, Алгоритм ожидания-максимизации
Алгоритм ожидания-максимизации, или ЕМ-алгоритм (ЕМ Expectation-
Maximization) - это итеративный подход для поиска максимального правдопо-
добия в присутствии скрытых переменных (это универсальный метод, т. е. нс
только для кластеризации GMM).
ЕМ-алгоритм состоит из двух этапов:
• Шаг Е (expectation) - оценка (предположение) значений недостающих
или скрытых переменных.
Необходимо найти вероятность принадлежности каждой точки Xj распре-
делению/кластеру ji, ..., j\, т. е. разделить вероятность принадлежности Xj кла-
стеру на сумму принадлежностей Xi к ji, jk:
9ii ~
• М-шаг или шаг максимизации (maximization) - на основе значений, по-
лученных на предыдущем шаге, полные данные используются для об-
новления параметров.
Необходимо обновить среднее значение, значение ковариации и плот-
ность распределения. Они обновляются следующим образом:
Плотность распределения обновляется соотношением количества точек в
кластере и общего количества точек.
Среднее значение и ковариационная матрица обновляются на основе зна-
чений. присвоенных распределению, пропорционально значениям вероятности
для точки данных. Следовательно, точка данных, которая является частью этого
распределения с большей вероятностью, будет вносить большую часть:
где п - количество точек в кластере и Т - оператор транспонирования.
На основе обновленных значений, сгенерированных на этом этапе, вы-
числяются новые вероятности для каждой точки данных и итеративно обнов-
ляются значения. Этот процесс повторяется для максимизирования функции
логарифмического правдоподобия.
Алгоритм кластеризации кластерный центроид
Кластеризация - это задача машинного обучения, которая автоматически
разделяет множество данных на кластеры, то есть на труппы объектов с похо-
жими характеристиками. В то же время количество кластеров и их содержимое
заранее не известно. Кластеризация основывается на принципе, согласно кото-
рому записи внутри кластера должны быть очень похожи друг на друга, но
сильно отличаться от записей снаружи. Идея заключается в том, что группи-
ровка данных проходит таким образом, чтобы связанные элементы размеша-
лись вместе.
Кластеризация используется для «сжатия данных», то есть для сокраще-
ния объема, так как данные внутри каждого кластера будут рассматриваться
как один объект. Это помогает в упрощении очень больших наборов данных за
счет группировки большого количества объектов с аналогичными значениями в
гораздо меньшее число однородных категорий.
В целом, кластеризация полезна всякий раз, когда разнообразные данные
могут быть проиллюстрированы гораздо меньшим числом групп. Это приводит
к созданию значимых и действенных структур в рамках данных, которые сни-
жают сложность и дают представление о закономерностях взаимосвязей.
Алгоритм к-средних
Алгоритм к-средних включает в себя присвоение каждого из п объектов
одному из к кластеров, где к - число, которое определено заранее. Алгоритм
работает на основе центроида - центральной точки кластера. Цель данного ал-
горитма состоит в том, чтобы минимизировать сумму расстояний между цент-
роидами и их соответствующими кластерами, а следовательно, свести к мини-
муму различия внутри каждою кластера и максимизировать различия между
кластерами.
Данный алгоритм включает в себя 2 этапа. Во-первых, он присваивает
объекты исходному набору из к кластеров, каждый из которых имеет свой цен-
троид. Затем он обновляет распределения, корректируя границы кластера в со-
ответствии с объектами, которые в настоящее время попадают в кластер. Про-
цесс обновления и распределения выполняется несколько раз, пока внесение
изменений больше не улучшит результаты. В этот момент процесс останавли-
вается, и кластеры формируются окончательно.
Чтобы увидеть, как процесс распределения и обновления осуществляется
на практике, рассмотрим пример, который проиллюстрирует работу метода.
Имеется выборка данных по двум параметрам. Так как алгоритм к-
средних обрабатывает значения объектов как координаты в многомерном про-
странстве, можно представить пространство объектов в виде двумерной точеч-
ной диаграммы как показано на рис. 1.
Рисунок 1 - Выборка данных
Алгоритм к-средних начинается с выбора к точек в пространстве объек-
тов, которые будут служить центрами кластера - центроидами. Часто точки вы-
бираются путем выбора к случайных объектов из набора обучающих данных.
Определим 3 кластера, следовательно выбирается к = 3 точки. Эти точки обо-
значены звездами на рис. 2:
Рисунок 2 - Первоначальное определение центроидов
Существует несколько других способов выбора начальных петров кла-
стера. Одним из вариантов является выбор случайных значений, встречающих-
ся в любом месте пространства, вместо того чтобы выбирать только значения,
наблюдаемые в данных. Другой вариант - вообще пропустить этот шаг - слу-
чайным образом распределяя каждый объект кластеру, алгоритм может сразу
перейти к этапу обновления. Каждый из этих подходов добавляет определен-
ный уклон к конечному набору кластеров, который вы можете использовать для
адаптации своих результатов.
После выбора начальных центров кластера - центроидов, все объекты
распределяются к наиболее похожему центру кластера, то есть к самому бли-
жайшему. Для определения расстояния между центроидом и объектами в мето-
де k-средних используется евклидово расстояние. Формула евклидова расстоя-
ния:
dist(x,y) =
Как показано на рис. 3, три центроида разделяют данные на три сегмента,
помеченные как кластер А, В и С. Пунктирные линии указывают границы диа-
граммы, созданной центрами кластеров. Диаграмма показывает области, кото-
рые находятся ближе к одному центроиду, чем к любому другому; вершина, в
которой сходятся все три границы, является максимальным расстоянием от
всех грех центров кластера. Используя эти границы, можно увидеть области, на
которые претендует каждый из начальных центроидов:
Рисунок 3 - Первоначальное определение кластеров
Теперь, когда начальная фаза завершена, алгоритм k-средних переходит к
(разе обновления. Первый шаг обновления кластеров включает перемещение
начальных центроидов в новое местоположение. На рис. 4 показано, как центры
кластеров смещаются к новым центроидам:
Рисунок 4 - Перемещение центроидов
Поскольку границы кластера были скорректированы в соответствии с пе-
ремещенными центрами, кластер А может претендовать на дополнительный
объект из кластера В (обозначен стрелкой). Из-за этого переназначения алго-
ритм к-средних будет продолжен на следующем этапе обновления. После вы-
числения центроидов для кластеров диаграмма выглядит следующим образом:
Рисунок 5 - Обновление кластеров
На данном этапе еще две точки были переназначены из кластера В в кла-
стер А. так как теперь они ближе к центроиду для А, чем В. Это приводит к
другому обновлению, как показано на рисунке:
Рисунок 6 - Обновление кластеров
Если на этом этапе никакие точки не были переназначены, значит алго-
ритм k-средних нашел лучшие центроиды и, соответственно останавливается.
Назначения кластеров являются окончательными.
Выбор подходящею количества кластеров
Алгоритм k-средних может быть чувствителен к случайно выбранным
центрам кластеров. Действительно, если бы мы выбрали другую комбинацию
из грех отправных точек в предыдущем примере, то могли бы найти кластеры,
которые разделяют данные иначе, чем мы ожидали. Выбор количества класте-
ров требует тонкого баланса. Установка значения к очень большим, конечно,
улучшит однородность кластеров, но в то же время может привести к перепол-
нению данных.
В идеале у вас должны быть некоторые априорные, предварительные
знания об истинных группировках, и вы можете начать применять метод
k-средних, используя данную информацию. Например, если вы группировали
фильмы, то могли бы начать с установки к, равного количеству жанров. Иногда
количество кластеров диктуется определенными требованиями. Например, ко-
личество столов в зале заседаний может определять, сколько групп людей сле-
дует создать из списка участников. Распространим эту идею на бизнес-пример.
Если у отдела маркетинга есть ресурсы только для создания трех отдельных ре-
кламных компаний, то имеет смысл установить к = 3, чтобы распределить всех
потенциальных клиентов к одному из трех вариантов.
Без каких-либо априорных знаний одно правило предлагает установить
к = у/п, где п - количество объектов в наборе данных. Однако это правило
приведет к очень большому количеству кластеров для больших наборов дан-
ных. Поэтому существуют другие методы, которые могут помочь в поиске под-
ходящего набора кластеров.
Производительность алгоритма кластеризации K-средних зависит от вы-
сокоэффективных кластеров, которые он формирует. Но выбрать оптимальное
количество кластеров - большая задача. Рассмотрим «метод локтя» - метод,
для поиска оптимального количества кластеров.
Данный метод пытается оценить, как изменяется однородность или неод-
нородность внутри кластеров при различных значениях к. Как показано на
рис. 7 и рис. 8, ожидается, что однородность внутри кластеров будет увеличи-
ваться по мере добавления дополнительных кластеров; аналогичным образом,
неоднородность также будет продолжать уменьшаться с увеличением числа
кластеров. Поскольку можно продолжать наблюдать улучшения до тех пор, по-
ка каждый объект не окажется в своем собственном кластере, цель состоит не в
том, чтобы максимизировать однородность или минимизировать неоднород-
ность, а в том, чтобы найти значение к таким, чтобы наблюдалось уменьшение
отдаленности между точками. Предполагается в качестве значения к выбрать
точку, где будет происходить изменение характера поведения функции одно-
родности (неоднородности), где на оси абсцисс располагается количество кла-
стеров, а на оси ординат значение WCSS - внутрикластерная сумма квадратов,
которая определяет общие вариации внутри кластера. Это значение к известно
как точка локтя, так как оно похоже на локоть.
Рисунок 7 - Точка локтя
Рисунок 8 - Точка локтя
Иерархические алгоритмы (иерархия кластеров)
Для визуального представления результатов кластеризации использует-
ся дендрограмма (пример дендро1раммы приведен на рисунке 1)- дерево, по-
строенное по матрице мер близости между кластерами.
Рисунок 1 - Пример дендрограммы, применяемой в кластерном анализе
В узлах дерева находятся подмножества объектов из обучающей выбор-
ки. При этом на каждом ярусе дерева множество объектов из всех узлов состав-
ляет исходное множество объектов. Объединение узлов между ярусами соот-
ветствует слиянию двух кластеров. При этом длина ребра соответствует рассто-
янию между кластерами.
Дерево строится от листьев к корню. В начальный момент времени каж-
дый объект содержится в собственном кластере. Далее происходит итератив-
ный процесс слияния двух ближайших кластеров до тех пор, пока все кластеры
не объединятся в один или не будет найдено необходимое число кластеров. На
каждом шаге необходимо уметь вычислять расстояние между кластерами и пе-
ресчитывать расстояние между новыми кластерами.
Искусственная нейронная сеть
1Л. Нейроны и искусственные нейронные сети
11ейронные сети (искусственные ИС) отражают поведение человеческого
мозга, позволяя компьютерным программам распознавать закономерности и
решать общие проблемы в области искусственного интеллекта, машинного
(англ. - Machine learning'. без вмешательства человека, используя структуриро-
ванные данные) и глубокого (англ. - Deep learning} подмножество машинного
обучения, в котором существует множество уровней алгоритмов) обучения.
Изучение и использование искусственных нейронных сетей началось в
начале XX века. Интерес к ИНС связан с появлением продвинутых вычисли-
тельных устройств достаточных мощностей для работы с искусственными
нейронными сетями.
Нейронные сети улучшают алгоритмы обучения, создают модели интер-
фейса, подстраивающегося под пользователя, решают прикладные задачи раз-
ных уровней. В наши дни усилился интерес к поиску эффективных методов
синхронизации работы НС на параллельных устройствах [13].
НС состоит из нейронов, которые в свою очередь связаны между собой
определенным образом. Мы выяснили, что название и структура нейрона вдох-
новлены человеческим мозгом, имитируя способ, которым биологические
нейроны передают друг другу сигналы.
Нейрон представляет из себя элемент, который по определенным прави-
лам формирует выходной сигнал из набора входных сигналов. В начале проис-
ходит прием данных от предшествующих фрагментов сети и комбинирование
входных сигналов. Затем корректировка входного значения в соответствии с
весом связи между нейронами. Вес связи - это коэффициент, определяющий,
будет ли усилен или ослаблен сигнал. В связи с корректировкой вычисляется
выходной сигнал, который переносится к последующим фрагментам НС.
Порядок связей искусственных нейронов может отличаться - это опреде-
ляется структурой конкретной ИНС. Нейросеть является так называемым «чер-
ным ящиком», в котором есть входы и выходы. В это время ящик содержит в
себе огромное количество нейронов (рис. 1).
Input layer
Hidden layer Output layer
Рисунок I - Модель нейронной сети
1.2. Классификация нейронных сетей
1.2.1. По типу настройки весов
По типу настройки весов сети бывают со связями:
• фиксированными - коэффициенты «весов» НС известны сразу;
• динамическими - наспройка весовых функций производится в процес-
се обучения.
] .2,2. По характеру обучения
С учителем. В таких ИНС для любого набора входных данных заявлены
выходные требуемые, которые в совокупности именуются обучающей парой.
Часто сеть обучается на нескольких таких парах. При этом веса связей изме-
няются и корректируются в соответствии с алгоритмом минимизации ошибки.
Веса подстраиваются для входного вектора, пока ошибка не достигнет
наименьшего значения по всему обучающему набору.
Без учителя. Такое обучение больше похоже на реальное, потому что
моделирует природную работу мозга. У биологического механизма мышления
нет потребности в определенном конечном результате размышлений, так дан-
ный алгоритм происходит без конкретного целевого вектора для выходов.
Обучение ИНС без учителя подгоняет веса нейронной сети так. чтобы выраба-
тывались скоординированные выходные параметры. При этом введение до-
вольно похожих входных параметров выдаёт идентичные выходы.
1.2.3. По типу входной информации
Аналоговые сеги - это входные сигналы заданы в виде действительных
чисел;
Двоичные сети - это входные сигналы заданы в двоичной системе
счисления.
1.2.4. По типам структур нейронов
Классификация искусственных нейронных сетей по виду структуры
нейронов делит их на:
Однородные сети - это такие сети складываются из нейронов общего
образца и имеют совместную функцию активации.
Неоднородные сети - это такие сети имеют разные функции активации.
1.3. Архитектура нейронных сетей
Существует два общих вида архитектуры искусственных нейронных се-
тей:
• Полносвязная искусственная нейронная сеть (рис. 2) - архитектуру
данной сети можно представить в виде кругового набора нейронов, где
связи, по которым передаются выходные сигналы, присутствуют меж-
ду всеми существующими в сети нейронами. Нейронами, имеющими
сигналы выхода из сети, могут быть как все, так и только некоторые
элементы сети. Чаще всего они приобретают возможность выходного
сигнала после нескольких циклов работы сети.
Рисунок 2 - Полносвязная нейронная сеть
• Многослойная искусственная нейронная сеть (рис. 3) - название такой
сети говорит само за себя, она состоит из слоёв, в котором может быть
любое число нейронов, не зависящее никоим образом от количества
нейронов в прочих слоях. Слои идёт друг за другом. Каждый слой име-
ет совместные входные параметры, приходящие с предыдущего слоя,
связи между слоями являются последовательными. Начальный слой та-
кой сети часто нумеруют как нулевой, он называется входным слоем, а
последний слой - выходной. Кроме входного и выходного слоя, в сети
может быть любое число слоёв, которые являются скрытыми. Такая
схема реализует модель «черного ящика» - мы знаем входы и выходы,
но внутренняя система скрыта.
Входной слой
Скрытый слой
Выходной слой
Рисунок 3 - Многослойная нейронная сеть
1.3.1. Типы многослойных нейронных сетей
Моноюнные. Монотонные сети к слоистым сетям, но на связи и нейро-
ны такой сети накладываются дополнительные условия. Все слои, кроме вы-
ходного, и связи делятся на два вида: возбуждающий и тормозящий. Если
нейроны одного вида связаны с нейронами другого вида только возбуждаю-
щими связями, то всякий выходной параметр второго вида является однооб-
разной неубывающей функцией любого выходного параметра первого вида. В
случае, когда нейроны связаны тормозящими связями, то функция, принадле-
жащая каждому выходному сигналу второго вида, является невозрастающей
функцией любого выходного сигнала первого вида. Также для такой сети ха-
рактерна однообразная зависимость выходного сигнала нейрона от парамет-
ров входных сигналов.
Сети без обратных связей. Распрослранение сигналов в сетях без об-
ратных связей идёт от слоя к слою попеременно. Не считая редких случаев,
любой выходной параметр слоя передаётся на вход всех нейронов последую-
щего слоя. Такие сети также делятся на полносвязные и частично полносвяз-
ные.
1.3.2. Сеги с обратными связями
Сети с образными связями отличаются тем, что сигналы в них переда-
ются с будущего слоя на предшествующий. Выделяются такие виды ИНС с
обратными связями, как:
• полносвязно-слоистые сети - при каждой передаче данных в подоб-
ной сети нейроны всех слоёв одновременно принимают сигналы от
нейронов своего слоя и следующих;
• слоисто-циклические сети - все слои подобной сети замкнуты между
собой в круг. Параметры выходного слоя передаются в первый. Все мо-
гут как принимать входные сигналы, так и выдавать их;
• слоисто-полносвязные сети - по своей структуре они похожи на пол-
носвязно-слоистые, но имеют ряд отличий. В такой сети каждый слой
представлен в виде полносвязной сети. Сигналы в сети передаются не
только от слоя к слою, но также и внутри слоя. Каждый слой сети рабо-
тает в три этапа: приёмка сигналов с предыдущего слоя, передача ин-
формации внутри самого слоя и расчёт выходного параметра для его
последующей передачи следующему слою.
1.4. Расчет нейрона
Как же вычисляется выходное значение нейрона? Для каждого нейрона
имеется определенное правило, с помощью которого высчитывается выходной
параметр. Это правило называется функцией активации. А само выходное
значение называется активностью нейрона.
Итак, функция активации нейрона - это математическая функция, с
помощью которой рассчитывается выходной сигнал нейрона. Внутрь этой
функции передаётся совокупность всех перемноженных сигналов и весов этих
сигналов.
Разберём наиболее встречающиеся функции активации (рис. 4).
1. Функция порог а - линейная функция.
fW =
1,х > а
(),х < а
2. Линейный порог. График такой функции состоит из 3 участков, два
из которых линейны, и функция активации на них равна минимально
допустимому и максимально допустимому значению, и участок, на ко-
тором функция активации монотонно возрастает.
/(х) = с * х
3. Гиперболический тангенс (hy perbolic tangent, tanh). Функция гипер-
болического тангенса принимает на вход рандомное вещественное чис-
ло и отдаёт вещест венное число, которое больше или равно -1 и мень-
ше ли равно 1. Такая функция может возрастать в сторону сильных
сигналов, но в основном держится относительно нуля.
2
/(х) = tanh(x) = - 1
1 4- е
4. Сигмоидальная функция или сшмоида (sigmoid). Это постоянно
возрастающая S-образная нелинейная диф-функция (дифференцируе-
мая). Функция синуса (сигмоида) усиливает слабые сигналы.
Рисунок 4 - Функции активации
Нейрон представляет собой элемент ИНС, который имеет несколько
входных сигналов и один выходной сигнал. В нейроне рассчитывается
взвешенная сумма (S) всех входных сигналов, после чего преобразовывает S
при помощи функции активации F нейрона. Множество, состоящее из поро-
гового уровня и весовых коэффициентов, является параметрами нейрона
(рис. 5).
Рисунок 5 - Схема нейрона
Согласно вышеуказанной модели искусственного нейрона (ИН),
S = WjXj + b,
где X), Х2, ..., Хп - входной вектор (сигнал, паттерн);
W|, W2,..., wn- весовые коэффициенты;
b - порог.
Функция активации:
Y=F(S)
1.5. Расчет нейронной сети
Один нейрон может выполнять лишь простейшие вычисления, но глав-
ные функции сети нейронов реализуются не отдельными нейронами, а их со-
вокупностью.
Рисунок 6 - Однослойная нейронная сеть
Параметры Х|,Хг,Хз называются входным паттерном, У|,У2,Уз- выход-
ным паттерном, a Wjj - это j-й весовой коэффициент i-ro нейрона.
Расчет выходных параметров в зависимости от входных и весовых коэф-
фициентов называется прямым распространением.
1.6. Обучение нейронной сети
Мы живём в информационном веке, и информация представляет боль-
шую ценность. Речь идёт больше не об обрывках информации, как многие
успели подумать, а о комплексе проанализированных данных. Именно они и
представляют наибольшую ценность. Такой обработкой данных сейчас про-
должают заниматься специально написанные программы. Ранее этим занима-
лись люди. Это давало свои преимущества. Программы действуют исключи-
тельно по заложенным алгоритмам. Они, в отличии от человека, не могут ду-
мать логически и искать зависимости. Эта проблема была выявлена давно и так
же давно было найдено относительно простое решение: сделать искусственную
нейронную сеть, которая будет действовать так же, как человеческий мозг.
Собственно, в 1943 Маккалок и Пи гге формализовали данное понятие.
Сегодня анализ информации выходит на новый уровень. Однако для до-
стижения цели-выполнения поставленных задач, необходимо обучить саму
нейросеть. Под процессом обучения подразумевают настройку структуры свя-
зей между отдельными нейронами и их синаптическими связями.
Любая работа, которую придется решать нейронной сети, обязательно
связана с обучением. Нейронные сети применяются в следующих областях:
• Прогнозирование.
• Принятие решений.
• Распознавание образов.
• Оптимизация.
• Анализ данных.
Наиболее эффективные методы обучения нейросетей: с учителем, без
учителя.
1.6.1. Обучение с учителем
Метод обучения с учителем строится на принципе обучающей пары.
Обучающая пара - это некоторые входные данные и целевой вектор, который
представляет собой желаемый выход. В процессе обучения сравниваются полу-
ченные значения выходов и требуемые, в следствие изменяются веса сети в со-
ответствии с алгоритмом минимизации ошибки.
Если нейронная сеть получила достаточное количество данных для обу-
чения, наступает момент, когда необходимо проверить точность работы сети.
Это позволит понять, насколько точно сеть может выполнять те или иные
функции, оценить качество и принять решение о дальнейшем дополнительном
обучении (рисунок 7).
Метод обучения нейронной сети с учителем предполагает коррекцию
ошибок. Сеть получает данные па вход данные и вычисляет выходы, при этом
сразу известны тренировочные выходы. А затем происходит корректирование
ошибки (разница между полученным и ожидаемым значением).
База
данных
Выбор
примера
Распространение
сигнала по нейросети
Ошибка
мала
Настройка
сети
ответ
сети
Расчет
ошибки
Ошибка
велика
Рисунок 7 - Процесс обучения нейронной сети с учителем
из обучающей выборки
сравнение
Рисунок 8 - Функция ошибки и ее аргументы
В нейронных селях, имеющих несколько слоёв, не так просто и, как пра-
вило, невозможно вручную подобрать значения для весов, руководствуясь
только величинами ошибок на выходах сети.
Способы решения этой проблемы:
• Подбор массивов выходных данных для каждого слоя сети, которые со-
ответствуют входным сигналам. Однако, это является очень трудоемкой
процедурой.
• Динамическая настройка весов.
• Самым оптимальным вариантом является метод обратного распростра-
нения ошибки, который предполагает вычисление ошибки и обратное
распространение сигналов от выходов ко входам, из-за чего он так и
назван.
1.6.2. Метод обратного распространения
Сеть, состоящую из двух и более слоев, сложнее обучить, поскольку в
многослойных сетях известен выход лишь последнего слоя нейронов. Одним из
способов решения данной проблемы является распространение сигналов оши-
бок от выходных нейронов сети к ее входным нейронам, то есть по вектору
противоположному прямому распространению сигналов, методом обратного
распространения ошибки. Суть метода состоит в том, чтобы минимизировать
совершение ошибки.
Рисунок 9 - Алгоритм обратного распространения ошибки
При обратном распространении сигнала все веса корректируются в соот-
ветствии со следующим правилом: вычисляется разница между полученным
выходом и желаемым, из чего формируется ошибка.
Сети с обратной связью или рекуррентные характеризуются функцией
кратковременной памяти, на основе которой сигналы восстанавливаются и до-
полняются во время обработки.
Рекуррентные нейронные сети имеют некоторые преимущества, в частно-
сти: настройка сети под изменяющуюся внешнюю среду, качественный и гиб-
кий прогноз.
1.6.3. Градиентный спуск
Обратное распространение осуществляется с помощью функции гради-
ентного спуска, которая состоит в том, что настройке весов происходит спуск
вниз по поверхности ошибки.
Градиент функции VE(W) в точке W определяет вектор её скорого возрас-
тания. 1 радиентным спуском называется минимизация функции градиента, ко-
гда необходимо менять параметры в противоположную градиенту сторону.
Итак, градиентный спуск - это метод обнаружения минимального значе-
ния функции потерь.
Общая схема такого обучения выглядит следующим образом:
1. Назначаем значениям весов W случайные значения.
2. Вычисляем ошибку E(h(X.W),C).
3. Если результат удовлетворительный, то конец работы.
4. Вычисляем значение градиента функции потерь: VE(h(X,W),C).
5. Вычисляем изменение весов: AW-rpVE.
6. Корректируем веса: W:=W-AW.
7. Переход на и. 2.
Метод градиентного спуска имеет следующую трудность:
Градиентный спуск в своём оригинальном виде может «вязнуть» в ло-
кальных минимумах (рис. 10).
Глобальный Локальный
минимум минимум
Рисунок 10 - Ограничения метода 1радиентного спуска
Для борьбы с локальными минимумами используется дополнение, назы-
ваемое «моменты».
Суть метода моментов можно описать как поведение тяжёлого шарика,
который скатывается по склону в ближайшую низину. Однако благодаря инер-
ции еще некоторое расстояние он способен двигаться вверх. Таким образом
происходит возвращение шарика из локальных минимумов в корректном
направлении. В математической составляющей это добавка для изменения ве-
сов.
AWt:=q-VE+p-AWt-I
где 1] - скорость обучения сети,
VE - градиент функции,
р - коэффициент момента.
AWt-1 - изменение весов на предыдущей стадии.
Кроме того, для снижения ограничений метода градиентного спуска так-
же может использоваться регуляризация, суть которой состоит в том, чтобы
«накладывать штраф» на крутое изменение величины весов, что помогает не
делать переобучение сети. На математике это также выглядит как изменение
весов.
AWt:=q-(VE+p-Wt-l)+p,-AWt-1
где р - скорость обучения сети,
VE - градиент функции,
ц - коэффициент момента,
z\Wt— I - изменение весов на предыдущей стадии,
р - коэффициент регуляризации,
Wt-1 - значения весов на предыдущей стадии.
В итоге, при значительном росте ошибки ЕЕ шаг изменения парамет-
ров qq идёт в меньшую сторону, в противном случае - шаг qq принимает боль-
шее значение. Этот принцип увеличивает скорость сходимости алгоритма.
Учитывая вышесказанное, алгоритм становится следующим:
1. Назначаем значениям весов W случайные значения.
2. Инициализируем начальные значение AW =0.
3. Вычисляем ошибку E(h(X,W),C,W) и её изменение АЕ на текущей вы-
борке.
4. Если результат удовлетворительный, то конец работы.
5. Выбираем следующий набор данных из учебного набора.
6. Вычисляем значение градиента функции потери VE на выбранном набо-
ре.
7. Вычисляем изменение параметров: AW:-q-(VE4-p-W)+p-AW.
8. Корректируем параметры: W:=W~AW.
9. Скорость обучения q задаем эмпирически.
10. Переход на п. 3.
1.6.4. Скорость обучения и эпохи
На этапе обучения возникает следующие проблемы различного рода: в
результате градиентного спуска функция пришла в локальный минимум, а не
глобальный минимум или обучение продолжается очень долго и вовсе прекра-
щается, не достигнув нужного результата. Чтобы это предотвратить, начальные
значения(весов) Wo назначают хаотично, используют неупорядоченные наборы
данных, на которых обучают сеть, назначают скорость обучения сети.
Скоростью обучения сети - это параметр, определяющий степень процес-
са оптимизации. Обычно этот параметр задают как константу 0<г|<1.
При большой скорости
обучения алгоритм не
может спуститься
При большой скорости
обучения алгоритм
расходится
Рисунок 11 - Влияние скорости обучения на градиентный спуск
Эпохой в нейронных сетях называют полный цикл рассмотрения всех
имеющихся наборов входных данных. Полная выборка тренировочных или
обучающих данных сети подаются на входы эпоха за эпохой, до тех пор, пока
все значения, которые выдала сеть не будут отличаться от реального выхода на
допустимый уровень.
Для корректировки времени обучения нейронной сети, важными характе-
ристиками которой являются нужная точность с использованием наименьших
вычисли тельных ресурсов, валидны такие способы, как:
• устанавливать небольшой размер блока (обычно несколько десятков).
Такая тактика на начальных эпохах обучения дает сеть гораздо лучшую,
чем при использовании больших блоков на том же количестве началь-
ных эпох;
• сохранить скорость обучения, но размер блока при этом лучше увели-
чить;
точность не ухудшается, а вычисления заметно ускоряются, если увели-
чить размер блока с нескольких десятков до нескольких тысяч и даже
десятков тысяч.
1.6.5. Подготовка данных
Перед началом обучения сети необходимо подготовить тренировочные
данные.
Количество данных в выборке. Чем больше данных в выборке, тем
дольше процесс обучения.
Обучающая выборка должна быть репрезентативной.
В подготовку данных также входит их преобразование в числовой фор-
мат, ведь как компьютер, так соответственно и нейронная есть работают с чис-
лами.
Также при тестировании нейронной сети на вход подаются числа из того
же диапазона, на котором сет ь обучалась.
Нормализация данных - приведение данных к виду, наиболее подходя-
щему для обработки. В понятие входит преобразование данных в числовой вид
и распределение значений в конкретном диапазоне. Нормализация помогает
сделать обучение более равномерным по всем весам, делает процесс обучения
гибким и в равной степени учитывает все входные функции. Помимо этого, эта
функция ускоряет обучение.
1.6.6. Обучение без учителя
Метод обучения без учителя представляет собой метод на основе самоор-
ганизации и проводится без вмешательства внешних факторов, контролирую-
щих обучение. В таком случае задаётся только величина качества, до которого
должна научиться нейросеть и параметры, оптимизирующийся по отношению к
этой величине.
Рек)ррен1нан нейронная се и*
Использование нейросетей для обработок таких файлов как музыка или
текст не было простым делом. Для решения данных задач были созданы так
называемые «Рекуррентные нейронные сети». Слово Рекуррентные - понима-
ется как возвратный, повторный или последовательности. То есть:
Рекуррентные нейронные сети (Recurrent neural network; RNN) - это
вид не простых нейронных сетей, в которой элементы образуют между собой
последовательную связь, то есть обратная связь. Данная особенность связей
позволяет нейросети обрабатывать события как во времени, так и(или) в про-
странстве.
Другой особенностью рекуррентных нейронный сетей является возмож-
ность полагаться на внутреннюю память для обработок информации, что поз-
воляет чуть ли не воспроизводить программы чисто по памяти внутренней. Эта
особенность открывает множество горизонтов для применения нейросетей в
различных областях исследования и работы.
Рекуррентные нейронные сети - это сети, в которых сохраняется инфор-
мация обрабатывается не раз и сохраняются результаты работы, данная же ин-
формация используется нейронной сетью для последующих обработок задачи.
Это помогает решать задачи как перевод речи, распознание речи и перевод тек-
ста.
Рисунок 1 - Схема однослойной рекуррентной нейронной сети из интернета
Обучение рекуррентных нейронных сетей такое, как у обычной нейрон-
ной сети, но со своими особенностями. Стоит напомнить, что параметры будут
использоваться на всех этапах работы, градиент на каждом выходе зависит не
только от расчетов текущего шага, но и от предыдущих временных шагов. Это
должно учитываться при обучении рекуррентных нейронных сетей, конечно у
больших сетей проблемы с запоминаем и отслеживанием влияния долгосроч-
ных зависимостей, как зависимость между шагами, которые находятся далеко
друг от друга, но решения таких проблем были разработаны новые архитектуры
рекуррентных нейронных сетей.
В ходе развития рекуррентных нейронных сетей, появились различные
виды нейросетей. Рассмотрим несколько архитектуры и их принцип работы.
Полностью рекуррентная сеть
Базовая архитектура рекуррентных нейронных сетей, появившаяся в
1982 году. В данной архитектуре имеется один слой внутренних нейронов, где
каждый узел связан с другим, а также отвечает за свою роль - вход, выход. В
данной модели каждая связь характеризуется определенным весом, задающим
ее значимость. Каждая цепочка вычисляет ошибку как суммарную девиацию по
выходным сигналам сети. Если имеется набор образцов обучения, ошибка вы-
числяется с учётом ошибок каждого отдельного образца.
Нейронная сеть Элмана
Нейронная сеть Элмана - один из видов рекуррентной нейронной сети,
которая состоит из 3 слоев: X, Y, Z. Главной особенностью данной архитектуры
является запоминание. Эта особенность достигается следующим образом: сеть
Элмана получается из многослойного перцептрона (перцептрон - состоит из
трёх типов элементов, а именно: поступающие от датчиков сигналы передаются
ассоциативным элементам, а затем реагирующим элементам) путем введения
обратных связей, которые идут не от выхода системы, а от выходов внутренних
нейронов. Данное построение дает возможность учесть историю наблюдаемых
процессов и накопить информацию для выработки правильной стратегии
управления. То есть сеть Элмана могут применять в системах управления дви-
жущимися объектами.
Рисунок 2 - Схема нейронной сети Элмана
Также данная архитектура примечательна следующей деталью: сеть спо-
собна па запоминание и сохранения своего состояния. Благодаря этому данная
сеть способна на предсказание последовательностей и потому может выйти за
пределы мощности многослойного перцептрона.
= ah(Whxt + UtJit-i + Ь„)
Ус = Oy(Wyxt + by)
Математическая модель сети Элмана, где:
xt - вектор входного слоя;
ht - вектор скрытою слоя;
yt - вектор выходного слоя;
W, U, b - матрица и вектор параметров;
ah, Gy - функция активации.
Двунаправленные рекуррен ! ные сети
Двунаправленная рекуррентная сеть (англ. Bidirectional Recurrent Neural
Network, biRNN) можно представить в виде двух однонаправленных рекур-
рентных сетей, одна из которых обрабатывает входную последовательность в
прямом порядке, а другая - в обратном. Каждая сеть может служить входом и
выдавать результат для другой. Данная архитектура решает проблему однона-
правленных рекуррентных сетей, поскольку информация одновременно может
просматриваться в двух направлениях, что дает понятие контекста как из про-
шлого, так и из будущего.
Output Layer
Input Layer
Backward Layer
Forward Layer
Рисунок 3 - Структура двунаправленной рекуррентной нейронной сети
Я/ = af(W/Xt - + I/).
Hb = ab(W}Xt + W*Hb+1 + bfc)
Ot = W^H, +
Рисунок 4 - Математическая модель двунаправленной рекуррентной сети
где:
И//, Wb, wj, Wb, IVq — матрицы весов,
bf,bb,bq — байесы,
ar ,ab — функции активации,
н! ,Hb — результаты (выходы) нейронных сетей,
Ht — конкатенированный вектор рекуррентных сетей,
0t — выход сети на шаге.
Двунаправленная рекуррентная сеть эффективна в прогнозах и построй-
ках графиках и сложных расчётах с прогнозом на будущее.
Длинная ijenb элементов краткосрочной памяти
Длинная цепь элементов краткосрочной памяти (Long short-term memory,
LSTM) - Данная архитектура выделяется даже среди других архитектур, что
может провести сложнейшие расчеты без применения специального оборудо-
вания и может сохранить память о тысячах и даже миллионах временных ин-
тервалов в прошлом, а также своей универсальностью. На деле данная архитек-
тура рекуррентных сетей уже широко применяется в нашей жизни, например,
такие компании как Google, Microsoft уже внедряют технологию рекуррентных
нейронных сетей в новые продукты, тем самым обновляя старые.
Рисунок 5 - Структура архитектуры LSTM- рекуррентной нейронной сети
Больше всего к длинной цепи элементов краткосрочной памяти относится
перевод речи в текст, для перевода рукописных работ в электронную форму.
У даниoii архитектуры имеется свое понятие «Вентиль»2(gates), которые
отвечают за вход или выход информации, хранимой на памяти в блоке (стоит
отметить в данной архитектуре есть узлы, которые группируются в блоки). За
’ Thttps7/web.archivc.org/wcb/20l 50526132154/http://decplcarning.cs.cinu.cdu/pdfs4]ochreitcr97 lstm.pdf
этим стоит принцип, что старую информацию можно заменять новой, если она
достойна запоминания.
ft — ^9(WfXt 4- Ufht i +bf)
it = 4- 4 bi)
Of. I1 oh-f | 4“ bn)
Q = /f CQ-1 4- it c 4- U,.ht-i 4* bc)
ht - Of oah(ct)
Рисунок 6 - Математическая модель длинной цепи элементов
краткосрочной памяти
где:
xt — входной вектор;
ht — выходной вектор;
ct — вектор состояния;
W, b, U — матрица параметров и вектор;
ft, ot> it — векторы вентелей;
it — вектор вентиля входа, вес потенциальной новой информации;
ft — вектор вентиля забывания, вес старой информации;
ot — вектор выходного винтиля, кандидат на выход;
с0 = 0; h0 = 0.
Seq-2-seq сети
Одна из новейших архитектур рекуррентной нейронной сети, которая бы-
ла разработана компанией Google для машинного-переводчика. Данная модель
способна с легкостью справиться со следующими задачами: как машинный пе-
ревод, суммаризация текста, аннотация изображений и так далее. В основе ра-
боты лежит идея many-to-many RNN и состоит из двух рекуррентных сетей: ко-
дировщика и де кодировщика. Кодировщик обрабатывает каждый элемент
входной последовательности, переводит полученную информацию в вектор,
называемый контекстом (context). После обработки всей входной последова-
тельности кодировщик пересылает контекст декодировщику, который затем
начинает генерировать выходную последовательность, элемент за элементом.
То есть, кодировщик генерирует скрытый вектор, содержащий объект и его
описание, который направляется в декодировщик. Декодировщик считывает
поступивший скрытый вектор и обращает вектор в объект, добавляя описание в
объект из вектора.
Er liebte zu essen .
Рисунок 7 - Пример работы Seq-2-seq сети
Длинные предложения были проблемой вначале
для машинных-
переводчиков, но в данной архитектуре была введена система Attention (Систе-
ма внимания). Система Attention облегчает переводы больших предложений и
улучшает их качество за счет помещения содержимого в один вектор, где со-
держимое на входе в декодировщик может просматриваться выборочно. Гем
самым это позволяет Seq-2-seq сети концентрироваться на релевантных (совпа-
дающих) частях входных последовательностей. Стоит отмстить, что в вектор
входят все записи, включая о скрытых состояниях, которые декодировщик про-
смотрит для составлен ня лучшего результата.
У
Рисунок 8 - Seq-2-scq с системой Attention
560
Для улучшения качества работы Seq-2-seq сети и расчетных способно-
стей, были добавлены еще 2 оптимизационные системы:
• Beam Search (Лучевой поиск) - данную систему можно сравнить с дере-
вом вероятностей, оптимизируя поиск по первому многообещающему
совпадению, что уменьшает затраты ресурсов и требования к памяти;
• Bucketing (Бакетирование) - это система, разбивающая информацию на
более удобные формы для расчетов и управлении, чтобы уменьшить
время на чтение и оптимизировать производительность.
start
I
9 '1)4*
О
8.б1оМ
С
-4 5)452
4 53М7
О
-О О К 6183
о с 4015Ю18 О 1 4 0’5’ОЗг С 00151567 О с 6 31517’3 О с Э0155ЭЭ& 1 9 0159344 о- с 00174521 О н 3 0’79179
о о О О
1 S 0 1 с 1 С
( 6 39433 6 40137 €41053 6 41063 6 68715 668715 668’92
С 413325 О о О О
С 782414 7834*1 О О О N 42475? 43122?
г О
-4 84943 •4 34348 *8*962 о о
О О / С
с ( -5 6795 •5 ’4787
4^3^ 4 *61303
1 О сэ
.’М847
с ) О
4 72213 4 731)? 4 29955 4 30671 -ft 30736
О о о О О
( с ) С • о
4 7597* 492S92 4 54131 4 94769 497311 4 97681
Рисунок 9 - Пример работы системы Beam Search
ГЛАВА 2. ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ БАЗОВЫХ АЛГОРИТМОВ
МАШИННОГО И ГЛУБОКОГО ОБУЧЕНИЯ
НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ PYTHON 3.9.1
Алгоритм линейной регрессии
В качестве среды исполнения программного кода будет использован
Jupyter iPylhon Notebook.
Установка
Через командную строку необходимо установить Python PIP (менеджер
пакетов Python, который в основном помогает пользователям устанавливать,
просматривать и использовать различные пакеты или модули). Команда: python
get-pip.ру.
Далее необходимо установить дополнительные библиотеки, которые
нужны для реализации линейной регрессии:
1. NumPy расшифровывается как «Numeric Python», что можно перевести
как «Числовой Python». Данная библиотека предоставляет возможности
работы с многомерными массивами. В ее основе лежит класс ndarray -
многомерный контейнер элементов одного типа данных и размера.
Установка через командную строку представлена на рис. 2.1.
С:\Users\cloud\PycharmProjects\pythonProject>pip install numpy
Рисунок 2.1 - Установка библиотеки «numpy»
2. «Panel Data», сокращенно Pandas, на русский язык можно перевести как
«Панельные данные», это библиотека с открытым исходным кодом на
Python. Она предоставляет готовые к использованию высокопроизводи-
тельные структуры данных и инструменты анализа данных. Установка
через командную строку представлена на рис. 2.2.
::\Users\cloud\PycharmProjects\pythonProject>pip install pandas
Requirement already satisfied: pandas in c:\users\cloud\appaata\local\programs\pyti,on\python39\lib\site-pacl
Requirement already satisfied: numpy>-l.17.3 in c:\users\cloud\appdata\local\programs\python\python39Mib\s:
from pandas) (1.21.3)
Requirement already satisfied: pytz>-2017.3 in c:\users\cloud\appdata\local\programs\python\python39\lib\sii
;rom pandas) (2021.1)
Requirement already satisfied: python-dateutil>»2.7.3 in c:\users\cloud\appdata\local\programs\pytbon\pythof
)ackages (from pandas) (2.8.2)
Requirement already satisfied: six>«1.5 in c:\users\cloud\appdata\local\programs\python\pythor>39\lib\site-p.
pythondateutil>»2.7.3->pandas) (1.15.0)
Рисунок 2.2 - Установка библиотеки «Pandas»
3. Библиотека Matplotlib в Python помогает нам отображать данные на гра-
фиках в простейшем виде. Если вы знакомы с построением графиков в
MATLAB, то Matplotlib будет легко использовать для базового построе-
ния i рафиков. Установка через командную строку представлена на
рис. 2.3.
k:\Users\cloud\PycharmPro1ects\pythonPro1ect>python -п> pip install -U pip |
Requirement already satisfied”: pip in c:\users\cloud\appdata\locai\programs\python\python39\li
C:\Users\cloud\PycharmProjects\pythonProject>python -m pip install -U matplotlib
L b 11 I'lTI'g'" INcl I pit* Cll tJ.
Downloading matplotlib-3.4.3-cp39-cp39-win amd64.whl (7.1 MB)
7.1 MB ME/5
Collecting kiwisolver>=1.0.1
Downloading kiwisolver-l,3.2-cp39-cp39-win_aiind64.whl (52 kB)
52 kв кв/s
Requirement already satisfied: python-dateutil>-2.7 in c:\users\cloud\appdata\local\programs\p
ckages (from matplotlib) (2.8.2)
Collecting pillow>-6.2.0________________________________________________________________________
Рисунок 2.3 - Установка библиотеки «Matplotlib»
Установка Jupytcr iPython Notebook также осуществляется через команд-
ную строку (с помощью pip), рис. 2.4.
С:\Users\cloud\PycharmProjects\pythonProject>pip install jupyterlab
Collecting jupyterlab
Downloading jupyterlab-3.2.1-py3-none-any.wh1 (8.6 MB)
8 MB HB/s
Collecting jinja2>-2.1
Downloading 3inja2-3.0.2-py3-none-any.whl (133 kB)
133 kB MB/s
Collecting jupyter-server~=l.4
Downloading jupyter_server-1.11.2-py3-none-any.whl (394 kB)
394 MB/s
Collecting ipython
Downloading ipython-7.29.0-py3-none-any.whl (790 kB)
790 MB/s
C:\Users\cloud\PycharmProjects\pythonProject>pip install notebook
Requirement already satisfied: notebook in c:\users\cloud\appdata\local\
Рисунок 2.4 - Установка среды «Jupyter iPylhon Notebook»
Для запуска среды необходимо ввести следующую команду. Команда
представлена на рис. 2.5:
С:\Users\cloud\PycharmProjects\pythonProject>jupyter notebook
[I 14:12:25.685 NotebookApp] Writing notebook server cookie secret
Рисунок 2.5 - Запуск среды «Jupyter iPython Notebook»
Это запустит сервер Jupyter, а браузер откроет новую вкладку со следую-
щим URL: https://localhost:8888/tree. Визуализация представлена на рис. 2.6.
jupyter
Gj i_^o-jC
F*s Runnog ousters
Select eems to pertom actions on mem
- к
C3 verrv
IF untoed ipyno
C get-pip py
— man py
2 irwteo
Upk>«o »i«w - C
N*",*'» Ulll'JlM f «kt*
2 дня назад
йцлпек несколько сепчд назад 1 01 кВ
8 месяцев назад 195 МВ
7 часов назад 300 Б
1 часов наяд ив
Рисунок 2.6 - Главная страница «Jupyter iPylhon Notebook»
Для создания notebook необходимо выбрать «New» в верхнем меню, а по-
том «Python 3». Визуализация представлена на рис. 2.7,
_ JUpyter Untitled castctieikport 7чаем назад -autosa^o-
Logout
Fite Eoc Vie* mien Cell Kerne- Widgets че!р
b ♦ F 4 Г ♦ ♦ ► Run ИСнс * =
In ( ] M
In ( ): H
In ( J: И
In ( ]: H
| Pyrnon 3 itpjKernel, О
Рисунок 2.7 - Пустой файл «Jupyter iPython Notebook»
Задача о студентах
В данной работе в качестве примера взята задача регрессии, в которой
будет спрогнозирован процент оценок, полученных студентом, на основе изу-
ченных количеств часов. Это простая задача линейной регрессии, поскольку
она включает всего две переменные.
Этап 1. Импорт библиогек.
Чтобы импортировать необходимые библиотеки для этой задачи, требу-
ются операторы импорта, представленные на рис. 2.8:
jupyter Линейная регрессия Last CnecKpc-nt 7 часов назад (unsaved changes)
File Edit View insert cell Kernel Widgets Help
S + § ® t Ф 4- ► RJI С H Code v E3
In [ J: H import pandas as pd
import numpy as np
import matplotlib.pyplor as pit
Xmatplotlib inline
Рисунок 2.8 - Импорт библиотек
Эк ан 2. Набор данных.
Для набора данных необходимо создать файл с расширением csv. Набор
содержит сведения о часах (учебные занятия) и о полученных результатах на
итоговом тестировании. В файле две переменные должны быть записаны в од-
ной ячейке через запятую. Файл находится по адресу: Содержание Исходного
файла представлено на рис. 2.9.
Ссылка на исходный файл score.csv:
hnps://drive.google.com/file/d/126wJYt74589fEMNGFSELC‘doxNvolulEN/vi
ew?usp=sharing
гЪ Д ♦ %
. Буфер Шрифт Выравнивание Число
обмена ’
Г, Условное 4
Фсрматирс
С4 Стили ячее
А4 т Jx 3.1,28 V
А В С ж
1 Часы,Полученные баллы
2 2 3,23
3 4 9,47 ___________________________
4 13.123 ]
5 8.5,76
6 3 4,30
7 1.5,21
8 9 2.88
9 5.5,60
10 8.3,81
11 2 7,25
12 7 7,85
13 5 9.62
14 4.5,41
1S 3 3.42
16 10.17
17 8 9,95
13 2 7,30
Рисунок 2.9 - Набор данных
Импортируется набор данных CSV с помощью Pandas (с указанием нуж-
ной кодировки). Код представлен на рис. 2.Ю.
' ]: Н import pandas as pd
import numpy as np
import matplotlib.pyplot as pit
%matpiotlib inline
dataset • pd.read_csv(r'C:\Users\cloud\Desktop\score.csv‘, encodings’Windows-1251’)
Рисунок 2.10- Импорт набора данных
Проверка на размерность набора данных осуществляется с использовани-
ем команды представленной на рис. 2.11.
[ ]: H import pandas as pd
import numpy as np
import matplotlib.pyplot as pit
Xmatplotlib inline
dataset = pd.read_csv(r'C:\Users\cloud\Desktop\score.csv', encoding=’Windows1251 *)
dataset.shape
Рисунок 2.11 - Размерность набора
Запуск осуществляется непосредственно кнопкой RUN, представлено на
рис. 2.12.
jupyter Линейная регрессия .as* спескрол! 7 часов назад (unsaved cnanges)
File Edu View insert Cpu Kernel Wwgeis Help
E, + 3 ФС ФФ ► Run |l C » Code v 3
select beiow
In [ ]: M import pandas as pd
import numpy as np
import matplotlib.pyplot as pit
imatplotlib inline
dataset = pd.read_csv(r'C:\Users\cloud\Desktop\score.csv', encodings'Windows-1251’)
dataset.shape
Рисунок 2.12 - Запуск команды
Результат представлен на рис. 2.13.
Набор содержит 17 строк и 2 столбца.
In [ЗА]: И import pandas as pd
import numpy as np
import matplotlib.pyplot as pit
Xiratplotlib inline
dataset pd.read_csv(r'C:\Users\cioud\Desktop\score.csv', encodings'Windows'1251')
dataset.shape
0ut[34]: (17, 2)
Рисунок 2.13 - Результат команды «datasetshape»
Для отображения пользователю первых элементов набора существует ко-
манда head(), представленная на рис. 2.14.
In [35] H import pandas as pd
import nurnpy as np
import iratplotlib. pyplot as pit
Xaatplotlib inline
dataset = pa.read_csv(r•C:\Users\clo4jd\Oesktop\score.csv , encoding* Windows-1251')
dataset.head()
Out[35]: Часы Полученные баллы
0 2 3 23
1 49 47
2 31 28
3 85 76
4 34 30
Рисунок 2.14 - Результат команды «dataset.head»
Для статистического анализа данных используется команда describeO,
представленная на рис. 2.15.
JUpyter Линеиная регрессия LastCneckpcmt’часовназад (autosaved)
File Edit View insert Cell Kernel Widgets Help
£ + 3 ФФ ► Run С » Code v П
In [36]: ► import pandas as pd
import numpy as np
import (natplotlib.pyplot as pit
Xmatplotlio inline
в pn raari_rcv (г 'C: \Users\cloud\Desktop\score.csv', encoding* ‘Windows-1251 ' )
dataset,describe()
Jut[36]: Часы Полученные баллы
count 17 000000 17 00000С
mean 4 905882 50 058824
Std 2 734381 26 571767
min 1 ooooco 1’000000
25% 2 700000 28 000000
50% 4 500000 42 OOLOOC
75% 7 700000 76 000000
max 9 2O0000 95 000000
Рисунок 2.15 - Результат команды «dataset.describe»
Построение графика, исходят из данных набора, осуществляется коман-
дами, представленными на рис. 2.16:
jupyter Линейная регрессия Last ChecKpcnt 7часов назад (unsavedchanges)
File Eda Vie* insert Ceil Kerr el Widgets Help
® + & 4ft * * ► Чип С H Code v S3
dataset.head()
dataset.plot(x='Часы', y='Полученные баллы1, styles'©’)
pit.title(‘Зависимость')
pit.xlab₽l('Пройденные часы*)
pit.ylabel('Баллы в X’)
pit .show()
Зависимость
SO
• Полученные Саллы
ВО
Л)
а*
80
з
ьо
ад
л
20
2
6
8
1
Пройденные часы
Рисунок 2.16 — 1 рафик
Из графика: существует положительная линейная зависимость между ко-
личеством изученных часов и процентом набранных баллов.
Эк ан 3. Подюювка данных.
Необходимо разделить данные на «атрибуты» и «метки». Атрибуты - это
независимые переменные, а метки - это зависимые переменные, значения кото-
рых должны быть предсказаны. Требуется предсказать процентную оценку в
зависимости от изученных часов. Поэтому набор атрибутов будет состоять из
столбца «Часы», а меткой будет столбец «Оценка». Чтобы извлечь атрибуты и
метки, необходимо выполнить команды, представленные на рис. 2.17.
X = dataset.iloc[:, :-1].values
у = dataset.iloc[:, 1].values
Рисунок 2.17- Извлечение атрибутов
Атрибуты хранятся в переменной X. В атрибуте указано «-1» в качестве
диапазона для столбцов, так как атрибут должен содержать все столбцы, кроме
последнего, которым является «Результаты». Точно так же переменная у со-
держит метки. В командах указано 1 для столбца метки, так как индекс столбца
«Результаты» равен 1.
Следующим тагом будет разделение этих данных на обучающий и тесто-
вый наборы. Используется встроенный в Scikit-Leam метод train test splitQ,
представленный на рис. 2.18:
dataset = pd.read_csv(r'C:\Users\cloud\Desktop\score.csv , encodings'Windows-1251')
X dataset.iloc[:, :•!].values
у = dataset.iloc[:, 1].values
from sklearn.model_selection import train_test_split
^_train, X_test, y_train, y_test = trair_test_split(X, y, test_size« .2, randoip_state=0
Рисунок 2.18- Разделение данных
Приведенная команда разделяет 80 % данных на обучающий набор, а 20 %
данных - на набор тестов. test_size - это то место, где указывается пропорция
набора тестов.
Этап 4. Обучение алгоритма.
Для обучения алгоритма необходимо выполнить команды, представлен-
ные на рис. 2.19.
X = aataset. Нос [;, :-1]. values
у aacaset.Нос[:, 1].values
from sklearn.irodel_selection import train_test_split
xjtrain1 ytratn, я t'aip tpsr_4n111(xl test_si?e»В 2
from sklearn.linear_model import LinearRegression
randoF_state«G)
regressor = LinearRegression()
regressor.fit(X_train, y_train)
Out(21 I 1пйагЙрогрсс1nn(1
Рисунок 2.19 - Обучение алгоритма
Справка. Необходимо установить sklearn через командную строку, рис. 2.21.
C:\Users\cloud\PycharmProjects\pythonProjecOpip install -U scikit-learn scipy matplotlib
Collecting scikit-learn
Downloading 5cikit_learn-1.0.1-cp39-cp39-win_aiwd64.whl (7.2 MB)
7.2 MB MB/s
Collecting scipy
Downloading scipy-1.7.1-cp39-cp39-win_amd64.whl (33.8 MB)
Requirement already
Д.З)
Requirement already
(from scikit-learn)
HHMMMBil 33.8
satisfied: matplotlib in
MB 137 kB/s
c:\users\doud\appdata\local\programs\python\python39\lib\site-packages (3.
collecting joblib>-0.11
satisfied: numpy>»1.14.6
(1.21.3)
in с:\users\cloud\appdata\local\programs\python\python39\lib\site-packages
Рисунок 2.20 - Установка sklearn
C Scikit-Learn достаточно просто реализовать модели линейной регрес-
сии, поскольку все, что нужно сделать - это импортировать класс
LinearRegression, создать его экземпляр и вызвать метод fit() вместе с обучаю-
щими данными.
Модель линейной регрессии в основном находит наилучшее значение для
точки пересечения и наклона, в результате чего получается линия, которая
наилучшим образом соответствует данным. Чтобы определить значение точки
пересечения и значение наклона, вычисленное алгоритмом линейной регрессии
для представленного набора данных, необходимо выполнить следующие ко-
манды:
Для получения значения наклона (коэффициента х) используется коман-
да, представленная на рис. 2.21.
X = dataset.11ос(:, :-1].values
у dataset.11ос(:, 1].values
front sklearr .tnodel.selection import train_test_split
X_train, X_test, y_train, y.test train_test_split(X, y, test_slze« .2, rando«i_state» )
fro» sklearr,linear_model import LlnearRegression
regressor « linearRegressionC)
nognofcoii><lt(.X.-tisaiti»>—fctoaia)
print(regressor.coef)
[9.70320571]
—
Рисунок 2.21 - Получение наклона
Результат 9,7 характеризует тот факт, что потенциальное приращение
учебного времени студентом на один астрономический час, позволит повысить
его баллы на 9,7 % по сравнению с текущим состоянием.
Этан 5. Flpoi иозы.
После обучения алгоритма, необходимо сделать прогнозы. Для этого ис-
пользуются тестовые данные, которые покажут, насколько точно алгоритм
предсказывает оценку в процентном отношении.
Чтобы произвести прогнозирование на тестовых данных, необходимо вы-
полнить команды, представленные на рис. 2.22.
Справка. Y pred - это массив numpy, который содержит все предсказанные
значения для входных значений в серии X test.
from s^xearn.хxnedr_niuuei imporr LXdedrrtegressxon
regressor = LinearRegression()
regressor.fit(X_train, y_train)
onnt( regressor.coef )
y_pred = reg',essor.predict(X_test)
Рисунок 2.22 - Прогноз
Для сравнения фактических выходных значений X test с прогнозируемы-
ми значениями, необходимо выполнить команды, представленные на рис. 2.25.
Прогнозируемые значения в процентном выражении близки к фактиче-
ским.
print(regressor.coef_)
j_pred g regressor.predict(X test 1
df = pd.DataPrame({ Пг*,.- i.h' : y_test, 'Проги. 3^-. y_pred})
df
Out[6]: (У.]
Действительный Прогнозируемый
0 47 50 953839
1 38 92 677424
2 81 83 944539
3 25 29 606587
Рисунок 2.23 - Сравнение данных
9tan 6. Оценка алк>ригма.
Последний шаг - оценить производительность алгоритма. Этот шаг осо-
бенно важен для сравнения того, насколько хорошо разные алгоритмы работа-
ют с конкретным набором данных. Для алгоритмов регрессии обычно исполь-
зуются три показателя оценки:
1. Средняя абсолютная ошибка (МАЕ - Mean Absolute Error) - это сред-
нее абсолютное значение ошибок. Он рассчитывается как:
1 П
— 2 \Actual — Predicted}
п
i=l
2. Среднеквадратичная ошибка (MSE - Mean Squared Error) - это среднее
значение квадратов ошибок, которое рассчитывается как:
п
— 2 \Actual — Predicted}2
П Z—»
i=l
3. Среднеквадратичная ошибка (RMSE - Root Mean Squared Error) - это
квадратный корень из среднего квадрата ошибок:
1 п
— 2 \Actual — Predicted}
2
i=l
Выполнять эти вычисления вручную нет необходимости. Библиотека
Scikit-Leam поставляется со встроенными функциями, которые можно исполь-
зовать, чтобы узнать эти значения. Необходимо найти значения этих показате-
лей, используя тестовые данные. Программный код представлен на рис. 2.24.
_ JUpyt6T Линейная регрессия (.aslChecxpoinl 3 Mtoe назад auto-saved)
FJe Edr. View Insert Cell Kemei л-dgeis Hesp Mi trusted f Python 5
a + э Ф Г -t ф ► чип ис» сое* * =
тгов sKlcarn.llnaarjeodcl import uneorKegresuon
regressor iinearfiegresslonf)
regressor.fit(X_traln, y_train)
*print(regressor'. coef_)
y^pred = regressor,predicr(X^test)
df pd DataFra«e({ Действител.и^й : y_test, "Прит новируемый": y_pred})
Рисунок 2.24 - Показатели
Значение среднеквадратичной ошибки составляет 4,10. что составляет
8.1 % от среднего значения процентов всех студентов, т. е. 50.05 (значение в
статистических показателях «mean»).
Задача страхования
В данной задаче будет рассмотрен несложный пример построения модели
линейной регрессии, а также предварительной обработки данных. Для построе-
ния моделей и методов обработки данных будет использоваться широко извест-
ная библиотека Scikit-Leam (сокращенно skleam), в которой в удобной форме ре-
ализованы многие методы машинного обучения и анализа данных в целом.
Команды установки библиотек numpy, pandas, matplotlib приведены в За-
даче о студентах.
Библиотека seaborn устанавливается командой pip install.
Справка. Seahorn - это библиотека визуализации данных Python, основанная на
matplotlib. Он предоставляет высокоуровневый интерфейс для рисования при-
влекательной и информативной статистической графики.
Импорт библиотек представлен на рис. 2.25.
~ jUpyt(?r Страхование Last Checkpoint 23 мину*ы назад tunsaved changes i
Frte Ed*. Vie* insert cat Keme Widgets n«p
t + a £ ♦ + ► Чип с Г» Code * =
Ir [1]. H import повру » np
laport pandas at pd
pd.options.«ode.chained.OSsigrwent = None
import «atplotllb.pyplot as pit
import seaborn at sn$
sns.set font_scale»1.3, palette» Set2‘ |
from sklearn.nodel^selection import traln_test_split
from sklcarn.preprocessing import OneHotEnCOder
from sklearn.lineat_«odel import LinearRegresslon
from sklearn import metrics
In ( ]; И
Рисунок 2.25 - Импорт библиотек
Эiан 1. Постановка задачи.
Для решения задачи потребуются данные медицинского страхования. В
каждой строке представлены признаки для каждого клиента страховой органи-
зации.
В данных содержатся следующие признаки:
• Дата рождения - день рождения.
• Пол - пол, возможные значения: мужской, женский.
• И МТ - соотношение массы тела квадрату его высоты (Индекс Массы
Тела), измеряется в кг/м2, хорошие значения лежат в диапазоне от IX.5
до 24.9.
• Дети - количество детей.
• Курение - курит ли клиент.
• Регион - значения: северо-восток, юго-восток, юго-запад, северо-запад;
• Расходы - индивидуальные медицинские расходы, оплачиваемые меди-
цинским страхованием.
Необходимо загрузить данные, рис. 2.26. Данные представлены файлом
data.csv. Ссылка на файл data.csv.:
https://drive.google.eom/file/d/151axkJoZSrNPdQChyN4KJjaLtMyjae 18/view?usp=s
haring
from sklearn import oetrics
In [3]: H eJara » pd.read_csv(r"C:\U5ers\cloud\0e,»ktop\data.csv'> encoding«'Windows-12Sl', parse_dat₽s«[0])
data.nead()
Out(3]:
Дата рождения пол HMt Дети Курение Ресион Расходы
О 2001‘12-20 женский 27 900 0 да Юго-запад 1688-4 9240'
1 гОСЗ-ОЗ-’в мужской 33 770 1 нет юго-восток 1725 55230
2 1992-11-02 мужской 33 000 3 нет юго-восток 4449 46200
3 1987-07-27 мужской 22 705 0 нет северо-запад 21984 47061
4 1988-11-04 мужской 28 880 0 нет северо-запад 3866 8552D
In [ ]: М
Рисунок 2.26 - Импорт данных
Размерность данных представлена на рис. 2.27.
In R]: Н data. shape
0ut[4]: (1338, 7)
Рисунок 2.27 - Размерность данных
Тестировать качество построенной модели всегда нужно на данных, ко-
торые не участвовали в обучении. Такие данные называются тестовыми. Дан-
ные, которые участвуют в обучении, называются обучающими.
Выполнить разбиение на обучающие и тестовые данные можно с помо-
щью функции «train tcst_split», которая имеет следующий синтаксис, представ-
ленный на рис. 2.28:
sklearn.n>odel_selection.rrain_test_split(‘arrays, test_size-None, train_size«Kone, randorii-State-None, shuffle-True,
stratify-hone) Рисунок 2.28 - Синтаксис разбиения
Аргументы: • ^arrays - входные данные, которые должны быть разделены. Можно передавать несколько объек- тов. • test_size - размер тестовых данных, может быть задан как в относительных единицах oi общего объема данных, тогда значение в диапазоне от 0 до 1, так и в количественных, то есть количество объектов. Если не указан, то дополня- ет train size, если о он не указан, то принимается значение 0.25. • train size - размер тестовых данных, может быть задан как в относительных единицах от общего объема данных, тогда значение в диапазоне от 0 до 1, так и в количественных, то есть количество объектов. Если не указан, то дополняет test size. • random state- можно указать для воспроизво- димости экспериментов. • shuffle - перемешивать ли выборку. Если False, то аргумент stratify должен быть установлен в None. • stratify - если задан, то метод разбивает на трейн и тест так, чтобы отношение данных разных классов в подвыборках было одинаковым.
Эта функция будет применена к данным, отнеся в тестовую часть 20 %
исходных данных, а в обучающую - оставшиеся 80 %. Поскольку параметры
использовались по умолчанию, то исходные данные сначала были перемешаны,
а затем разделены, рис. 2.29.
In и train, test = train_test_split(data, t@st_size=0.2)
train.shape, test.shape
1 0ut[7]: ((1070, 7), (268, 7))
Рисунок 2.29 - Разбиение
Этап 2. Обучение.
Требуется сразу привести временной признак, а именно, построить из не-
го признак, отвечающий за возраст человека. Дробные значения отбрасывать
смысла нет. При выполнении преобразования учитываем, как в «pandas» можно
работать с интервалами времени.
Справка. Данную операцию можно было выполнить сразу для всех дан-
ных. Но лучше так не делать, поскольку в других примерах таким способом
иногда можно «подглянуть» в тестовые данные.
Выделенные категории признаков представлены на рис. 2.30.
In (11]: М caxegorial_-fearures = ['пол', 'Курение', 'Регион'] д ка егориальные признаки
real_features = ['Возраст , 'ИМГ , 'Дети'] # вещественные признаки
target_feature = 'Расходы* # целевой признак
Рисунок 2.30 - Категории
Визуализация совместных распределений вещественных признаков будет
осуществляться при помощи «PairGrid», причем разбивать данные по одному
признаку из числа категориальных.
Справка. PairGrid - это сетка графиков для визуализации попарных от-
ношений в данных. Синтаксис:
«class sns.PairGrid(data, hue=None, hue_order=None, palette=None,
hue_kws-None, vars=None, x_vars=None, y_vars=None, diag_sharey=True,
size=2.5, aspect=l, despine=True, dropna=True)»
• data - данные;
• hue - категории, которые будут закрашиваться в разные цвета;
• palette - цветовая схема, может быть задана в виде словаря цветов;
• height - высота каждой грани (в дюймах).
Па графиках приведены:
• данные в виде точек для каждой пары вещественных признаков;
• ядерные оценки плотности для каждой пары вещественных признаков;
• ядерные оценки плотности для всех вещественных признаков по отдель-
ности.
Программный код на построение графиков представлен на рис. 2.31.
In [3d]: Н for hue in categorial_features;
g sn5.Pair<jrld(train[[’HMT", 'Возраст , Расход»»', hue]],
hue=hue, diag_$harey=Fal»a, heigntT3)
g.nap_lovter(sns .kdeploc, alpha* J.6)
g.wap_upper(pit.scatter, alpha=0.3)
g.map_diag(sns.kdeplot, lw=3, alphas!.6,
comnon_nornisFalse) # каждая ллолносл» лоотдельяс слги должна даважс. 1 при интегрировании
g.aod_legend()
Рисунок 2.31 - Построение
Графики представлены на рис. 2.34 - 2.36.
пол
женский
мужской
60000
Расходы
20 40
ИМТ
Рисунок 2.32 - График по признаку ПОЛ
Расходы
Расходы
60000
40000
20000
о
20 40 20 40 60 80 0 25000 50000 75000
ИМТ Возраст Расходы
Рисунок 2.33 - График по признаку КУРЕНИЕ
80
60
о
СО
£40
£
20
40
30
20
Регион
северо-запад
северо-восток
юго-восток
юго-запад
80000
60000
£ 40000
о
X
£ 20000
о
20 40 60
ИМТ
25 50 75
Возраст
0 50000
Расходы
Рисунок 2.34 - График по признаку PEI 11011
По графикам сразу можно сделать следующие выводы:
• расходы растут с увеличением возраста клиента;
• величина расходов больше для курящих людей.
Скорее всего эти признаки должны оказать существенное влияние при
построении регрессионной модели.
Далее произведем кодирование категориальных признаков с помощью
класса «OncHotEncoder». Данный метод из одного категориального признака
делает несколько бинарных признаков по количеству различных значений ис-
ходного категориального признака. Например, если исходный признак прини-
мал 5 различных значений, то его кодировкой будет 5 новых бинарных призна-
ков, где единица будет только у того бинарного признака, который соответ-
ствует данному значению исходного категориального признака. Ино-
гда, например, для линейной регрессии, необходимо делать на один бинарный
признак меньше, поскольку значения оставшегося бинарного признака можно
выразить из значений всех остальных бинарных признаков.
Важные аргументы конструктора:
• categories - если установлено значение auto, то категории определяю гея
по имеющемуся объему данных, иначе, используется список категорий,
который передается этим аргументом.
• drop - указывает методику, используемую для удаления одной из кате-
горий для каждого объекта. Это может быть полезно для некоторых мо-
делей, например, для линейной peipeccnn. Возможные значения указаны
далее.
• None - оставляем все признаки.
• first - удаляет первую категорию для каждого признака. Если признак
имеет одну категорию, то он будет удален полностью.
• if binary - удаляет первую категорию только для бинарных признаков.
• массив drop, где dropfi] — категория в признаке feature Х[:, i], которая
должна быть удалена.
• sparse- возвращает sparse-матрицу, если установлено значение True,
иначе - массив.
Основные методы класса:
• fit(X) — обучить кодировщик кодировать признаки на основе данных X.
В данном случае под термином «обучить» поднимается определение
функций кодирования и декодирования признаков.
• transform! X) - закодировать признаки в данных X.
• fit transform(X) - обучить кодировщик по данным X и сразу их закоди-
ровать.
• inverse_transform(X) - декодировать признаки в данных X, то есть пере-
вести бинарные признаки в исходные категориальные.
При построении кодировщика для исходных данных учтем ряд особенно-
стей:
• указывается drop-first', то есть одну категорию нужно исключить;
• указывается sparse=False, то есть вернуть нужно неразряженную матри-
цу;
• нужно выполнить обучение, что в данном случае подразумевает постро-
ение и сохранение правила преобразования;
• сразу же кодируются признаки из обучающего множества.
In [35]: И encoder = OneHotEncoder(drop='first‘, sparse=False) я объявляем модель
train_cat = encoder, -f it-transformttraln [cat egorial_f eat ones]) # обучаем и новируем
train_cat
Out[35] аггау([[0., 1., 1., [0., 1., 1., 0., 0.], ©.Г е., ©л,
[0., 0., 0->
[i-> i., 1., 0., 0.],
[1., 0., 0., 1.],
[1., 1., 1., ©•> 0-]])
Рисунок 2.35 - График по признаку РЕГИОН
Видно, как «обучились» категории. Для каждого категориального при-
знака приведен список его категорий, рис. 2.36.
In [36]: Н encoder.categories-
Out[36]: [array(['женский', ’мужской'Jt dtype=object),
аггау(['да', 'нет'], dtype=object),
array(['северо-восток', 'северо-запад’, 'юго-восток', 'юго-запад'],
dtype=object)]
т« r i. ы I
Рисунок 2.36 - Обучение
Соединенные вместе вещественные признаки и закодированные катего-
риальные представлены на рис. 2.39.
In [37]: Н X train = пр.hstack([train[real_features], train_cat])
X_train.shape
Out[37]: (1070, 8)
Рисунок 2.37 - Соединение вещественных признаков
и закодированных категориальных
Наконец, обучение проходит и сама модель линейной регрессии с помо-
щью класса «LinearRegression».
Важные аргументы конструктора:
• fit intercept - нужно ли включать в модель свободный член. В слу-
чае fit_intercept=True модели не нужно передавать признак из всех еди-
ниц для того, чтобы она оценивала свободный член. По умолча-
нию fit intercepts rue.
• nonnalize- нужно ли сделать нормализацию данных. По умол-
чанию fit intercepts’rue.
Основные методы класса:
• fit(X, у)- обучить линейную регрессию на основе данных
X предсказывать целевой признаку. В данном случае под термином
«обучить» поднимается вычисление оценки коэффициентов О.
• predict(X) - предсказать по данным X целевой признак у. В данном слу-
чае под термином «предсказать» поднимается вычисление оценки целе-
вого признака у.
Необходимо обучить модель линейной регрессии по данным. Указывает-
ся fit interceptS rue для оценки свободного коэффициента, что позволяет не
добавлять в матрицу признаков столбец из единиц.
Обучение модели представлено на рис. 2.38.
In [38]: H model = LinearRegression(fit_intercept=True) # объявляем .модель
model.fit(X_train, train[target_feature]) # обучаем
0ut[38]: LinearRegression()
Рисунок 2.38 - Обучение модели
Результат обучения. Оценки коэффициентов перед признаками, рис. 2.41.
ииции]. u xfiedirvegrebb j.chi v ;
In [159]: Н model.coef_
,rl!9], array([ 245.38723517, 346.32944697, 525.18160275, -76.10415577,
-23972.29341486, -820.46840702, -999.19835732, -925.49852601])
Рисунок 2.39 - Результат обучения
Оценка свободного коэффициента представлена на рис. 2.40.
In ^160\ Н model. intercept_
Out[160]: 12068.429210^82302
Рисунок 2.40 - Свободный коэффициент
Этап 3. Тестирование.
Необходимо выполнить с тестовым множеством данные те же преобразо-
вания. рис. 2.43.
In [161]: И • П еяе ц с* млиекта по д . • гния
test['Возраст ] = (pd.Timestamp(2021-04-17*) - test[*4aTa рождение]) / pd.Tlmedelta( 365 days e5;49:12*)
♦ Кодируем категориальные признаки с помощью метода tranifor* обученного ранее кодиробыико
test_cat = encoder.transform test[categorial_features])
* Соединяем данные
X_test np.hstack.(ttest[real_features], cest_cat])
Рисунок 2.41 - Преобразования
Посчитать ошибку предсказания можно разными способами. Наиболее
популярный способ - метрика MSE (mean squared error - среднеквадратичная
ошибка). Пусть Yn- истинные значения, a Yn..., Yn,..., Yn- предсказа-
ния. Тогда метрика MSE определяется как
п
MSE= |У(Г;-У;)2
П 2—j
/=1
Справка. В анализе данных функционалы качества и функционалы ошиб-
ки предсказания принято называть метриками. Данные метрики не имеют ни-
какого отношения к функциям расстояния, в качестве которых термин «мет-
рика» используется в математическом анализе.
Требуется рассчитать ее, а точнее - корень из нее, который еще обознача-
ется как RMSE (root MSE), рис. 2.44.
In [163]: Н пр.sqrt(((test[target_feature] - test_preds) ♦♦ 2).mean())
Out[163]: 6440.722464233561
Рисунок 2.42 - Ошибка предсказания
Это значение уже имеет конкретный смысл - насколько в среднем модель
отклоняется от истинного значения. То есть в среднем отклонения предсказания
величины страховых расходов имеют порядок 6440 условных единиц. В данных
страховые расходы в основной массе принимают значения до 50 000 у. е.
Другой вариант - метрика МАЕ (mean absolute error - средняя абсолют-
ная ошибка), определяемая как
п
MSE=
1=1
Ее большое преимущество в том, что она не сильно подстраивается по
выбросы по сравнению с MSE. Однако ее труднее оптимизировать.
In [166]: и metrics.mean_absolute_error(test[target_feature], testpreds)
0ut[166]: 4501.029251619946
Рисунок 2.43 - Ошибка предсказания
Еще один популярный вариант - метрика МАРЕ (mean absolute
percentage error - средняя абсолютная процентная ошибка), определяемая как
1 ДЦ iy. _ Y I
МАРЕ = 100 % * - > —----------
nAu Yi
i-1
В отличии от предыдущих метрик она позволяет посчитать ошибку в
процентах, что бывает достаточно информативно в реальных задачах.
Реализация представлена на рис. 2.44.
In [169]: H def mean_absolute_percentage_error(y_true, y_pred):
return It’d * (np.abs(y_true - y_pred) / y_true) .rreanf)
mean_absolute_percentage_error(test[target_feature], test_preds)
Out[169]: 45.0758459458119
Рисунок 2.44 - Ошибка предсказания в %
Для сравнения необходимо рассчитать предсказания и ошибки на обуча-
ющем множестве, рис. 2.47.
In [170]: Н train_preds = model.predict(X_train)
metrics.mean_squared_error(train[target_feature], train_preds) ** 0.5, \
metrics.mean_absolute_error(train[target_feature], train_preds), \
mean_absolute_percentage_error(train[target-feature], train_preds)
Out[170]: (5944.921461532554, 4096.917531819093, 42.58714933708642)
Рисунок 2.45 - Ошибка предсказания в %
На обучающем множестве значения ошибок предсказания получились
немного меньше, чем на тестовом множестве. Это и понятно, ведь модель так
построена по обучающим данным, чтобы давать на них наименьшую ошибку.
На данных, которые она не «видела» при обучении, она может вычислять пред-
сказания несколько хуже. В этом и есть причина разделения данных на обуча-
ющую и тестовую часть.
Весь программный код представлен на рис. 2.46.
In { ]: И inport njnpj as пр
lapcrt pandas as pc
pd.options.’Wde.chained.assigr-ent iwne
leport natplotlib.pyplct as pit
lepcrt seaborn as sns
sns.set(font_scale«i.>, palette«'set2 )
free s>clearo.eo«l_selection import traln_test_split
fro* sidearn.p-eprKesslng iaport OneHbtEncoder
fro* sxlearn.linear_aodel iwport tinea^egression
froe sklearn iaport eetrics
In ( ]! н cata = po.reaa_c$v(r'C:\users\clow .resKtop'caxa.csC, encodings'wiroons-l251", ₽a'se_catess()])
data.beadt)
in ( j: H data.shape
in [ ; н train, test « train_test_split(data, test.size -.2)
fair, snape, test.snaps
I'. [ ]: H train] возраст'] • (pd.Tlnestanpi 2Э21-М-1Г) - train] дата рождения']) / pd.Tlmedelta('?6S a s 95:49:12')
in ( ]: m catego"lal_^eatures ['пол', 'курение', Ре'-ьн'] # кавеаорл: s-we прузнрху
real_features ]’возраст', 'инт', Дети'] * йе^ественние признаку
ta-get_feature = Расходи' * иегевои оризяах
Рисунок 2.46 (начало) - Листинг программного кода линейной регрессии
In [ ' и for hue in categerial_features
g = sns.PalrSridttrainI( .-ЧТ', ’Возраст', 'Расход» , hue]],
hue»hue, aiag_st’S''ey»False) heights)
g. map_l=r»er (sn s. Kde p lot, al pna «0. ё)
g.eiap_upper(plt.scatte'', alpha» ’)
g.nap_diag(sns.Kfleplct, Lr=3, alpha=e.6,
ссчноп.погя«Р*1«е) • ксхЛая плоямос** пооя^лпьиосяи Золл-и доводе 1 яри идаегрирввимии
g.add_legend(j
In ( ]: м encoder oneHotEncodtr(drop»'first', sparse»False) • оРь??ляея яснела
t-ain_cat encoder.fit_t"ansfcni(Train[categorl31_Featu'*esJ) • 5буч«л и ея
train_cat
in ( ]: н enscder.categories.
in [ ]: н x_train rp.nstack([train[real_featu'-es], train,cat])
x_traln.shape
In [ ]: H eoael lifiearRe<res5ion(fit„intercept«Tnie) * 1 я«л > ’• r
•odel.Ht(X_traln, t«,ainita-get_*eatu'e)) • odj-зел
In ( ]: H •Mel.coef.
In [ ]: H nodel.intercept.
in [ ]: и » Лг -гех fojpace > r-u-a ro do-e рождения
test] Возраст'] <pd.Tiine5tanp( :e2i-e*.i7') - test] Дата рождения )) / pd.Tineceltai'305 days «5:49:12')
* rodupye* категориальные признаки с поллммс «e«oda transfora с^учеяного рояее ка^ирс^ка
test_cat • encoder.transfore(test[categcrial_featuresj)
« Соедияяел Осггы
x.vest np.nstacic([test[real_feacures], test.cat])
in [ ]: и test_preos = 40dei.p"edict(X_test)
In ( ]: и np.sort(((test£target_+eature] - cest-ceds) •• l).aean())
In ( ]: H def nean_aosdute_percentage_error(y_true, y_pred):
return 100 * 7np.aos(y_true y_p-ea) / y_truej.rean()
nean_aosolute_percentage_er-cr(testftarget.feature], test.preds)
in [ Ji m trainjsreds ncdel.predict(x_traln)
eetrics.eean_squared_error(traln(target_feature], train_preds) «.5, \
etrics.nean_aDscli*te_error(crain[target_featjre], traiflj>re<jS)< \
•>ean_absoldte_percent3ge_errcr(traln[ta-get_FeatureT, trainjireds)
In [ ]: h nettles.Bear_aos€lute_error(test[target_feature], testjreos)
in [ ]: H
Рисунок 2.46 (окончание) - Листинг программного кода линейной регрессии
Задачи для самостоятельного решения
Выполните задание по теме «Алгоритм линейной регрессии» на языке Py-
thon. используя исходные данные в соответствие с вашим вариантом.
Вариант 1. Университеты и колледжи. Набор данных находится по ссыл-
ке:
https://quer y.data.world/s/f4r2k3efx5zlknk2mh637nz57bturo
Вариант 2. Подержанные автомобили. Набор данных находится по ссыл-
ке: https://query.data.world/s/nwc4xdkhi6jkdvpflwrdax7hzpqwao
Вариант 3. Пол студентов в разбивке по районам 2007-2010. Набор дан-
ных находится по ссылке:
https://query.data.world/s/jrswhzhshb7ewabc73wndamu5wimip
Вариант 4. Туристические гранты. Набор данных находится по ссылке:
https://query.data.world/s/324sl3m4mhtpicb5z7bavpfrmqjjbb
Вариант 5. Демография. Набор данных находи гея по ссылке:
https://query.data.world/s/rd6yvlxni75sozqzpmal3eeaavjvmfp
Ал1 оритм лог истической pei рессии
11абор данных для решения задачи доступен по ссылке из облачного хра-
нилища:
https://disk.yandex.rU/d/MrIQOkvaoL-zOw
Поставленная формулировка задачи предполагает решить задачу в тер-
минах регрессии или классификации.
Поскольку мы решаем задачу алгоритмом логистической регрессии, то
задача классификации будет решаться более обширном набором математиче-
ским и программным аппаратом.
Для усиления качества разработанной модели решим задачу в терминах
задачи классификации, так как необходимо определить качественное вино или
нет ожидает покупателя по различным характеристикам алкогольного напитка.
Задача классификации позволит получить бинарную характеристику в векторе
ответов, тем самым определяя хорошее вино (1) или плохое (0) предоставлено
для анализа модели машинного обучения.
Атрибутивные характеристики набора данных (описание значений, кото-
рые представляют собой столбцы):
Атрибутивная информация:
Входные переменные (на основе физико-химических тестов):
1 - фиксированная кислотность
2 - летучая кислотность
3 - лимонная кислота
4 - остат очный сахар
5 - хлориды
6 - свободный диоксид серы
7 - общий диоксид серы
8 - плотность
9-рН
10 - сульфаты
11 - алкоголь
Выходная переменная (на основе сенсорных данных):
12 - качество (оценка от 0 до 10). Данная переменная является целевой, по ней будет производиться пред-
сказание вашей модели.
Импортируем необходимые библиотеки:
import pandas as pd
import numpy as np
import matplotlib.pyplot as pit
from sklearn.linear model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import contusion matrix, classification report, accuracy,score, confusionMatrixDisplay
Рисунок 1 - Библиотеки для решения прикладной задачи
предсказания качества вина
Для работы с набором данных как массивом информации (датафреймом)
понадобятся библиотеки pandas и numpy.
Для построения графиков - библиотека matplot lib и входящая в нее pyplot.
Для построения модели логистической регрессии и оценки ее точности
пригодятся библиотеки программных методов skleam.
Следующим шагом необходимо загрузить набор данных в переменную
датафрейма и представить его обобщенную структуру из первых пяти элемен-
тов при помощи метода head():
Ввод [7]: data wine = pd.r^ad csv(,D<it<i!.t‘tjbwx»i.csv , sep=';')
data win*.head()
Out[7]:
ft, so acidity volatiia acidity dtnc acid its»dual sugar chonaat fraa sulfur dtoxlda total sulfur dio.ida density pH sulphates alcohol quality
0 70 0 27 038 20 7 0 045 450 1700 1 0010 300 045 88 6
1 83 030 034 16 0 049 14 0 1320 owe 3 30 049 95 6
2 81 028 040 68 0 050 300 97 0 09951 326 0.44 101 6
3 72 0 23 032 85 0Q58 470 1860 0.9956 3 19 C 40 99 6
4 7? 023 032 85 0 058 47 0 1860 09958 319 040 99 6
Рисунок 2 - Представление структуры набора данных
Отметим, что данные разделены в файле csv точкой с занятой, поэтому в
явном виде нужно указать сепаратор (по умолчанию это запятая).
После визуальной оценки структурной сетки набора данных, перейдем
непосредственно к его аналитике:
Ввод [9]: data_wine.info()
cclass 'pandas.core.frame.DataFrame'>
Rangeindex: 4898 entries, 0 to 4897
Data columns (total 12 columns):
# Column Non-Null Count Dtype
0 fixed acidity 4898 non-null float64
1 volatile acidity 4898 non-null float64
2 citric acid 4898 non-null float64
3 residual sugar 4898 non-null float64
4 chlorides 4898 non-null float64
5 free sulfur dioxide 4898 non-null float64
6 total sulfur dioxide 4898 non-null float64
7 density 4898 non-null float64
8 PH 4898 non-null float64
9 sulphates 4898 non-null float64
10 alcohol 4898 non-null float64
11 quality 4898 non-null int64
dtypes: float64(ll), int64(l)
memory usage: 459.3 KB
Рисунок 3 - Типы данных признаков
Из рисунка 3 следует, что все тины данных представлены в «float64» или
«int64». Это очень облегает задачу, так как нет данных типа «object»: с ними
не работает модель машинного обучения.
Следующий пункт в процессе исследовательского анализа состоит в
определении количества NaN-значений в наборе данных. Чаще всего это про-
пуски или сбитые кодировкой значения, они также должны быть, при необхо-
димости, исключены из датасета.
Ввод [10]: data_wine.isnull().sum()
Out[10]: fixed acidity 0
volatile acidity 0
citric acid 0
residual sugar 0
chlorides 0
free sulfur dioxide Q
total sulfur dioxide 0
density 0
pH 0
sulphates 0
alcohol 0
quality 0
dtype: int64
Рисунок 4 - Суммарное значение bJaN-значений
в каждом столбце отдельного признака
Рисунок 4 позволяет нам обоснованно облегчить процесс построения ре-
шающей модели логистической регрессии, так как теперь мы точно знаем, что
все данные представлены в полном и правильном виде.
Рассмотрим статистическое распределение для каждого признака. Для
этого построим гистограмму по каждому столбцу прецедента:
Ввод [17]: data_wine.hist(figsize=(12,15))
pit,show()
С её помощью получим набор графиков, характеризующих распределе-
ние каждой величины (рисунок 5):
volatile acidity
citric acid
residual sugar
chlorides
free sulfur dioxide
Рисунок 5 - Распределение (статистическое) для каждого признака
Поскольку основная цель - решить задачу отнесения вина к категории
хорошее/плохое, то появляется необходимость закодировать признак целевого
столбца (quality) в бинарном виде.
Для этого мы сделаем предположение, что, если вино выбрано по десяти-
балльной шкале, то будет разумным относить вино к «хорошей» категории, ес-
ли его оценка больше или равна 7. И вино будет отнесено к «нехорошему», ес-
ли его оценка ниже 7 баллов.
Реализуем и зафиксируем данный тезис в программном виде (рисунок 6).
ввод [18]: data_wine['quality'] = data wine.quality.apply(lambda x:l if x>=7 else 0)
Взод [19]: data_wine[ quality'].value counts()
Out [19]: 0 3838
1 1060
Name: quality, dtype: int64
Рисунок 6 - Ранжирование вино и перевод номинального признака в бинарный
Таким образом, получилось, что после ранжирования признака в «хоро-
шие» вина было отнесено 22 % всего набора данных (1060 экземпляров), а к
«плохим» винам относится оставшиеся 78 % от исходного датасета.
Учитывая, что разбиение несбалансированное, будем разделять набор на
тестовую и тренировочную выборку в отношении 30/70 соответственно. Это
позволит модели логистической регрессии аккумулировать обобщающую спо-
собность на всех семплах информационного поля вне зависимости от типа их
принадлежности к целевому классу:
ввод [24]: X_train, x_test, y_train, y_test = train_t₽st_split(X, у, test_size=0.3, random_state=222)
Рисунок 7 - Разбиение набора на тренировочную и тестовую выборку
Оставшаяся задача - построить модель логистической регрессии. Для
этого воспользуемся моделью из библиотеки sklearn и обучим се на нашем
наборе данных:
Пвод [35]: LogisticRegr = LogisticRegression()
logisticRegr.fit(X train, у train)
LogisticRegrprediction = LogReg.predict(X test)
LogisticRegr_accuracy = accuracy_score(LogisticRegr_prediction, ytest)
print("Точность по тестовой выборке : {:.3f}%".format(LogisticRegr_accuracy * 100))
Точность по тестовой выборке : 80.340%
Рисунок 8 - Создание и обучение модели логистической регрессии
Точность (рисунок 8) определяется по метрике accuracy, что влечет за со-
бой неоднозначность ответов алгоритма. Эта метрика неинтерпретируема для
несбалансированных данных, поэтому оценку следует проводить по парамет-
рам precision и recall:
Ввод [36]: print(classification report(у test, LogisticRegr prediction))
precision recall fl-score support
0 0.82 0.96 0.88 1141
1 0.67 0.24 0.36 329
accuracy 0.80 1470
macro avg 0.74 0.60 0.62 1470
weighted avg 0.78 0.80 0.77 1470
Рисунок 9 - Оценка алгоритма логистической регрессии
по критериям precision и recall
Поскольку мы решали задачу в терминах классификации, то оценка preci-
sion и recall также оформлена для каждого класса в отдельности.
Из рисунка 9 следует, что критерий precision очень точно определяет точ-
ность ответов как в нулевом классе (вино «плохое»), так и в первом (вино «хо-
рошее»). Это означает, что нивелируется эффект ложноположительных сраба-
тываний алгоритма [1 ].
Так как решаемая нами задача - определение вина, то очень важно, чтобы
оценка была выполнена по метрике снижения ложноположительных результатов:
«хорошее» вино не должно ложноположительно классифицироваться алгоритмом
к «плохому», так как это заметно ухудшит заслуженную репутацию вина.
Однако, в случае отнесения «плохого» вина к «хорошему» классу, такая
ошибочная (маловероятная) классификация не сильно изменит позиции «пло-
хого» вина [1]. Также необходимо учитывать роль многих строк, которые при-
ходят для исследован и й алгоритмом, поэтому в отношении генеральной сово-
купности картина классификации не будет существенно искажена, что позволя-
ет присвоить реализованному алгоритму логистической регрессии высокий
уровень прикладной точности.
Гребневая pel рессия
Чтобы начать разбирать пример гребневой зависимости в PyCharm
Community Edition 2021.1 х64, нам нужно изучить несколько типов библиотек
для этого вида зависимости и уже на практике применить его: Pandas - это биб-
лиотека для работы с данными. С ее помощью можно загрузить данные практи-
чески из любого источника (инте1 рация с основными форматами хранения дан-
ных для машинного обучения), вычислить различные функции и создать новые
параметры, построение запросов к данным с помощью функций реализованным
в SQL (Scikit-learn). В этой библиотеке есть решения почти на все современные
и известные преобразования, математические функции, данные и так далее.
Цель применения гребневой регрессии в практике: изучить реальные дан-
ные и спрогнозировать модель поведения.
Первым шагом для работы подключаем и скачиваем библиотеки:
® Project ♦
v Bi python Projcct4
> to venv
ft main.py
> lllli External Libraries
^Scratches and Consoles
$ - ft main.py ft validation.py
^port
OS
v to site-packages
import
import
import
import
numpy as np
pandas
pandas as pd
matplotlib.pyplot pl
>
>
>
>
>
>
to _distutils_hack
to cycler-0.11.O.dist-info
to dateutil
to fontTools
li fonttools-4.29.0.dist-info
Bijoblib
tojoblib-1.10.dist-mfo
to kiwisolver- 1.3.2.dist-into
to matplotlib
to matplotlib-3.5.1. dist-mfo
to mpl_toolkits
to numpy
Bi numpy-1.22.1.dist-info
to packaging
to packaging-21.3.dist-info
to pandas
to pandas-1.4.0.dist-info
Рисунок 2.1 - Библиотеки программы
Здесь показано, что скачаны pandas, numpy, и также библиотека для по-
строения графов.
Затем задаем параметры фигуры:
pl.style.use('seaboгп-whitг id 1)
pl.rcParams[ figure.fiflsizE1] = [14^10]
Рисунок 2.2 - Параметры фигуры
Следующий фрагмент кода служит для вставки нашего csv файла с набо-
ром данных. Для этого нужно создать параметр os, который служит для поиска
директивы, затем с помощью библиотеки pandas прочитать csv файл, после это-
го разделить каждый столбик на колонки, для наглядности используем команду
print, чтобы вывести на экран свод данных:
os д с hdlrCC: / ”),
COVID = pandas.read_csv("Covic , -Л :v")
covid = COVID.соруО
categorical_col_updated = ['datecounty state fips1 cases deatr $' ]
covid = pandas.get_dummies(covid, - categorical_cot_updated)
print(COVID)
Рисунок 2.3 - Команда принт
Набор данных представлен по этой гиперссылке:
https://datasetsearch.research.google.com/search?query=coronavirus%20covid-
19&docid=L2cvMTFqOWNianljMw%3D%3D
а
Run- * тлел
С \Users\Haxiw\PychariiProlects\pythonProiect4\venv\Scrlpts\python.exe C’/Users/haxlw/PycharBProjects/pythonProject4/i>aln.py
i
date county state tips cases deatns
е 2021 12’28 Autauga Alabama 1081.0 10828 160.6
1 2021 12 28 Baldwin Alabana 1083.0 39884 593.8
2 2021 12 28 Barbour Alabana 1085.0 3750 81.6
3 2021 12 28 Bibb Alabawa 1087.8 4452 95.6
4 2021-12-28 Blount Alabana 1009.0 11896 197.6
97554 2022-01-26 Sweetwater Wyowing 56037.0 9810 115.6
97555 2022-81-26 Teton Wyowing 56039.0 9121 15.0
97556 2022-01-26 Uinta Wyowing 56641.8 5167 34.0
97557 2022-01-26 Washakie Wyowing 56043.0 2092 41.0
97558 2022 61 26 Weston Wyowing 56045.8 1488 16.6
[97559 rows x 6 coluwns]
Рисунок 2.4 - Свод данных
Затем нам нужна предварительная обработка данных:
trainingTata=pd.read_csv( )
trainingOata.headО
Jrog sklearn.linear_model import Ridge
trainingCata = trainingOata(trainingData.fips == 1001]
trainingOata.dropna( -( lcases"x,,deaths" ])
trainingOata.sort_values( =[ date 1)
trainingCata=trainingOata.iloc[int(len(trainingData)*o.33):int(len(trainingData)*O. 66) ]
Рисунок 2.5 - Обработка данных
Метод sklearn создает линейную модель гребневой зависимости. Subset -
это множества, которые содержат неупорядоченные элементы их надо удалить.
Сортировка происходит по дате.
Дальше уже пробуем делать основное - это обучать алгоритм линейной
зависимости с разным альфа, как сказано в теории.
Альфа определяет силу регуляризации. Чем больше значение альфа, тем
сильнее регуляризация. Другими словами, когда альфа очень большое число,
смещение модели будет высоким. Альфа 1, приведет к модели, которая дей-
ствует идентично линейной регрессии.
Гребневая регрессия минимизирует целевую функцию:
|у - Xw||A2_2 + alpha * ||w||A2_2
w = np.dot(np.dot(np.linalg.inv(np.dot(X.T, X) + alpha * I), X.T), y)
pit. scatter (X у =3, = 'b' = 1, ='Тга1н1лд cJJta')
plt.plot(X, w*X, ='red'A =1 prediction')
pit .legendO
pit.show()
Рисунок 2.6 - Создание целевой функции
Эта модель решает регрессионную модель, в которой функция потерь яв-
ляется линейной функцией наименьших квадратов, а регуляризация задается 12-
нормой. Другими словами, альфа это параметр того, насколько гребневая ре-
грессия должна стараться предотвратить переоснащение.
В данном случае, используют alpha 1,10.100.
alpha = 10
n, m = X.shape
I = np.identity(m)
w = np.dot(np.dot(np.linalg.inv(np.dot(X.T, X) 4 alpha * I), X.T), y)
pl.scatter(X у =3, ='b’4U- =_ 1, ='Training data')
pl.plot(X, w*X, =,red'4w ='prediction')
pl .legendO
pl|. show()
Рисунок 2.7 - Указание параметра alpha
Команда pl.show будет показывать график гребневой зависимости, важ-
ное примечание если не написать эту команду в программе PyCharm Community
Edition 2021.1 х64, то у вас попросту не покажутся трафики.
Результат всех альфа:
\ Figure 1
□ X
Рисунок 2.8 - Результат параметра 1
х=-1 794 у=89
Training data
Рисунок 2.9 - Результат параметра 10
• Training data
---- prediction
Рисунок 2.10- Результат параметра 100
Таким образом, проводится анализ каждого альфа и делается вывод: чем
больше значение альфа, тем сильнее регуляризация. Другими словами, когда
альфа очень большое число, смешение модели будет высоким. Альфа 1, приве-
дет к модели, которая действует идентично линейной pei рессии. Следователь-
но, цель данной работы достигнута и спрогнозирована дальнейшая модель по-
ведения: количество заболеваний Covid-19 в USA будет стремительно расти,
как видно на рисунке 2.8.
Алгоритм к ближайших соседей (к Nearest Neighbor)
Продемонстрировать его работу можно на примере программы на языке
Python. Реализация на этом языке проста тем, что существует уже множество
решений для упрощения написания моделей. Существует решение и для алго-
ритма к ближайших соседей.
Первоначально необходимо установить и подключить необходимые для
работы библиотеки, содержащие классы, которые будут использованы в реали-
зации алгоритма. В конкретном примере используются библиотеки numpy, mat-
plotlib, skleam.
import numpy as numpy
import matplotlib.pyplot as pyplot
from sklearn.model selection import train test split
from skleam.neighbors import KNeighborsClassifier
from skleam.metrics import accuracy score
def generateData( numbers, dimensions=2, classes=3):
X = numpy.zeros((numbers * classes, dimensions))
у = numpy.zeros(numbers * classes, dtype-uint8’)
for j in range(classes):
index = range!numbers * j, numbers * (j+1))
r = numpy.linspace(0.0, 1, numbers)
t = numpy.linspace(j * 4, (j + 1) * 4, numbers) + numpy.random.randn(numbers) * 0.2
X| index] = numpy.cjr * numpy.sin(t), r * numpy.cos(t)]
y[index]=j
return X, у
def generate!):
# создаем набор значений
X, у = generateData( 100)
# усложняем набор
Х[:, 0] += numpy.random.normal! 1ос=0, scale=0.15, size=300)
X[:, 1] += numpy.random.normal!loc=(), scale=0.15, size=300)
return X, у
def showData(X, y):
# демонстрация точек
pyplot.figure(figsize=(12, 12))
pyplot.scatter(X[:, 0], X[:, 1], c=y)
pyplot.xlim((x min, x max))
pyplot.ylim((y min, у max))
pyplot.grid(True)
pyplot.show()
Д разбиваем данные на обучающую и тестовую выборки
def splitTrainTestData(X, у):
X_traiData, X testData, у trainData, у testData = train test split(X, y, train_size=0.6)
classifierKNN = KNeighborsClassifier!5).fit(X traiData, у trainData)
у train Data_predict = classifierKNN.predict!X traiData)
y tesiData predict = classifierKNN.predict(X testData)
print(fПроцент качества на обучающей выборке: {accuracy score!у trainData,
у trainData predict)}’)
print(fПроцент качества на тестовой выборке: {accuracy scorcfy testData,
у testData predict)}')
return X testData, у testData
def showClassify(x min, x max. у min, у max, X test, у test):
pyplot. figure! figsize=( 12, 12))
pyplot.xlimUx min, x max))
pyplot.ylini((y min, у max))
pyplot.scatter(X test[:, 0], X test[:, 1], c=y_ test)
pyplot.grid(True)
pyplot.showQ
X, у = generate()
x min, x max = (-1, 1)
yjnin, у max - (-1, 1)
showData(X, y)
X testPata, у testData = splitTrainTestData(X, y)
showClassify(x min, x max, у min, у max, X testPata, у testData)
Листинг 1 - Реализация алгоритма к ближайших соседей
Первоначально, описывается алгоритм генерации данных, которые будут
участвовать в обучении модели и тестировании.
Полученные данные можно продемонстрировать на координатной плос-
кости. Было сгенерировано 3 класса, отличающиеся положением в простран-
стве.
-1 00
0 50
025
ООО
-0 25
-0 50
-0 75
-100
-0 50
Рисунок 1 - Вывод сгенерированных данных
100
Полученные данные необходимо разделить на тестовую и обучающую
выборки. Сделать это можно при помощи инструмента, предоставляемого биб-
лиотекой sklearn. Модель обучается на основе полученных тренировочных дан-
ных, в качестве количества ближайших соседей указывается к=5.
Качество работы модели можно измерить при помощи также инструмен-
тов библиотеки. Система принимает в себя истинные и предсказанные значе-
ния, а возвращает процент совпавших ответов.
Процент качества на обучаищей выборке: 0.8388888888888889
Процент качества на тестовой выСюрке: 0.8________________
Рисунок 2 - Качество работы модели на обучающей и тестовой выборке
Результат обучения модели можно продемонстрировать на координатной
плоскости.
Рисунок 3 - Результат обучения модели
Как видно из рис. 3, модель определяет класс объекта нс всегда верно,
иногда классы перемешиваются между собой. Что, в общем, соответствует по-
лученному проценту качества работы модели с тестовыми данными.
Алгоритм деревья решений (Decision Tree)
Постановка задачи
11усть имеется некоторая выборка о кредитовании физических лиц с ука-
занием их признаков - зарплаты, пола и возраста. Результирующий признак -
выдача (невыдача) кредита. Требуется получить алгоритм, способный на основе
аналогичных входных данных принимать решение о выдаче (невыдаче) кредита.
Исходные данные представлены в виде файла Excel (лист vO) по ссылке:
https://wdfiles.ru/1 с 1 с23
Решение
Решать задачу будем с использованием языка программирования Python
версии 3.9. Также использована будет интегрированная среда разработки Jupy-
ter Notebook.
В первую очередь, требуется подключить необходимые пакеты. Обычно
для решения подобных задач используется пакет sklearn - это пакет машинно-
го обучения, включающий множество алгоритмов машинного обучения, а так-
же пакет pandas, используемый для чтения и записи разных файлов и для про-
ведения анализа данных.
Из пакета sklearn нас будут интересовать подмодули model selection и
tree. Подмодуль model_selection содержит методы для работы с выборками
данных, а метод train test split позволяет разделить набор данных на трениро-
вочную и тестовую часть: на тренировочной части данных будет производиться
обучение алгоритма, а на тестовой части данных можно будет проверить каче-
ство проведенного обучения. Подмодуль tree содержит непосредственно мето-
ды для работы с деревьями, метод DecisionTreeClassifier позволяет создать де-
рево решений классификации, а метод exportgraphviz позволяет выгрузить
созданное дерево в графическом виде в файл.
Импортируемые пакеты предварительно должны быть установлены. Об-
щий вид команды установки пакетов:
pip install имяпакета
Например, установка пакета numpy:
C:\Windows\system32\cmd.exe
HRrosoft windows [Version 10.0Л776^^237^^
(с) Корпорация Майкрософт (Microsoft Corporation),
2618. Все права защищены.
t:\Users\Vovanspip install попру
Collecting numpy
Downloading numpy-1.21.3-cp39-cp39-win amdM.whl (14.0 MB)
i4 .e mb ге ив/ s
Installir
Successfully installed numpy-1.21.3
WARNING: You are using pip version 21.2.3; however, version 21.3 is available.
tau should consider upgrading via the 'C:\Users\Vovan\AppData\Local\Programs\Python\Python39\python.exe - pip install
upgrade pip’ command.
:\Users\Vovan>e
Итак, подключаем пакеты:
Ввод [1]: import pardas as pd
from sklearn.mocel_selecticn import train_test_splir
from sklearn.tree import DecisionTreeClassifier
fror sklearn.tree import export_graphviz
После подключения пакетов необходимо загрузить в программу исход-
ные данные. По ссылке ... хранятся исходные данные в формате файла Excel с
расширением *.xlsx. Для загрузки их в программу используем метод read excel
библиотеки pandas, который позволяет прочитать и обработать файл Excel:
Евод [2]: df = pd.^ead_excel(’data.xlsx', sheet_name = ’v0')
Убедиться, что данные загружены корректно, можно при помощи метола
head, позволяющего отобразить первые 5 строк текущего набора данных в
формате таблицы-предпросмотра:
?вод [3]: df.head()
Out[3]: salary genuei age credit
0 9C00 f 24 0
1 3100 m 47 0
2 14600 f 46 1
3 Ю400 f 58 0
4 10400 m 31 1
Поскольку в наборе присутствует нечисловой параметр, а именно пара-
метр gender, представленный в виде логического типа, то необходимо выпол-
нить преобразование этого параметре! к числовому типу:
Ввод “4]: df['gender'] = df['gender'].factorize()[0]
Проверим выполнение преобразования:
Ввод [5]: df,head()
Out[S): salary gender age credit
0 9000 0 24 0
1 3100 1 47 0
2 14600 0 46 1
3 10400 0 58 0
4 10400 1 31 1
Разбиваем все загруженные данные на два тина. С одной стороны - это
матрица входных признаков X, включающая все столбцы, кроме последнего. С
другой стороны - это выходной признак Y - соответствует последнему столб-
цу. Именно этот столбец содержит целевое значение, то есть соответствует от-
вету системы - выдать кредит или нет.
Бзод [6]: х = df.drop("credit'\ axis = 1)
у = df["credit"]
Разбиваем данные на тренировочную часть и тестовую часть. Оптимально
разделить данные в соотношении 80 % - тренировочная часть и 20 % - тестовая
часть.
Ввод ^7]: x_train, x_test, y_train, y_cest train_test_split(x, у, test_size 0.2)
Создаем дерево решений. В качестве параметра укажем максимально до-
пустимую глубину, чтобы дерево не получилось слишком большим:
Ввод [8]: tree = DecisionTreeClassifier(rrax_depth = 4)
Обучаем дерево на тренировочной части с помощью метода tit. В каче-
стве параметров этому методу передаем сформированную тренировочную
часть, состоящую из матрицы входных признаков х train и соответствующего
столбца целевых значений y train. В результате обучения программа сообщит
параметры дерева:
Ввод [9]: tree.fit(x_train, y_train)
Out29]- DecisionTreeClassifier(nax_depth=4)
Проверяем работу дерева на тестовой части исходных данных. UpoipaM-
ма сообщает результаты проверки:
Ввод [10]; tree.score(x_test, y_test)
0ut[16j: 1.0
Переводим дерево в формат DOT. Формат DOT является языком описа-
ния графов в понятном для человека и обрабатывающей программы виде:
Ввод [11]: export_graphviz(tree, out_file - ‘tree_credits.dot’, feature_naires x.columns, filled - True)
Представляем дерево в графическом виде и сохраняем его в файл:
C:\Program Files\Graphviz\bin>dot.exe -Tpng tree_credits.dot -о out.png
Рисунок 1 - Сгенерированный файл с представлением дерева решений
Темно-коричневым цветом показаны листья, соответствующие решению
«отказать в кредите», темно-синим цветом - соответствующие решению «вы-
дать кредит», прочими цветами показаны узлы.
Задание для самое юя1 ел ьно1 о выполнения
Разработать дерево решении, способное на основе входных данных -
возраста, стажа вождения и числа ДТП - принимать решение о возможности
заключения страхования КАСКО. Обучить алгоритм на входных данных
и проверить его работу. Точность полученного решения должна составлять
не менее 0.9. Входные данные представлены в файле Excel по ссылке
https://wdliles.ru/lclc23, варианты заданий соответствуют листам книги v[ номер
варианта].
Отчет должен содержать листинг программного кода, сообщения, выда-
ваемые программой в ходе работы, а также графическое представление дерева
решений.
Кон 1рольные вопросы
1. Что такое дерево решений?
2. Какие выделяют типы деревьев решений?
3. Из каких типов элементов состоит дерево решений?
4. Какие задачи решаются с помощью деревьев решений?
5. Каковы основные этаны построения дерева решений?
6. Какие критерии остановки алгоритма применяются при обучении дерева
решений?
7. Каковы преимущества и недостатки использования деревьев решений?
Наивный Байес (классификаюр)
Формулировка прикладной задачи:
Ссылка на набор данных в облачном хранилище:
https://disk.yandex.ni/cL/yQsxXmYB2ZfqQw
Представленный набор данных содержит 13 столбцов признаков и 1 це-
левой столбец.
Таблица 1-Информация о столбцах данных
№ столбца Параметр Именование в проекте решения
1 Возраст пациента age
2 Пол пациента sex
3 Тип боли в груди type pain
4 Кровяное давление в состоянии покоя pressure_ calm
5 Холестерол в сыворотке крови cholest
6 Уровень сахара в крови sugar in blood
7 Результаты электрокардиографии в состоянии покоя eleccardio calm
8 Максимальная частота сердечных сокращений max pulse
9 Стенокардия stenocardio
10 Депрессия ST depression st
11 Наклон пикового сегмента ST slope__st
12 Количество крупных сосудов number vein
13 Неинтерпретируемый медицинский параметр med ent
14 Отсутствие или наличие заболевания (целевой столбец) Y
В таблице 1 синим цветом обозначены столбцы признаков данного набор
а данных, а зеленым обозначен целевой столбец.
Программная реализация алгоритма Наивного Байеса:
# Методы для оперирования набором данных, датифреймами. сериями и массивами
import pandas as pd
import numpy as np
# Методы для графической аналитики и построения диаграммы
import matplotlib.pyplot as pit
%matplotlib inline
import seaborn as sns
# Библиотека для реализации модели Наивного Байеса
from skicam.naive bayes import GaussianNB
# Методы для разделения набора данных и выполнения кросс-валидации
from skleam.inodelselection import KFold, train test split, crossvalscore
# Метрики оценивания точности модели Наивного Байеса
from skleam.metrics import confusion matrix, jaccard score, recall score, fl score, accuracy score, precisi
on score
# Метод для стандартизации данных
from skleam.preprocessing import StandardScaler
# Загружаем набор данных в переменную raw data и отображаем его представление
raw data pd.read csv('dataset.csv')
raw data.head()
Out[ 104]: 70 о 1.0 4.0 130.0 322.0 0.0 2.0 109.0 0.0 2.4 2.0 3.0 3.0 2
0 67 0 0.030 115 0564 0002 0 1600001 6
1 57 0 1 02 0 124 0261 00 00 0 141 0 000 3
2 640 1 04 0 128 02630000 0 10501 00 2
3 74 0002 0 120 0 26900 02 0 121 01 00 2
4 65 0 1 04 0 1200 177 00 000 140 0 000 4
^Обозначение столбцов собственными именованиями
dataset pd.read csvfdataset.csv', sep -
names = ("age”, "sex", "type pain", "pressure calm", "cholest", "sugar in blood",
"elec_cardio_calm", "max_pulse", "stenocardio", "depression st", "slope st",
"number vein", "med crit", "Y"])
^Отображение данных
dataset
age sex lype_pain pressure calm cholest sugar in blood \
0 70.0 1.0 4.0 130.0 322.0 0.0
1 67.0 0.0 3.0 115.0 564,0 0.0
2 57.0 1.0 2.0 124.0 261.0 0.0
3 64.0 1.0 4.0 128.0 263.0 0.0
4 74.0 0.0 2.0 120.0 269.0 0.0
265 52.0 1.0 3.0 172.0 199.0 1.0
266 44.0 1.0 2.0 120.0 263.0 0.0
267 56.0 0.0 2.0 140.0 294.0 0.0
268 57.0 1.0 4.0 140.0 192.0 0.0
269 67.0 1.0 4.0 160.0 286.0 0.0
elec cardio calm maxjjulse stenocardio depression st slope st \
0 2.0 109.0 0.0 2.4 2.0
1 2.0 160.0 0.0 1.6 2.0
2 0.0 141.0 0.0 0.3 1 0
3 0.0 105.0 1.0 0.2 2.0
4 2.0 121.0 1.0 0.2 1.0
265 0.0 162.0 0.0 0.5 1.0
266 0.0 173.0 0.0 0.0 1.0
267 2.0 153.0 0.0 1.3 2.0
268 0.0 148.0 0.0 0.4 2.0
269 2.0 number vein 0 3.0 1 0.0 2 0.0 3 1.0 4 1.0 265 0.0 266 0.0 267 0.0 268 0.0 269 3.0 108.0 med crit Y 3.0 2 7.0 1 7.0 2 7.0 1 3.0 1 7.0 1 7.0 1 3.0 1 6.0 1 3.0 2 1.0 1.5 2.0
[270 rows x 14 columns]
# Отображение в виде датафреима
Out[105]: *я* «•X tVP*_P*.n chomt ЬиДО.'П.ЫоМ ItUAJhliM «•посмею a*pr*buon_«i numMr.vain пм.ст Y
0 700 1 0 40 1300 322 0 00 20 1090 00 24 20 30 30 2
1 07 0 00 30 1150 5640 00 20 1600 00 1.6 20 0.0 70 1
2 57 0 10 20 124 0 26Ю 00 0i 1410 00 03 1 0 00 70 2
3 640 10 40 1280 263 00 00 1050 10 02 20 10 70 •
4 74 0 00 20 1200 2690 00 20 121 0 1.0 02 10 10 30 1
264 620 1 0 30 1720 1990 10 00 1620 00 05 10 00 70 1
264 44 0 1 0 20 1200 2630 00 00 1730 00 00 10 Oo 70 1
287 560 00 2.0 1400 2940 00 20 1530 00 13 20 00 30 1
268 57 0 1.0 40 1400 192 0 00 00 1480 00 04 20 00 60 1
269 67 0 1 0 40 Iwo 2»0 00 20 1000 10 15 20 30 30 2
270 rows х 14 columns
^Функция для выполнения аналитики всех столбцов по типам содержащихся в них данных
def check( dataframe):
1=0
columns-dataframe.columns
for col in columns:
dtypcs dataframe[col].dtypes
nunique dataframe[col].numquc()
sum null dataframe[col].isnull().sum()
I.append([col.dtypes.nunique.sum null])
df check pd.DataFrame(l)
df check.columns ['Столбец','Тип данных',’Уникальных значений’,'Сумма NULL']
return dfcheck
# Вызываем функцию и передаем аргументом набор данных
chcck( dataset)
Столбец Тип данных Уникальных значений Сумма NULL
0 age float64 41 0
1 sex float64 2 0
2 type jiain float64 4 0
3 pressure calm float64 47 0
4 cholcst float64 144 0
5 sugar in blood float64 2 0
6 elec cardio calm float64 3 0
7 max pulse float 64 90 0
8 stenocardio Iloat64 2 0
9 depression st float64 39 0
10 slope st float64 3 0
11 number vein float64 4 0
12 med crit float64 3 0
13 Y int64 2 0
В столбцах нет пропущенных 'значений, все типы данных представляются
числовыми значениями:
• целое (int64);
• число с плавающей точкой (float64).
Поскольку модель Наивного Байеса - вероятностная, то все данные
должны быть числовыми. Полное отсутствие значения типа «object» очень
важно для предварительной подготовки данных в модели Наивного Байеса.
С прикладной точки зрения, только пол пациента определяет сбалансиро-
ванность, выборки, так как возраст пациента будет тесно связан с остальными
медицинскими критериями, определяющими наличие заболевания, а вот пол
человека, при прочих равных условиях, может существенно определить пра-
вильную обобщающую способность алгоритма классификации Наивною
Байеса.
# Визуализация сбалансированности выборки но признаку пола пациента
fig. ах plt.subplots(l, .figsize (12, ))
х dataset['sex'].value_countsO index
y=dataset['sex'].value_counts(). values.tolist()
data = dataset.groupby("sex").size()
sns.set(style="dark", color codes True)
pal sns.color palctteC’viridis", len(data))
rank data.argsort().argsurt()
sns.barplot(x x,y y.palette np.array(pal[::-l])[rank].ax ax[ ])
for p in ax[0].patches:
ax(0].annotate('{:.0f}'.format(p.get hcight()), (p.get x() , p.get_height()),
ha-center', va-bottom',
color= 'black')
ax[ J.set х1аЬе!('Пол’, weight 'semibold', fontname = 'monospace')
, , autotexts- ax[! ].pic(y, labels x, eolors pal. autopct '% 1.1 f%%',
explode [ .0 for i in dataset['sex'].value counts().index])
for autotexi in auiotexts:
autotext.set colorfwhite’)
plt.legend(bbo?< to anchor=(l, 1))
plt.suptitlc (’I Гол’,weight ’bold’)
plt.show()
Пол
# Из представленной диаграммы следует, что выборка (набор данных) является несбалансированной
, так как
# пациенты по половому признаку распределяются 2:1, а не 1:1.
Соответственно, решить задачу будет оптимальнее всего адаптацией стандартного
# полиномиального наивного байесовского алгоритма, который особенно подходит для несбалансиро
ванных наборов данных.
^Копируем набор данных в новый датафрейм, так как его придется модифицировать
data model dataset.сору()
^Поскольку колонка ответов - целевой столбец, то он будет храниться в виде серии
у = data model.popf’Y")
#Набор признаков для обучения будет храниться как датасет (датафрейм данных)
X = data model
#Тип данных целевого признака является серией, в этом легко убедиться, проверив тип данных перем
енной «у»
type(y)
pandas.core. series. Series
#Тип данных датасета набора признаков является датафреймом, в этом легко убедиться, проверив
тип данных переменной «А'»
type(X)
pandas.core.frame.DataFrame
#Для достижения наилучшего результата признаки набора данных должны иметь единичную диепе
рсию
# Эта операция в программной библиотеке sklearn называется стандартизацией и
# может быть выполнена автоматически при помощи метода StandartScalerQ
Х~ StandardScaler().fii transform(X)
Теперь датасет, разделённый на набор признаков (X) и целевой столбец
(у) схематически выглядит следующим образом (рисунок 1):
«•X pr*e»urw_calm СПо1»« iug«rjn_b4ood •1ес_сагсЦо_са|1т max-puke ittnourdio numb«r_vtln m»d_crit Y
70 0 1 0 40 1300 322 0 00 20 109 00 24 20 30 30 2
07 0 00 30 1150 564 0 00 20 1600 ОО 16 20 00 70 1
57 0 1 0 2.0 124 0 2610 00 00 14’ 0 00 03 1 0 00 70 2
64 0 10 40 126 0 263 0 00 00 105 0 1 0 0.2 2.0 1 G 70 1
74 0 00 20 1200 269 0 00 20 1210 1.0 02 10 1 0 30 1
52 0 10 30 172 0 199 0 10 0.0 162 0 00 05 10 00 70 1
44 0 10 20 120 0 263 0 00 09 173 0 00 00 10 00 70 1
560 ОО 20 1400 294 0 0.0 20 1530 0.0 1 3 2.0 00 3.0 1
570 1 0 40 1400 192 0 00 00 1480 0.0 04 2.0 00 60 1
67 0 10 40 1600 2860 00 20 108 0 1 0 15 20 30 3.0 2
X • столбцы признаков V • целевой
столбец
Рисунок 1 - Схематичное представление структуры набора данных
Перед тем, как проводить обучение и тестирование модели классифика-
тора Наивного Байеса, нам необходимо разделить эти данные дополнительным
«горизонтальным разрезом».
«Горизонтальный разрез» позволяет получить такое количество строк
столбца признаков X, которому соответствуют (и по размеру, и по онтологиче-
ской связи) значения вектора ответов признака у.
Выполненная операция позволяет получить четыре сегмента данных (ри-
сунок 2):
• набор тренировочных данных
- X - набор признаков (датафрейм) для тренировки алгоритма -
(оранжевый цвет)
- у - целевой столбец (серия) для тренировки алгоритма - (синий
цвет)
• набор тестовых данных
- X - набор признаков (датафрейм) для тестирования алгоритма -
(желтый цвет)
- у - целевой столбец (серия) для итогового оценивания точности ал-
горитма, путем сопоставления предсказанных значений с данными
значениями (также называются истинными)-(зеленый цвет)
Поскольку набор данных состоит из 270 строк, то будет наиболее пра-
вильным (на основании несбалансированности датасета по критерию полового
признака пациентов) разделить выборку в соотношении 70:30.
Рисунок 2 - Разделение данных на 4 сегмента для обучения
и тестовой проверки модели классификатора Наивного Байеса
# Разделяем набор данных на четыре сегмента в соответствии с описанием предыдущего блока
X train.X test,у train,у test train test split(X.y.train size .random state 2140 )
# Создание модели Наивного Байеса
nbModel GaussianNBQ
# Обучение модели на основе тренировочных данных
nbModel.fit(X train,train)
GaussianNBQ
НДля реализации превентивной проверки точности модели, применяем кросс-валидацию по 7 фолдам
result cross val scoretnbModel.X train.y train.cv )
# Результат валидационной точности модели Наивного Байеса на каждом фолде данных получим из
списка значений
print(result)
# Значение средней валидационной точности (среднее арифметическое)
print( np mean(result))
[0.88888889 0.88888889 0.77777778 0.85185185 0.85185185 0.74074074
0.81481481]
0.8306878306878307
# Прогноз алгоритмом вектора ответов истинных тестовых данных (обозначенных зеленым цвета
м)
# Поскольку в данный момент времени эти данные - прогноз алгоритма, то они будут занесены в о
тдельиый массив
у _pred nbModcl.prcdict(X test)
# Вывод оценки точности функционирования алгоритма на основе сравнения двух массивов:
# у pred (предсказанные алгоритмом) ну 1ех((истинные тестовые значения).
П
# Приемлемой точностью алгоритма является число с п завающей точкой,
# имеющее точность до третьей значимой цифры после запятой.
#
# По причине отсутствия необходимости определять следуюгцие разряды десятичного числа, вып
олним округление
print (’Опенка точности алгоритма Наивного Байеса:')
print (’-----------------------------
print (’ Точность по метрике accuracy:round(accuracy score(y test,y_pred), ))
print (’ Коэффициент Жаккара: ’,round(jaccard scorc(y tcst.y_prcd), ))
print (’ Точность по метрике F1 score:',round(fl score(y test,у .pred), ;))
print (' Точность по метрике Recall: ',round(recall score(y test,y_prcd), ))
print (' Точность по мирике Precision:',round(precision score(y test,y_pred). ))
print ('-----------------------------')
print ('Матрица ошибок: n contusion matrix(y test,y pred))
Оценка точности алгоритма Наивного Байеса:
Точность по метрике accuracy: 0.877
Коэффициент Жаккара: 0.815
Точнотсь ио метрике Fi_score: 0.898
Точность но метрике Recall: 0.936
Точность по метрике Precision: 0.863
Матрица ошибок:
[[44 3]
[7 27]]
По прикладной метрике оценивания точности F|-score, прецизионность
алгоритма Наивного Байеса при решении поставленной задачи достигает зна-
чения 0.898.
Эта величина значительно превышает [ 1 ] негласно установленное между-
народное значение предметно-прикладной точности алгоритма машинного обу-
чения (взятое равным 0.75) для решения исследовательских задач.
Mei од опорных векторов
Метод опорных векторов (SVM - support vector machine) - это представи-
тель алгоритмов машинного обучения с учителем, который помогает решать
задачи классификации или регрессии. Его цель - найти оптимальную гипер-
плоскость, разделяющую набор данных на группы классов.
Для работы потребуется среда разработки Visual Studio.
Для студии должен быть загружен пакет Разработки на языке Python.
Изменение — Vsuai Stuc о Community 2019 — 16,111
Рабочие нагрузки Отдельные компоненты
Беб-разработка и облако (4)
Языковые пакеты Расположения установки
□
ASP NET и разработка веб-приложений
Создание веб-приложений с использованием ASP.NE”
Core. ASP NET HTMl/JavaScnpt и контейнеров включ...
Разработка для Azure
Ракеты SDK Azure средства и проекты для разработки
облачных приложений и создания ресурсов с исполь..
Разработка на Python Q
Редактирование, отладка интерактивная разработка и
система управления версиями для Python.
Разработка Node.js
Создавайте масштабируемою се’евые приложения с
пс мощью Nodejs, асинхронной среды вь "олнения Та...
После установки пакета разработки на Python в меню создания проекта
выбираем «приложение Python».
Создание проекта
Последние шаблоны проектов
х" Приложение Python Python
Bl Проем сервере отчетов
-п Приложение Windows Forms ( NET
Г1 Framework) “
Веб-приложение ASP NET( NET
• ’ Framework)
-- Веб-приложение ASP NET (.NET
Framework) V,UM,Be‘K
мстить все
Все языки ' Все платформ» - Веб
яв*т На основе существующего кода JGE
J Создание нового проекта с помощью файлов кода, которые уже находятся а
иерархии папок
Linux macOS Windows Консоль Веб
Другие результаты на основе вашего поиска
Приложена ЗЕЯ?
*' Проект приложения для командной строки
ТПП? Windows Unux macOS Консоль
Проект классификатора (cookiecutter)
bJ Проект для тестирования классификаторов scikit-learn.
Для этого проекта требуются пакеты pandas, numpy, scikit-learn и matplotlib.
Откроется окно cookiecutter, где можно создать проект из шаблона cookiecutter
в Интернете
ТТчПГ Windows Машинное обучение
рвет Проект кластеризации (cookiecutter)
oJ Проект для тестирования средств обучения кластеризации scikit-learn.
В обозревателе решений будут представлены данные только что открыв-
шегося проекта: файлы, входящие в проект, и окружение Python (виртуальная
среда для работы приложений на питоне).
П Решение PythonApplicationl (проекты: 1 из 1
л F*l PytbonAppikationl
П Окружения Python
Р Python 3.7 (64-bit)
Ссылки
Пути поиска
PV PytbonAppIkationl.py
Для нашего проекта в среду понадобится установить дополнительные
библиотеки. Делается это следующим образом. В контекстном меню «Окруже-
ния Python» выбираем пункт «Открыть пакеты Python».
Окружения Python
Добавить среду...
- ¥ х
Python 3.10 (64-bit)
Python Softvia'e Founder on
Python 3.7 (64 bit)
Python Softwa»* Foundation
Пакеты (PyPI)
| Поиск PyPI и установленных пакетов
Йй astroid (2.9.0) X
atomicwrites (1.4.0) X
Й attrs (21.2.0) X
4- colorama (0.4.4) X
Йй cycler (0.11.0) X
ЙЙ fonttools (4.28.3) X
ЙЙ importlib-metadata (4.8.2) X
X inirnnfin (1.1.1) X
Ci p. i ения Python Обозреватель решений Изменения Git
В открывшемся меню в верхней части мы видим список доступных сред,
в нижней, список установленных пакетов, а также поисковую строку для но-
вых.
Библиотеки необходимые для работы:
Numpy - библиотека, поддерживающая работу с многомерными массивами и
математические операции над ними.
Matplotlib - библиотека для визуализации данных двумерной графикой.
Sklearn - библиотека машинного обучения, поддерживающая множество алго-
ритмов, а также имеющая набор простых датасетов.
Pandas - библиотека для обработки и анализа данных. С её помощью мы будем
осуществлять за1рузку данных.
Для начала нам необходимо подключить загруженные библиотеки к
нашему проекту:
import numpy as np
import pandas as pd
import matplotlib.pxplot as pit -для визуализации на координатой прямой
import matplotlib.lines as mimes #для отрисовки линий
from sklearn,preprocessing import Minh.5,xScaicr #нормализация
from sklearn decomposition import P( \
from sklearn.metrics import accuracy score «для проверки точно после обучения
from sklearn,model selection import train test split 'функция для разделения данных
Так как функция оцХ] + а)2х2 + —F 0)пхп + w0 = 0 равнозначна выра-
жению и)1 х — Ь, где — b можно интерпретировать как о)0*1. Для этого расши-
рим набор свойств объектов, добавив к каждой строке новую колонку со значе-
нием 1.
defw !(.):
x_w I -np.zeros((; .shapc[OJ.a.shape[l]+l))
x_w_l [:,:-!] = a
x_w ![:,-!] = int(l)
return x w 1
Далее мы реализуем наш основной класс SVM Classification, реализую-
щий классификацию данных. В наш класс будут входить следующие методы:
1. Метол инициализации:
dcf_ inn__(self, eta=O.Ol, alpha=0.001, epochs“300):
self.cta gradient descent = eta
elf.alphu regularization = alph
J f.epochs training num = pochs
self.train errors = self.tesl errors = self.train loss “ self.test loss = None
self.v. omega = None
sclf.changehistory = | ]
При вызове класса мы передаём ему следующие параметры:
• Шаг градиентного спуска г|
• Параметр регуляризации данных а
• Число эпох обучения
2. Метод обучения:
def init t self, eta=0.01, alpha==0.00 i, epochs=300):
elf.eta gradient descent = eta
self.alpha regularization = alpha
-ulf.cpochs training num = pochs
ielf.train errors = self.test errors = self.train loss = self.test loss = None
self.w_ omega = None
def train(self, X u lin, Y train, X test, Y u i):
X train = w 1(X train)
X test = w i (X test)
mH f.w_ omega® np.random.normal(0, O.O5, X tra n.shapefl])
train error = []
test error = []
tram loss n = []
test lossn - | J
for epoch in ngc(self.epochs training num):
test Joss - testerr = training loss - training err = 0
fur i,x <n enumerate(X train):
M margin =irain(ij*np.dot( w omega. < 1 iin[i])
ifM margin >= 1:
self.w omega = self.w omega
.eta gradient descent*-,-l!.alpha regularization*self.w omega/sell.epochs training num
training loss += self.loss_function(X tr nn[i],Y train[i])
else:
self.w omega = self.w omega + self.eta gradient descent*(> train[i]*X trainfi]
scl .alpha regularization* clf.w_omcga/ el .epochs training num)
training err += I
training loss += sclfloss function(X train[i],Y trainfi])
for i,x in cnumerate(X test):
test loss+= elf.loss function(X test(i], X testfi])
test err += (X test[i]*np.dot(self.w omcga.X tcst[i])<l ).astype(mt)
train errorappend(training err)
test error.append(test err)
tram loss n.appcnd(training loss)
test loss n.appcnd(test loss)
sclftrain errors = np.arrayUraincrror)
self.tcst crrors = np.arrayftcst error)
self-train loss = np.array(train loss n)
>cIftestloss = np.array(test lossn)
defloss function(sclf, , y):
return max(0,1 - *np.dot(x, selt.w omega)) + self,alpha regularization*np.dot(selfw omega, elf.w omega)
def tested i, Xmp.array) -> np.array:
y_pred = LI
X extended = w 1 (X)
fori in .и (len(X extended)):
y_pred.append(np.sign(np.dot(s lt.w_ omega,X extended!i])))
return np.array(y_pred)
Инициализируем данные, применяем нашу функцию w 1() к переменным
X train и X test, переменную w omega (веса) задаём с помощью нормального
распределения.
На каждой эпохе обучения происходит высчитывание зазора по формуле
у * (а>тх — Ь) для каждой пары элементов X Y в выборке. В случаях, когда зна-
чение зазора больше или равно 1, объект был классифицирован верно и мы мо-
жем уменьшить веса, если алгоритм меньше 1, объект классифицирован с
ошибкой и веса нужно увеличить. Для изменения весов мы используем гради-
ентный спуск.
Также мы записываем количество ошибок и значение функции потерь на
каждой эпохе.
3. Метод, реализующий функцию потерь:
defloss ftiction( elf, х, у):
return max(0,l - х *np.dot(\, '.w omega)) + .'h.alpha regularization * np.dot( :lf.w_omega, self.w omega)
Представляет собой функцию потерь Q = max(0,l — ya/x) + tr(o)/a))/2.
4. Метод предсказывания на основе тестовых данных:
def test(self, .Vnp.array) -> np.array:
y_pred = []
х w 1 = w_l(X)
for i m rang (len(x w 1)):
y_prcd.uppend(np.sign( np.dot( >elf.w_umega.x _ I [i])))
return np.array(y _pred)
Стараемся предсказать к какому классу относится объект из тестовой вы-
борки используя значения весов, полученных по окончанию обучения.
Помимо основного класса напишем метод для отрисовки линий, чтобы
лучше визуализировать результаты работы нашего алгоритма:
def drawline(pointl, р in color=None):
ах = plt.gca()
х min. x max =. x.get_xhound()
у max = pointl[l] + (x_max-pointl[0])/(p int2[O]-p' inti[0]) * (poin ’[l]-pointl|[l])
у min = pointl[l] + (x_min-i ointlfO])Z(point2[0]-pointl[0]) * (point2[l]- ointl[l])
1 = mlines.Linc2I)([x min,x_max], [y min,y_ max], coloi-color)
ax. add line(l)
return 1
Метод get_xbound() возвращает нам верхнюю и нижнюю границы оси X,
которые мы можем подставить в уравнение прямой, где мы используя значения
точек опорных векторов, находим значения соответствующих Y. Это нужно для
того, чтобы линии прокладывались вдоль всей координатной линии.
Теперь, когда мы подготовили основные инструменты для работы алго-
ритма. мы можем заняться испытанием нашего приложения.
Для этого нам нужны тестовые наборы данных - датасеты (dataset).
В поиске датасетов может помочь сервис Google Dataset Search.
Ссылка на сервис: https://datasetsearch.research.google.com/
Первым датасетом, который мы рассмотрим, будет Glaucoma diagnosis,
дата сет, специально разработанный для машинного обучения в области диа-
гностирования глаукомы.
Ссылка в сервисе: https://datasetsearch.rsearch.google.com/search?query= di-
agnosis%20prediction&docid~L2c\ MTFyZ2drZHM2Nw%3D%3D
Ссылка на сайт: https://zenodo.Org/record/4957619#.YbsopGhByM8
Из файлов, находящихся в архиве, мы будем использовать dswhole.csv,
так как нам не нужно два отдельных файла с тренировочными и тестовыми
данными. Для того чтобы просмотреть .csv, можно воспользоваться экселем.
Для этого в файле экселя нужно выбрать вкладку Данные -> Из текстово-
ro/CSV-файла (может отличаться от версии).
Файл Главная Встаька Разметка страницы Формулы Данные
6 Получить данные * A Eq И1 TeKCToeoro/CSV-файла С© Последние источники L Из. Интернета Существующие подключения ГП Из таблицы/диапазона Получить и преобразовать данные В С D Е | F | G Н р. П: Обновить все * Запрос 1
1 RL Qgl 1 ▼ age D jocular pressure Щ MD Q PSD Q GUT Q corneathickness Q RNFL4.mean Q
2 OD 0 62 17-0.54 1.81 0 558 103.3333333
3 OS 0 62 17 -0.64 1.38 0 564 107.6666667
4 OD 0 66 12 -1.65 2.89 2 490 162
5 OS 0 66 12 -1.14 3.88 2 495 99
6 OD 1 53 24 -2.9 3.78 2 547 74.66666667
7 OS 1 53 24 -8.04 12.83 2 535 62.66666667
8 OD 1 53 24 -3.89 4.12 2 547 62
9 OS 1 53 24 -8.39 11.58 2 535 56.33333333
10 OD 1 53 24 -3.61 3.69 2 547 62.33333333
11 OS 1 53 24 -7.91 12.76 2 535 54.33333333
12 OD 0 81 13 -6.8 3.98 2 483 101.6666667
13 14 OS 1 81 28 -30.23 2.97 2 481 52.6б6б6667
OD 0 55 15 -0.08 2.06 0 580 114
fl од] отовка данных
Одним из минусов метода опорных векторов является необходимость в
большинстве случаев вручную подготавливать данные перед их обработкой.
Трудозатраты могут заметно отличаться в зависимости от содержимою. В
нашем случае содержание не требует больших приготовлений и с определен-
ным успехом может быть использовано даже в необработанном, «сыром» виде.
# Глаукома
data = pd.read _csv('./ds whole.csv')
X = data.iloc[:, 1:]
Y = data.loc|:, 'glaucoma']
Производим загрузку данных файла, предварительно поместив сам файл в
одну папку с исполнительным .ру файлом нашего приложения.
Далее из полученного файла выгрузим данные используя методы iloc и
1ос.
Метод iloc позволяет нам загрузить данные в приделах заданных индек-
сов. В нашел случае мы заполняем в переменную X (свойства объектов) значе-
ния всех строк начиная со строки с индексом 1 и далее.
Метод 1ос загружает данные по названию. С помощью этого метода мы
назначим переменной Y (классы объектов), все значения по столбцу glaucoma.
Преобразование данных
pea = РСА(2)
X = pca.fit transform(X.values)
Y = Y *2-1
Па данном этапе мы делаем минимум преобразований.
Во-первых, так как от количества свойств объекта зависит размерность
пространства, через которую проводится гиперплоскость, используя алгоритм
РСА мы уменьшаем количество измерений до двух, чтобы, более наглядно по-
казать работу алгоритма проведя линию разделения в двумерной плоскости.
Во-вторых, мы производим небольшую математическую операцию, так
как svm принимает значение классов -1 и 1, мы преобразуем классы источника
данных, изначально равные 0 и 1.
Далее мы используем функцию train_test_split чтобы разделить наши дан-
ные на 1ренировочную и тестовые выборки
X train. X test, Y train, Y test = train test split(X, Y.values, test size=0.4, random state=1234);
I Параметр test_size отвечает за процент данных, отводимых для тестиро-
вания. Соответственно в нашем примеры мы отводим 70 процентов данных на
обучение и 30 на тестирование.
svm = SVM ( .-•Mik tn i(eta=0.01, alpha-0.001, epochs=200)
svm.train(X train, Y tram, X test, Y test)
Вызываем наш класс ио необходимости подбирая оптимальные парамет-
ры и инициализируем тренировочную функцию.
dots - {-l:'blue‘, k’red'}
plt.scatter(X_train[:,O], X_train[:,l), c=[dots[}] for \ in Y rrain])
drawl inc([0.-s\ tn.w_oincga|2]/svm.\v_omcga[ 1 ]],[-svm.w_omcga[2]/svm.w_omega[0],0], 'yellow')
drawline([O,l/svm.w omega[l]-svm.w omega[2]/svm.w omega[lj],[ 1/svm.womega[0]-
svm.w omega[2]/svm.w omega[0],0])
drawlinc( [0,-1/svm. w_omega| 1 )-svm.w_omega|2]/svm.w omega| 1 |J,(-l/svm.w_omcga|0J-
svm.w omega[2]/svm.w omega[0],0])
plt.show()
Результатами обучения мы выводим количество ошибок на каждой эпохе
обучения и финальное значение весов.
print(svm.train errors)
print(s\ m.womcga)
Ila координатной прямой выводим график значений функции потери для
тренировочных и тестовых значений.
pll.gndO
plt.ploi(svm.train loss, linewidth-2, label "'Обучающая потеря')
plt.plot(svm,test_loss, linewidth=2,1аЬе1=г'Тестовая потеря')
ph.lcgend(prop= {'size': 20})
plt.show()
Расставляем на координатной прямой точки пренировочных классов и
проводим разделительную линию и опорные векторы используя наш метод для
отрисовки линий.
dots - {-] :*blue", l;'red’}
plt.scatter(X train[:,0], X train[:, 1 ], c="[dots[y] for in Y train])
drawline([O,-svm.w pmega[2]/$vm.w pmega[l]J,[-svm.w omega[2]/sv m.w omega[0],0], •yellow')
drawline([0,1 /svm.w omega[ I ]-svm.w _omega[2]/svm.w omega[ 1 ]],[ 1 /svm.w omegafO]-
svm.w omega]2]/svm.w_ omega(0],0])
drawline([O,-l/svm.w omegafl ]-svm.w omega[2]/svm.w omega[l ]],[-!/svm.w omega|0]-
svm.w omega[2]/svm.w omega[0],0])
plt.showQ
После завершение обучения мы предсказываем к какому классу относит-
ся объект из тестовой выборки. Инициализируем метод test и передадим ему
набор свойств тестовой выборки. После отработки методы мы получаем пред-
полагаемы! i набор классов и сравниваем его со списком классов тестовой вы-
борки. Не совпадающие значения заменяются классом 2, отмечая, что этот
класс был выбран ошибочно.
у pred = svm.test(X test)
у _pred|y_pred ’= Y test] = 2
printf Количество ошибок для тестовой выборки:', (y_pred — 2).astypc( ).sum())
Выводим точки предсказанной выборки (включая ошибки) на координат-
ную прямую и проводим линию разделения и опорные векторы.
dots err= {-k'blue’, l:'red', 2:'black'}
pll.scatter(X_test[:,O], X_test[:,l], c=[dots_err[j ] for у in y_pred])
drawlinc(]O,-s\m.w_pmcga[2]/svm.w_omcga[ 1 ]].[-svm.w omega[2Psvm.w_omega[0],0], 'yellow')
drawline([O,l/svm.w omega[l]-svm.w pmega[2]/svm.w pmega[!]],[!/svm.w omega[(J]-
svm.w_omega[2]/svm.w_omega(0],0])
drawlinc([0,-l/svm.w_omcga[ 1 J-svm.w _omega[2]/svm.w_omcga[ 1 |],[-l/svm.w_omega|0]-
svm.w omcga[2]/svm.w omcga[0],0])
plt.showO
Используем функцию accuracy score для вывода точности нашей выбор-
ки.
рппЦ'Точность предсказанной выборки: |}".format(accuracy score(Y test, y_pred)))
Пример работы
Количество ошибок и весы обучения:
[87 87 83 80
71 65 65 65
64 61 58 65
53 58 55 59
50 62 55 63
54 63 55 58
57 65 55 65
55 60 57 55
57 57 62 54
[ 0.52219061
74 76 68 78 76 69 72 73 76 69 75
65 68 65 65 65 68 63 72 72 67 68
59 58 58 59 55 58 63 62 55 59 60
62 64 63 55 59 57 60 54 52 58 67
55 52 58 57 61 57 55 54 64 54 55
55 62 65 68 57 62 65 68 57 60 65
52 54 55 59 59 57 54 64 52 67 53
69 51 61 68 55 55 59 57 54 64 57
64 54 54 57]
-0.56976166 8.34910988]
69 68 67 65 71 62 76 71 71
74 74 61 59 65 62 63 67 58
62 64 65 62 55 59 62 64 59
62 54 64 54 54 55 59 62 64
60 54 55 59 54 61 55 56 57
53 54 64 54 54 55 59 62 64
59 62 64 59 62 64 57 67 54
60 54 55 63 55 52 58 57 61
График функции потери:
График линии разделения обучающих данных:
Ошибки предсказания:
Соличество ошибок для тестовой выборки: 19
График линии разделения предсказанной выборки:
Итоговая точность предсказания:
Точность предсказанной выборки: 0.8733333333333333
Стоит отметить, что уменьшение числа измерений и соответственно ко-
личества свойств объекта негативно сказывается на одной из сильных сторон
метода опорных векторов, а именно, высокой точности при большем количе-
стве свойств и соответственно снижает точность и скорость обучения.
Временно вернём оригинальное количество свойств и проведем новую
серию обучения.
#Х - pca.fit transform! X. values)
Y = Y * 2-1
X train, X test, Y train, Y test = train test_split! X.values, Y.values, tcst_sizc-O,3, random state=1234)
Из-за увеличения числа свойств увеличивается и число измерений, из-за
чего мы не можем графически отобразить послроение опорных векторов, по-
этому результаты представлены в следующем виде.
[121 115 93 91 83 79 73 69 74 77 83 81 83 79 79 77 69 69
67 67 69 57 61 70 59 66 65 55 57 62 65 55 60 65 55 60
51 60 51 58 53 60 51 58 51 58 47 58 47 58 51 60 51 58
51 58 51 58 49 62 51 58 47 59 59 59 59 59 57 58 47 59
59 59 59 59 59 59 59 59 55 59 59 59 59 59 57 59 57 57
59 59 57 55 57 55 55 55 55 55 57 55 57 55 57 55 55 55
57 55 57 55 55 55 57 55 57 53 57 53 55 57 53 53 53 53
56 49 51 53 51 53 54 49 49 53 53 55 51 53 54 49 51 53
53 53 51 55 51 57 53 53 53 53 53 51 53 53 53 55 51 53
55 51 53 51 55 53 53 53 51 51 57 53 51 51 53 53 51 51
[ 53 51 58. 51 55 53] ,3172246 49 35 S3 51 .16239296 51 51 53 51 । 143.63003819 - 53 51 51 94.77919238 53 104. 51 51 22121822 53 51
27.52584142 4.76194461 -90.50372928 1.81584401]
Количество ошибок для тестовой выборки: 15
Точность предсказанной выборки: 0.9
Как можно заметить, при тех же параметрах обучения точность повыси-
лась, также как и увеличилась скорость обучения. Но по!решность в расчетах
всё еще велика.
Проблема заключается в самих данных, как уже говорилась ранее, для
лучшей работы метода опорных векторов, данные датасетов необходимо обра-
батывать.
Одним из методов обработки является нормализация (normalization).
Нормализация - это процесс преобразования диапазона значений в стандарт-
ный диапазон значений, обычно в интервале [-1, 1] или [0, 1]. Подобное преоб-
разование улучшает скорость и качество обучения и предотвращает числовое
переполнение.
Доработает наше преобразование данных используя класс MinMaxScaler()
для преобразования наших свойств. По умолчанию преобразовывает в значения
от 0 до I.
X п гт diz = \ if • Sea r().fit_ transform(X.values)
X = pd.DataFramc(X ormal cd)
pea = PC A(2)
X = pea.fit transform(X.values)
Y = Y’2-I
Приведем еще одно обучение.
Ошибки обучения и финальное значение весов:
[265 82 55 26 8 4 2 1 2 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0]
[-1.75902252 1.52011528 0.32986491]
График функции потерь:
График линии разделения обучающих данных:
Ошибки предсказания:
количество ошибок для тестовой выборки:0
График линии разделения предсказанной выборки:
Итоговая точность предсказания:
очность предсказанной выборки: 1.0
Данные результаты еще раз показывают важность обработки данных, за-
вершив обучение за 10 эпох и увеличив точность предсказания для тестовых
данных до 100 процентов.
Рассмотрим еще один дата сет, Diabetes Prediction, набор данных реаль-
ных пациентов для предсказания диагноза сахарного диабета.
Ссылка в сервисе: https://datasetsearch.research.googlc.com/scarch7query
=prcdiction&docid=L2cvMTFqOWJwdDNqZw%3D%3D&fiItcrs=WyJbXCJmaWxl
X2Zvcm 1 hdF9jbGFzc 1 wiLFtcIjFcIl 1 dI10%3D
Ссылка на сайт: https://data.world/informaiics-cdwdiabetes-prcdiction
Нужная нам таблица данных хранится в формате эксель файла
Diabetes_Classitication.xlsx. Для работы с данными нам необходимо преобразо-
вать файл в .csv формат.
Для данного примера файл был конвертирован на сайте:
https://www.zamzar.com/ru/convert/xls-to-csv/ предварительно удалив из него
лишние листы.
F G H 1 J К L M N 0 P
kge Q Gender Q Height Q Weight Q BMI Q Systolic BP El Diastolic BP Q waist Q hip Q Waist/hip ratio Q Diabetes Д
19 female 61 119 22.5 118 70 32 38 0.84 No diabetes
19 female 60 135 26.4 108 58 33 40 0.83 No diabetes
20 female 67 187 29.3 110 72 40 45 0.89 No diabetes
20 female 64 114 19.6 122 64 31 39 0.79 Nc diabetes
20 female 70 141 20.2 122 86 32 39 0.82 No diabetes
20 female 64 161 27.6 108 70 37 40 0.93 No diabetes
20 female 62 115 21 105 82 31 37 0.84 No diabetes
20 male 72 145 19.7 108 78 29 36 0.81 No diabetes
20 male 67 159 24.9 ICO 90 31 39 0.79 No diabetes
20 female 58 170 35.5 140 100 34 46 0.74 No diabetes
20 male 70 187 26.8 132 86 37 41 0.9 No diabetes
В данном файле содержаться две текстовые колонки, имеющие высокую
важность для обучения нашей системы. Свойство Gender и значение Diabetes
определяющее класс.
Для корректной работы эти данные нужно преобразовать в вид понятный
для алгоритма. Для этого при работе с данными мы используем функцию Мар()
для замены данных.
Gender map = {'femaIc':0, ’male': 1}
Diagnos map = {'No diabetes’:-!, 'Diabetes’: 1)
data|’Diabetes’] = data['Diabctes'].map( Diagnos map)
data[’Gcndcr] = data['Gcndcr’].map(Gcndcr map)
Соозветственно, значения столбца Diabetes No diabetes и Diabetes заменя-
ем на значения классов -1 и 1.
По аналогии заменяем значения столбца Gender.
Полный код подготовки данных:
# Сахарный диабет
data = pd.read csv('?Diabetes Classification.csv')
Gender map = {'female'^, 'male':!}
Diagnos map = {'No diabetes’:-1, 'Diabetes': 1 {
datafDiabetes’] = data['Diabetes’].map([)iagnos map)
data['Gender'] = data['Gender'].map(Gcndcr map)
X = data.iloc[:, !:]
Y = data.loc(:, 'Diabetes']
pea = 14 k(n_ componcnts=2)
\ и -rr iz< = Mir 1axS ().fit_transform(X. values)
X = pd.DataFramc(Xnormalizcd)
X = pca.fittransformiX.values)
X tram, X test. Y train. Y test = train test_split(X, Y.values, test_size=0.3, random state-1234)
Количество ошибок и весы обучения:
[257
0
1
0
0
0
0
0
0
0
0
0
81
0
0
0
0
0
0
0
0
0
0
0]
61
0
0
0
0
0
0
0
0
0
0
32
0
0
0
0
0
0
0
0
0
0
12
0
0
0
0
0
0
0
0
0
0
4
0
0
0
0
0
0
0
0
0
0
3
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
*
0
0
*
0
0
0
0
0
0
[-1.76792061
1.51430145
0.33811591]
График функции потери:
График линии разделения обучающих данных:
1.25
1.00
О 75
0 50
025
3 00
0.25
О 50
-0.6 -0.4 -0 2 0.0 0.2 0.4 0.6
оличество ошибок для тестовой выборки: 1
График линии разделения предсказанной выборки:
Итоговая точность предсказания:
Точность предсказанной выборки: 0.9914529914529915
Еще раз покажем положительное влияние числа свойств объектов на ка-
чество обучения.
[132 93 90 88 69 24 14 9 5 4 5 3 2 2 1 2 2 2
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0]
[-0.1 Э8531421 о.: 21956551 -0., 2504766 0.1 Э29657 0.05109286 -0.1 30581869
-0.: 35109535 0.1 Э5851363 -0.1 35736867 0.1 34842738 -0.0930843 -0.1 31835344
-0.07075513 -0.10496285 2.31569907 -0.87015894]
<оличество ошибок для тестовой выборки: 0
Гочность предсказанной выборки: 1.0
Обратим внимание на то, что число свойств данного датасета в два раза
больше предыдущего, из-за чего разница в качестве обучения выявляется еще
сильнее.
Последним примером мы рассмотрим датасет, содержащий в себе три
класса.
Датасет 3_class_ building.csv содержит в себе данные о продажах недви-
жимости в Нью-Йорке, разделенный на семейных домой первого, второго и
третьего класса.
Ссылка в сервисе: hltps://datasetsearch.research.google.com-'search?q uery-
=3%20cIass&docid=L2cvMTFqbnlxODE5OA%3D%3D&filters=WyJbXCJmaWxlX
2ZvcmlhdF9jbGFzclwiLFtcIjFcIixc)jdcIlldllO%3D&property^ZrnlsZV9mb3JtYXR
fY2xhc3M%3D
Ссылка на сайт: https://data.cityofnewyork.us/dataset/DOF-Sumrnary-of-
Neighborhood-Sales-Citywide-Class-l/6rf2-gv9k
Пример данных
А В C D E F G H
|Х»нД BUILDING CLASS CATEGORY Д NUMBER Of SALES Д MINIMUM SALE PRICE Д AVERAGE SALE PRICE Д MEDIAN SALE PRICE P MAXIMUM SALE PRICE И YEAR Д
ittan 01 ONE FAMILY HOMES 95 150000 658’094 5175000 24065000 2010
ittan 02 TWO FAMILY HOMES 68 235248 4621092 2925000 44000000 2010
ittan 03 THREE FAMILY HOMES 37 526050 2673224 1634291 6987500 2010
01 ONE FAMILY HOMES 565 150000 407253 253OMI 4150000 2010
0? TWO FAMILY HOMES 762 150000 402029 402679 1200000 2010
03 THREE FAMILY HOMES 289 150000 448584 460000 999990 2010
yn 01 ONE FAMILY HOMES 1544 150000 620904 495000 710О0С)Г' 2010
Lyn 02 TWO FAMILY HOMES 2672 150000 605930 526000 15344118 2010
lyn 03THREE FAMILY HOMES 926 150000 654037 569115 5666375 2010
и 01 ONE FAMILY HOMES 4663 150000 462265 4190QO 280OOUI' 2010
02 TwO FAMILY HOMES 3240 150000 472522 45OTCO 1660000 2010
IS 03 THREE FAMILY HOMES 619 165000 626736 626223 1400000 2010
.Island 01 ONE FAMILY HOMES 2111 150000 423258 J9039A 3150000 2010
i Island 02 TWO FAMILY HOMES 808 150000 475054 465720 1275000 2010
i Island 03 THREE FAMILY HOMES 22 178000 365660 3M4SO aSOOOO 2010
de 01 ONE FAMILY HOMES 8978 150000 541722 415000 240650И 2010
de 0? TWO FAMILY HOMES 7550 150000 550257 468000 440000fif. 2010
de 03 THREE FAMILY HOMES 1893 150000 649859 565000 6987500 2010
ittan 01 ONE FAMILY HOMES 71 450000 7094131 4600000 48000000 2011
ittan 02 TWO FAMILY HOMES 68 173101 3588645 гттгчю 14500000 2011
Для обработки мы также применим функцию Мар() и нормализацию.
# Классы домов
data = pd.rcad csv(’./3 class building.csv’)
class map = foi ONE FAMILY HOMES’iO, ’02 TWO FAMILY HOMES':!. ’03 THREE FAMILY HOMES':?}
data['BUILDJNG CLASS CATEGORY'] = data['BUILDING CLASS CATEGORY'].map(class_map)
X = data.ilocf:, 1:]
Y = data.iocf:, 'BUILDING CLASS CATEGORY']
pea = 14 \(n components=2)
Xnormalizcd = MinMaxScalcr().fit_transfomi(X.values)
X = pd.DataFramc(X normalized)
Y = (Y > 1)*2-1
X = pca.fit transform(X.valucs)
X tram. X test, Y train, Y test = train test splittX, Y.values, test size=03, random state=!234)
Плавным отличием данного датасета является наличие фёх классов объ-
ектов. В своей простои версии SVM может работать только с двумя классами.
Для того чтобы обработать наборы данных с большим числом классов необхо-
димо перевести решение из мультиклассового обратно в бинарное (двуклассо-
вое), решение. Для этого используются два метода, «1 к 1» и «1 ко многим».
При методе 1 к I каждый отдельные SVM обучаются разделять каждый
класс относительного другого.
При методе 1 к остальным, SVM учится разделять класс от остальных
объединённых в один новый класс.
В данном примере мы рассмотрим, как поведет себя система в случае
объединения классов в группы. За это отвечает выражение Y = (Y > 1 )*2-1. Мы
изменяем значения Y в соответствие с результатом логического выражения.
Классы 0 и 1 не удовлетворяют выражению и получают значение O(false), класс
2 соответственно, значение 1 (true). Данные значения умножают на два и вычи-
тают единицу, 0*2-1 = -1 и 1*2-1 = 1 соответственно. Теперь объединив объек-
ты первого и второго класса в группу, попробуем провести обучение.
Ошибки обучения и финальное значение весов:
[126 111 84 82 81 79 79 79 79 78 77 72 66 65 63 60 59 58
55 52 48 46 41 38 36 34 31 29 28 27 26 25 26 24 23 22
21 21 21 21 21 21 20 20 21 20 18 19 19 19 18 19 18 17
17 15 15 15 15 15 15 15 15 15 15 13 14 13 12 12 12 13
12 12 11 11 10 8 8 9 8 8 8 8 8 8 8 9 7 4
4 4 4 4 4 5 4 4 4 4 4 4 4 4 4 4 4 4
4 4 5 4 4 4 4 4 4 4 4 4 3 4 4 4 3 4
4 4 3 4 4 4 3 4 4 4 3 4 4 4 3 4 4 4
3 4 4 4 4 3 4 4 4 3 2 2 2 2 4 4 3 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0]
[-6.03352364 1.98197536 -1.71188166]
1 рафик функции потерь:
Ошибки предсказания:
Количество ошибок для тестовой выборки: 0
График линии разделения предсказанной выборки:
Ценность предсказанной выборки: 1.0
Теперь повторим обучение, но объединив класс I и 2 в группу. Заменим
Y = (Y > 0)*2-1 и повторим тестирование.
Ошибки обучения и финальное значение весов:
126 111 88 85 85 85 85 84 83 77 69 63 61 60 60 60 60 57
58 56 56 55 54 51 49 49 46 44 38 36 34 31 27 27 27 26
27 26 25 25 25 25 24 24 23 23 23 22 22 23 22 22 21 21
21 20 20 19 19 18 17 17 18 17 17 18 17 17 18 17 17 18
17 17 18 17 17 18 17 17 18 17 17 18 17 17 18 17 17 18
17 17 18 17 17 18 17 17 18 17 16 16 15 16 15 16 15 16
15 16 15 16 15 16 15 16 15 16 16 15 15 16 15 16 15 16
15 16 15 16 15 16 15 15 16 15 16 15 16 15 16 15 16 15
15 16 15 16 15 16 15 16 15 16 15 16 15 15 16 15 16 15
16 15 16 15 16 15 16 15 15 16 15 16 15 16 15 16 15 16
15 15 16 15 16 15 16 15 16 15 16 15 16 15 15 16 15 16
15 16]
2.0115542 ]
[-6.67880821
2.67724657
График линии разделения обучающих данных:
Ошибки предсказания:
Количество ошибок для тестовой выборки: 0
График линии разделения предсказанной выборки:
Итоговая точность предсказания
Точность предсказанной выборки: 1.0
Как мы видим, наш класс успешно справился с разделением трёх классо-
вых данных, приведенных к бинарному виду.
Алгоритм кластеризации на основе плотности
Практическая реализация алгоритма кластеризации на основе мето-
да DBSCAN
Практическая (прикладная) задача: Люди неохотно берут вина с низким
показателем рейтинга, наша задача доказать обратное, проанализировав дан-
ные.
Рассмотренная база: https://www.kaggle.com/budnyak/wine-rating-and-price
1. Скачиваем с сайта данные о винах (red,rose,sparkling,white) список фай-
лов на рисунке 1
Red.csv (719.88 кВ)
ШЕ Red.csv
ПШ Rose.csv
ШИ Sparkling.csv
ЛО Varieties csv
ПШ White.csv
Рисунок I - Данные о винах
2. Разработка алгоритма.
Для работы потребуются библиотеки matplotlib numpy и pandas. Matplotlib-
библиотека для визуализации данных двумерной графикой. Pandas - библиотека
для обработки и анализа данных. Numpy - библиотека для работы с массивами
(рис. 2).
inport numpy as np
inpcrt pandas as pd
i port matplotlib.pyplot as pit
Рисунок 2 - Подключаемые библиотеки
Формировать датасет будем поочередно, соответственно для каждого
файла рассмотрим на примере подключения фала White.csv.
Вытягивать будем город и количество оценок (рис. 3).
dataset = pd.read_csv( с Ite. . )
x = dataset.iloc[:, [1, 5]].values
Рисунок 3 - Формирование датасета
Для того чтобы передать сформировать матрицу на вход алгоритму
должны подаваться координаты (х.у). Так как для анализа нам нужен строко-
вый параметр (город и регион), необходимы преобразования.
Сформируем ассоциативную матрицу (рис. 4).
Для формирования ассоциативного массива регионов понадобится до-
полнительный алгоритм, который пробегается по странам и, если страна при-
сутствует в ассоциативном массиве, формирует массив из регионов для данного
города, далее убираются дубли регионов. Строится ассоциативный массив для
регионов динамически (рис. 4).
country = {}
country[’Italy*] = 1
country[ Austria ] = 2
countryf France1] = 3
country[‘New Zealand'] = 4
country! Chile*] = 5
country['Australia'] = 6
countryf'South Africa'] = 7
countryf'Spain'] = 8
countryf United States'] = 9
country['Portugal ] = 10
country[ Hungary ] = 11
countryf'South Africa'] = 12
country['Germany ] = 13
countryf’Luxembourg'] = 14
countryf’Romania'] = 15
country[ Slovenia ] = 16
country['Argentina'] = 17
country[ Brazil*] = 18
countryf’Switzerland'] = 19
country[ Croatia ] = 20
countryf'China'] = 21
countryf'Greece'] - 22
country['Israel'] = 23
country['Turkey1] = 24
countryf Georgia ] = 25
countryf'Czech Republic'] = 26
country['Slovakia'] = 27
countryf'Canada'] = 28
country[’Lebanon ] = 29
countryf Holdova ] = 30
country['Uruguay ] = 31
countryf'Canada1] = 32
country["Mexico*] = 33
countryf Bulgaria’] = 34
countryf'United Kingdom'] = 35
Рисунок 4 - Ассоциативный массив Стран
mass = {}
я string input val
for ctry in country:
newData = [testll] for test in x if (testlc] == ctry)]
new = [newDatali] for i in range(len(newData)) if i == newData.index(newData[i])]
counter = C
for val in new:
i = 0
masslval] = country(ctry] * 10 + counter / 10
counter += 1
x[:, 1] = [mass[test[l]] for test in x]
Рисунок 5 - Алгоритм динамического формирования
ассоциативного массива для регионов
Число для региона формируется по принципу число города * 10 + счетчик
региона/10. на выходе, например, будет для Italy у которого числовое значение
1, для его регионов числовой коэффициент будет 10,1 10,2 10,3 и т. д.
В итоге работы алгоритма получаем (рис. 5).
Python Console
[['Italy' 10.0 25]
['Italy' 10.1 25]
['Austria' 20.0 25]
['New Zealand' 40.0 5105]
['New Zealand' 40.0 5817]
['Portugal' 100.2 62980]]
Рисунок 6 - Вывод данных
Соответственно город, код региона, и количество отзывов.
С помощью цикла выполним замену названия страны на цифр из ассоци-
ативного массива (рис. 7).
fl string input val
х = np.array(x)
x[:, 0] = [country[test[0]] for test in x]
it
Рисунок 7 - Код, выполняющий замену названия на цифры
Присвоим название колонкам F и S (рис. 8).
X.principal = pd.DataFrame({ : х[: 0] : х[:, 1]})
Рисунок 8 - Назначение названий колонок
Строим модель кластеризации алгоритмом dbscan предварительно под-
ключив нужную библиотеку (рис. 9).
db default.labels получение кластерных меток, где, -1 это шумные образ-
цы.
f sklearn.cluster г DBSCAN
db.default = DBSCAN( =35, =4).fit(X_principal)
labels = db.default.labels^
Рисунок 9 - Вызов алгоритма dbscan
Создание меток для соответствующего цвета (рис. 10)
colours = {}
colours[0] =
colourstl] =
colours[2] =
colours[-l] =
Рисунок 10 - Создание массива цветов
Построение цветового вектора для каждой точки данных (рис. 11)
cvec = [coloursflabel] to label labels]
Рисунок 11 - Формирование вектора
Строим легенду (рис. 12).
г = pit.scatter(X_principal[ F ],
g = pit.scatter(X_principal[ P ],
b = pit.scatter(X_principal[ F ],
у = pit.scatter(X_principal[ ]
X_principal[ 5 ], = );
X.principalt's ]. = g');
X.principalt ], = b‘);
X.principalt ]_______= );
Рисунок 12 - Легенда
Для удобства отображения выполним обратное преобразование числа го-
рода в его название. Для этого импортируем модуль для кастомизации графи-
ков (рис. 13).
ах = pit .subplotsO
matplotlib.ticker lap i FuncFormatter
Рисунок 13 - Подключение модуля ticker
С помощью цикла построим обратное соотношение цифры к названию
(рис. 14).
xs = {country[ent]: ent ftW ent :n country}
Рисунок 14 - Код
И затем передадим данные через специальный метод подключенного мо-
дуля, в параметр, которому передадим функцию, которая и выполнит подмену
(рис. 15).
И зададим деление в 1 единицу.
ах.xaxis.set_major_formatter(FuncFormatter(my_formatter))
ax.xaxis.set_major_locator(ticker.MultipleLocator(l))
Рисунок 15 - Код, меняющий код на название
Также названия городов развернем на 70 %, дабы избежать наложения
названий друг на друга (рис. 16).
plt.setp(ax.get_xticklabels(), т =70, = t )
pit.legend((r, g, b y), ('Label 01, "Label 1*, laoel 2', "Label -1 ))
pit.scatter(X_principal[ F'J X_principal[ S'], =cvec)
plt.axis([O, 35 0, 2000])
pit.show()_______________________________________________________________
Рисунок 16 - Код, отвечающий за отображение
Отображение F по оси X и S по оси Y, в соответствии с заданным цвето-
вым вектором.
3. Анализ.
Для белого вина:
1. По городу (рис. 17).
db.default = DBSCANC =35 =4).fit(X_principal)
Рисунок 17 - Диаграмма
2. По региону (рис. 18).
db.default = DBSCAN( =45, =4).fit(X.principal)
Рисунок 18 - Диаграмма
Рисунок 19 - Диаграмма
4. 1 io году (рис. 20).
db.default = DBSCAN( =5C =4).fit(X.principal)
2000 -r
1750 -
1500
1250
1000
750
500
250
2000 2010 2020
Рисунок 20 - Диаграмма
Label о
Label 1
label 2
Label -1
4
2030 2040 2050
db.default = DBSCAN( =180. =6).fit(X.principal)
Рисунок 21 - Диаграмма
2. По региону (рис. 22).
db.default = OBSCANC =180. =0).fit(X.principal)
Рисунок 22 - Диаграмма
Рисунок 23 - Диаграмма
4. По i oду (рис. 24).
db-default = DBSCAN( =250 =4).fit(X_principal)
Рисунок 24 - Диаграмма
1. По городу (рис. 25).
Рисунок 25 - Диаграмма
2. По региону (рис. 26).
db.default = DBSCAN( =20, =6).fit(X principal)
2000
1750
1500
1250
1000
750
500
250
О
й
• Label о
• Label 1
• label 2
Label 1
Рисунок 26 - Диа! рам ма
db.default = DBSCANC =30
4).fit(X_principaU
Рисунок 27 - Диаграмма
4. По году (рис. 28).
db_default = DBSCAN( =30
=4). fit(X_principaU
Рисунок 28 - Диаграмма
1b_default = DBSCAN( =140 =4).fit(X.principal)
Рисунок 29 - Диаграмма
2. По региону (рис. 30).
db.default = DBSCAN( =140.. =4) .fit(X.principal)
Рисунок 30 - Диаграмма
4. По году (рис. 32).
db_default = DBSCAN( =250 =6).fit(X_principal)
Рисунок 32 - Диаграмма
Проанализируем данные для красного вина, рассмотрим кластер под
названием label 0 (красного цвета), выберем наиболее оцениваемый вариант.
20000
Рисунок 33 - Диаграмма
Из графика (рис. 33) видно, что его значение около 4800 количества оце-
нок, сделаем дополнительный график, по рейтингу и городу (рис. 34).
Рисунок 34 - Диаграмма
Итальянское вино Barolo Riserva Monfortino имеет высокую оценку в 4.8,
в то время как вино Marche Rosso имеет оценку много ниже 2.5, однако это не
делает вино плохим, так как исходные данные у вин одинаковые. Люди, ориен-
тируясь на рейтинг не хотят брать вине) с низким рейтингом, мы же можем удо-
стоверится в том. что вина популярны, были произведены в одном городе, од-
ного региона, и что данные низко оцененные вина также являются хорошими,
да еще и дешевле, о чем говорит график по ценам (рис. 35):
10000
• Label 0
• Label 1
Рисунок 35 - Диаграмма
Вывод: вина, которые низко оценены, не являются плохими, к тому же
цена на такие вина ниже. Л характер производства одинаков. Детальный анализ
показал, что данный вывод прослеживается для каждого из типов вин.
Исходный код представлен на рисунках 36-37.
Ц-Гру Пр
!№ ' Р»ПОО$ Л» Pd
atplotllb.pyplor as pit
н oatplotUb.ticKer aS ticker
dateset » pd. reao.csvf -ted.csv )
• dateset..Hoc(: (1, «]).values
country » О
country)'ital> ] • 1
country) Austria’) = 2
country)’France*] • 3
country) Men Feala ] » 4
country penile’) • 5
country) «vstralit ) * о
country) South Africa ] « 7
country)•Spain*) * 8
country) 'United States ) • 9
country) ’ortugal') le
country)'h-igery ) « 11
country) iout'i Afrit ) « 12
count ryi'Gern».., ) « 13
country) i n >ourg') » 1*
country) Hon.iniA ) • IS
country)'Slo.nnio') • 10
country) Arp. Hint ) • 17
country) trazil J • 18
country) Switzerland*| io
country)'Croatia ) 20
country) roina'J 21
country) Greece') « 22
country) Israel 1 • 23
country)'turkey') • 20
country) Georgia I • Z5
country) Czech Republic*I 26
country) Slovakia’) 27
country) Ca- ) • 28
country) лич'| i 29
country) . j ) • 30
country) juay ) • 31
country)'Canada') • 32
country) neuc ) » 33
country) . jaria ) * 3*
country) Inite; King; eft*) • 35
< • np array(x)
«):, ) • [country)test) )] 4r test In x)
(.principal pa.DataFraaet) x[:. ?J «): ц||
Рисунок 36 - Код программы 1
sklearn.cluster и DBSCAN
bb.default = DBSCAN( =28, =4).flt(x_principal)
labels = db^default.labels.
colours = {}
colourstO] = r'
coloursfl] =
colours[2] =
colours[-l] = 'y'
cvec = [coloursllabel] for label in labels]
r = pit.scatter(x.principalt'F ], x.principall S']» = r');
g = pit.scatter(X.principall'F ], X_principal[ S'], = g ')£
b = pit.scatter(X_principal[' F ], X_principal[ S ], = ,} U
у = pit.scatter(X_principal['F ] X.principall S'], = y‘);
pit.figured, =(7.5, 7.5), =1OC)
p string input val
fig, ax = pit.subplotsO
from matplotlib.ticker import FuncFormatter
xs = {countrylcnt]: ent for ent in country}
aef my_formatter(x pc ):
return xs.getlx, “•..Of' % x)
ax.xaxis.get„major^formatter(F
ax.xaxis.set_major_locator(ticker.NultipleLocator(1))
pit.setp(ax.get.xticklabels(), =60, ='right )
plt.legend((r, g, b, y), ('Label O', 'Label 1', 'Label 2', L -s-e-l -1'))
pit.scatter(X_principal[’F ], x.principall'S ], =cvec)
plt.axis([0, 40 0, 5])
Рисунок 37 - Код программы 2
Гене!ические алтори i мы
Реализуем ГА для задачи ОпеМах. Проблематика вопроса состоит в поис-
ке решения, которое дает максимальную сумму цифр списка. А список - это
одна из составляющих популяции. Популяция состоит из списков, содержащих
нули и единицы.
Наша цель - найти решение, которое бы давало максимальную сумму
цифр этого списка:
Л’-1
fitness = \individ\f\
Здесь N - длина списка. Очевидно, лучший, наиболее приспособленный
индивид, должен состоять из всех единиц:
bestind:
1
Этот лучший вариант и есть решение данной задачи. В рамках задачи
ОпеМах мы воспользуемся идеей турнирного отбора с выборкой из трех пре-
тендентов па каждой итерации.
Будем использовать одноточечное скрещивание (одноточечный кроссин-
говер).
А при мутации будем выполнять инвертирование бита с некоторой очень
небольшой вероятностью.
Реализация задачи ОпеМах на Python
Первоначально подключим необходимые библиотеки и зададим глобаль-
ные константы для работы реализуемого генетического алгоритма:
matplotlib.pyplot random pit
константы задачи
ONE MAX_LENGTH = 100 # длина подлежащее ш ilMiMlL-kultiil Ситовой строки
Констан I ы L lHl'111'^CuhAj; й ii lupin Ui
POPULATION SIZE = 200 ы < i,l чи ринвнл^. Mufi
P CROSSOVER = 0.9 гирпч i h\ 11. ^Epeni|iiuji|ii>
P MUTATION = 0.1 k|-.;HiiikiL!i.
MAX GENERATIONS = 50 максима,--ч , iш..........................
Далее, зафиксируем счетчик псевдослучайных чисел, так, чтобы он выда-
вал одну и ту же реализацию случайных значений:
RANDOM SEED =42
ranJom.seedi RAN DOM SEED)
Для представления каждого индивидуума в популяции, мы объявим класс
с именем Individual, который будет наследоваться от базового класса list (это
класс для представления списков в Python). То есть, хромосома особи будет
представлена обычным списком и содержать целые числа 0 или 1:
FitnessMaxQ:
(self):
.values = [0]
»s Individual(list):
( . *args):
super(). {‘args)
.fitness = FitnessMaxO
В конструкторе этого класса мы вызовем конструктор базового класса и
дополнительно определим локальное свойство fitness, через которое мы будем
получать значение приспособленности данного индивидуума. Для этого допол-
нительно объявлен вспомогательный класс FitnessMax и при создании экзем-
пляра этого класса в нем появляется свойство values, которое и определяет сте-
пень приспособленности особи. В самом начале мы инициализируем эту вели-
чину равной нулю.
Далее, определим функцию принадлежности, которая будет вычислять
приспособленность отдельной особи:
oncMaxFitncssf individual):
_______шт( individual) кир.. ,
И еще две функции для создания отдельного индивидуума и всей популя-
ции:
i individualCreatorf):
. :am Individual([random.randint(0. 1) for i in range(ONE_MAX_LENGTH)])
f populationCreatorfn = 0):
I-.-ihini list([individualCreator() i; rangefn)])____________________________
После этого создаем начальную популяцию и определяем счетчик поко-
лений:
population = populationCrcator( -POPULATION SIZE)
generationCounter = 0
Вычисляем текущие значения приспособленности для каждой особи в
начальной популяции и сохраняем эти значения в свойстве values каждого ин-
дивидуума:
fitness Values = list(map(oneMaxFitness population))
»r individual fitnessValue n zipfpopulation fitnessValues):
indiv idual.fitncss. values = fitnessValue
Затем, определяем вспомогательные списки для хранения лучшей и сред-
ней приспособленности в каждом текущем поколении:
maxFitncssValues = (]
meanFitnessValues = []
Далее, нам понадобятся функции для клонирования индивида, выполне-
ния турнирного отбора, одноточечного скрещивания и мутации:
; clonefvalue):
ind - Individual(value[:])
ind.fitness.valuesfO] = value.fitness.values[O]
letum ind
selToumamenttpopulation p len):
offspring = ||
i n in range(p len):
i I = i2 - i3 = О
* nile i 1 = i2 or i J = i3 oi i2 = i3:
il i2 i3 = random.randint(0 p len-1) random.randint(0. p len-l) random.randint(O p len-1)
offspring.appendfmaxQpopulationJil] population! 12], population[i3]] =lambda ind: ind.fitness.valueslU]))
eium offspring
) cxOnePoint( child! child2):
s = random.randint(2. len(child 1 )-3)
childlfs:] child2[s:] = child2(s:] childl[s:]
ч mutFhpBit( mutant. indpb=0.01):
I or indx in range(len(mutant)):
if random.random!) < indpb:
_____ mutantfindx] = 0 if mutantrindx] = 1 ,Ki 1
Перед главным циклом ГЛ мы вычислим список значений приспособлен-
ностей для всех хромосом в популяции:
II, затем, в условиях цикла пропишем либо достижение максимальной
приспособленности, либо достижение максимального числа поколений:
max(fitnessValues) < ONEMAX LENGTH generationcounter < MAX GENERATIONS:
general ionCounter += 1
offspring - selTournament(population len(population))
offspring = list(map(clone4 offspring))
orchildl child2 in zip(offspring[::2] offspring! 1 ::2]):
г random.random() < P CROSSOVER:
cxOnePoint(childl, child2)
= ^r mutant in offspring:
random.random() < P MUTATION:
muiFlipBitf mutant = 1.0/ONE_MAX LENGTH)
freshFitness Values = list(map(oneMaxFimess offspring))
or individual fitnessValue in zipfoffspring freshFitnessValues):
individual.fitness. values = fitnessValue
population^] = offspring
fitnessValues = [ind.fitness.values[0] for ind n population]
maxFitness = max( fitnessValues)
meanFitness = sum(fitness Values) / len(population)
maxFitnessValues.append(maxFitness)
ineanFitnessValues.append(meanFitness)
print(f 'Поколение {generationcounter}: Макс приспособ. = {maxFitness}, Cpe.iHM гари способ.- {meanFit-
ness] ")
best index = fitnessValues.index(max( fitnessValues))
printf__________________._______*population[bcst index]. ')_______________________________________________
Непосредственно в цикле мы увеличиваем счетчик популяции, выполня-
ем турнирный отбор для выбора родителей. После того, как оператор отбора
выполнен, необходимо создать копии выбранных особей, так как некоторые
могут быть отобраны дважды и, фактически, получим две разные ссылки на
один и тот же список. Это нарушит логику работы ГА. Поэтому, необходимо
выполнить клонирование данных.
Далее, последовательно выбираем четные и нечетные особи в качестве
родителей и с вероятностью Р CROSSOVER выполняем операцию одноточеч-
ного скрещивания. То же самое и для мутации. Перебираем особей в формиру-
емой популяции и с вероятностью 1’ MUTATION подвергаем хромосому слу-
чайному изменению. При этом, дополнительно определяем вероятность indpb
для инвертирования конкретного бита (гена) в хромосоме.
После этого пересчитываем приспособленности особей, обновляем свой-
ство values, список популяции population и список fitnessValues.
В конце цикла выбираем максимальное и среднее значения приспособ-
ленности в текущей популяции, добавляем их в списки maxFitnessVahies и
meanFitnessValues и выводим текущую информацию в консоль.
После цикла отображаем графики изменения максимальной и средней
ириспособленностей для каждого поколения:
plt.plot(maxFitncssValucs = )
plt.pluunieanFimessValues -green)
plt.xlabel(fnoKOicHne')
plt.y 1аЬе1('Макс/средняя при . к-, кность')
plt.title( 3. нар । ея')
plt.showQ___________________________________________________________________________
Таким образом, мы создали простой ГА для решения задачи ОпеМах. По-
сле запуска программы отобразится следующий результат:
X Figure 1 -ОХ
Зависимость максимальной и средней приспособленности от поколения
А также вывод в консоли:
Run: ф turgenev_ga
Поколение 33: Макс приспособ. = 100, Средняя приспособь 97.59
Лучший индивидуум = 11111111111111111111111
►, Run := TODO О Problems И Terminal
Python Packages Ф Python Console
Таким образом, программная реализация генетического алгоритма ио
имитации процесса эволюции позволила получить наиболее приспособленную
особь, состоящую из всех единиц. Другими словами, генетический алгоритм
нашел решение поставленной и сформулированной для него задачи.
Задача для самостоятельного выполнения
Изучить DEAP - пакет для создания генетических алгоритмов, и решить с
помощью него задачу ОпеМах. Варианты для самостоятельного решения мож-
но взять из списка приведенных вариантов.
Кош рольные вопросы
1. Определение генетического алгоритма (ГА).
2. Что такое DEAP-пакет, для чего он используется?
3. Перечислите последовательность действий ГА.
4. Что такое отбор?
5. Что такое скрещивание?
6. Что такое мутация?
Алгоритм ансамблирования бэггинг
Бэггинг (агрегирование начальной загрузки) - это широко используемый
обучающий алгоритм в машинном обучении. Алгоритм строит несколько моде-
лей из случайно выбранных подмножеств набора данных train.
Классификация данных с помощью класса BaggingClassifier библиотеки skleam
в Python включает в себя:
• Подготовка данных.
• Обучение классификатора бэггинг.
• Прогнозирование данных испытаний и проверка точности.
• Проверка точности путем изменения базовой оценки.
Загрузка необходимых библиотек:
main.py *
1
2
3
4
5
6
7
8
9
10
import pandas as pd
import numpy as np
from sklearn.preprccessing import LabelEncoder
from sklearn.metrics import confusicn_matrix
from sklearn.model-Selectior import train_test_split
from sklearn.ersemble import SaggingClassifier
fnom sklearn.tree import DecisionTreeClassifie»'
from sklearn.nai\e_bayes import GaussianfJB, BernoulliBB
from sklearn.linear_model import LogisticRegression
Под! о 1 о в к а дан них
Генерация набора данных по функции:
main.ру *
10
11 def CreateDGtapra'ne(Ai):
12 columns = [‘a’/b’/c'/y’]
13 df = pd.Data=rarre(columns=colo'nns)
14 for i in range(N):
IS a = np.random.randirt(10)
16 b = np.nandom.nandint(20)
17 c = np.''ardom. randint(S)
18 у = "normal"
19 if((a+b+c)>25):
29 y»"high"
21 elif((a+b+c)<12):
22 y= "low"
23
24 df.loc[i]= [a, b, c, y]
25 return df
26
27
28 df - CreateDataFrame^ec)
29 df.head()
w
Необходимо разделять х-функции и у-выходные части. Проверим сгенери-
рованную матрицу:
Э Console Shell
а b с у
0 8 5 1 normal
1 10 0 low
2 10 0 low
3 4 8 3 normal
4 6 2 4 normal
195 6 12 4 no i ma 1
196 5 7 4 normal
197 1 18 4 noimal
198 5 8 4 normal
199 6 3 0 low
[200 rows X 4 columns]
1
Y - является категориальным типом данных, необходимо провести коди-
рование с помощью функции LabelEncoder():
main.py х
-« l l z J J
33
34 le=LabelEncoder()
y=le .f it-trans^or-iCY)
36
Далее необходимо создать поезд и протестировать его с помощью функ-
ции train-test_split:
main.py *
36
Xtrain., Xtestj ytrain^ ytest = train_test_split(XJ y, randcm_state=e)
38
A » • *-* •• *> 1 r • t •« • H » W 4
Обучение классификатора бэггинг
Далее необходимо использовать BaggingClassifier ИЗ пакета 'skleam.ensemble' ДЛЯ
построения модели классификатора бэггинг.
Используя класс DecisionTreeClassifier в качестве базовой оценки, можно взять
значение 100 и провести обучение модели с помощью данных о поездах:
main.py *
39 arc = DecisionTreeClassifier(cF4iterion="entropy”)
40 bag_model=BaggingClassifier(base_estimatcr=dtc, n_estimators=100, bootstrapsrue)
41 bag_model-bag_model.fit(Xtrain,ytrain)
На данном этапе необходимо проверить точность прогнозирования:
main.py *
42 ytest_pred=bag_itodel.predict(Xtest)
43 print(bag_model.sccre(Xtest, ytest))
44 print(confusion_matrix(ytest_, ytest_pred))
45
0.88
[[ i e И
( 0 16 3]
[ 2 0 27]]
> □
Точность предсказания составила 8Х %.
Проверка 1очное!и путем изменении базовой опенки
Использование и проверка точности прогнозирования методов логистиче-
ской регрессии Гаусса, Бернулли и классификатора дерева решений:
45
46 ]г LogisticRegression();
47 bnb BernoulliflBO
48 gnb GaussianNBQ
49
se
51
52
53
54
55
56
57
base_raethocs-[lr, bnb, gnb, dtc]
for b«i in basejnethods:
print("Method: ", bm)
bag_Tiodel-BaggingClassifier(base_estimator»b«n, n_estimators-106, bootstrap-true)
bag_fflocel-bag_irodel.fit(Xtrain,ytrain)
ytest_pred«bag_irodel.predict(Xtest)
prirt(bag_4iodel. score(Xtest, ytest))
print(confusionjnatrix(ytest, ytest_pred))
Метод логистической регрессии:
main.py *
45
46
47
48
49
58
51
52
53
54
55
56
57
>] LogisticRegressionQ;
bnb - Bernoulli*^)
gnb - GaussianUB()
basejnetnocs^lrj bno, gnb, cite]
for b« in base_iaethocs:
print("Method: ”, ba)
bag^eiodel-SaggingClassi*ier(oase_esti»ator-Dn>, n^estinators-100, bootstrap-true)
bag_«ooel«bag-’nodel.fit(Xtrain,ytrain)
ytest_pred»bag_raodel.predict(Xtest)
print(bag_«odel .sco^xtest, ytest))
print(confusion_»iatrix(ytest, ytest_prea)) |
Method: I,ogisticRegrfcssion(C=1.0,class_weight=None.dual-False4ti1 iniercept=True,
intercept_scaling=l, max iter-100. multi vlass='ovr’, njobs=l,
penalty-12', random state=None, solver=’liblincar’, tol=0.0001,
verbose=0.warm start=False)
I проверка:
Method: LogisticRegression()
0.96
[[ 1 0 2]
[ 0 19 0]
[ 0 0 28]]
Метод Гаусса:
45
46
47
48
49
50
51
52
S3
54
55
56
57
lr = LcgisticRegression();
bnb BernoulliflBu
gnb GaussianNB()
base_methoas«[lr, Dnb,| gnb,| dtc]
for bm in base_r"etnods:
print("Method: ", bm)
bag_rrodel-BaggingClassifier(base_estimator»bm, n_estimarors-100, boocstrap-True)
bag_model=bag_model.fit(Xcrain,ytrain)
ytest_prea=bag_r,!oclel. predict (Xtest)
print(bag_model.score(xtest, ytest))
print(confusionjnatrix(ytest, ytest_pred)) |
Method: GaussianNB(priors=Nune)
Проверка:
Method: GaussianNBQ
0.88
[[ 1 0 2]
[ 0 16 3]
[ 0 1 27]]
Метод Бернулли:
mam.py *
45
46
47
48
49
50
51
52
53
54
55
56
57
lr LogisticRegression();
[bnb • BernoulliMSQ ]
gnb GaussiantjB()
base_methoas*[lr,| bnb,| gnb, dtc]
for bm in base_methods:
print("Method; ", bm}
bag_rrodel»EaggingClassifier(base_estimator«bm, n_estimators-100, bootstrap»True)
bag_model«bag_model.fit(Xtrair,уtrain)
уtest_pred»bag_rodel.predict(Xtest)
print(bag_'nooel .sccre(Xtest, ytest))
print(confusionjnatnix(ytest, yrest_pred)) |
Method: BernoulliNB(alpha=-1.0, binarize=0.0, class_prior-None. fit_prior= 1 rue)
Method: BernoulliNB()
0.58
[[ 6 0 3]
[0 1 18]
[ 0 0 28]]
Метод классификатора дерева решений:
main.py *
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, random_state=0)
dtc - DecisionTreeClassifief'(critef'ion="ent',opy")
Dag_model=Eaggi ngClassifierf sase_esti"iator=-c!tc, n_estimat9rs=b' I, bootstfap=True)
bagjtiodel-bag_model.fit(xtrain,ytrain)
ytest_pred=bag_model.predict(Xtest)
print(bag_model.score(xtest, ytest))
prirt(confusiorjnatrix(ytest, ytest_pred))
Ir - LogisticRegression();
bnb = BernoulliNB()
gnb GaussianhB()
Dase_methods=[lr, bnb, gnb, |dtc]|
for bm in base_methods:
print("Method: ", bm)
bag_'noael-BaggingClassifier(base_estimator-bm, n_estimators«10(, bootst^ap-True)
bag_model=bag_model.fit(Xtrain,ytrain)
ytest_pred»bag_model.oredict(Xtest)
print(bagjnodel.score(xtest, ytest))
print(confusion_ratrix(ytest, ytest_pred}) |
Method: Decision I reeClassifier(class_weight=\one.criterion=’entropy’.max depth=None,
max_features=None, max_leaf_nodes=None,
min_impurity_decrease=O.O, min_impurity_split=None,
min samples lcaf=l. min samples_split=2,
inin «eight traction leaf=0.0, presort=False, random state=None,
splitter-'best')
Проверка:
Method: Decision!reeClassifier(criterion='entropy')
0.86
[[ 1 0 2]
[ 0 15 4]
[01 27]]
Листинг кода
na*n.py * 3
1 import рапаas as pd
2 import numpy as np
3 -from sklearn.preprocessing import LabelEncoder
4 from sklearn.metrics import confusion_matrix
5 from sklearn.’lodelselectio'’ import trainjtest split
6 from sklearn.ensemble import Saggingclassifier
7 from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB, BernoulliNB
9 from sklearn.linear_riodel import LogisticRegression
10
11 def Createbataframe(^):
12 columns » ['a',’b','c','y']
13 df pd.OataFra're(coljF’irs->columns)
14 for i in range(N):
15 a np.random.randint(lf)
16 b = np.random.randint(20)
17 c np.random.ranoint(S)
18 у « "normal''
19 if ((a+b*cp25):
29 y-"hign"
21 elif((a+b+c)<12):
22 y- "low"
23
24 df.loc[i]- [a, b, c, y]
25 return df
26
27 df = CreateDataPrame(20e)
28 df.heac()
29 print(df)
30
31 X - df[["a","b","c”]]
32 Y - df[["y"][0]]
33
34 le-=LabelEncoder()
35 y-le.fit_transform(Y)
36
37 Xtrain, Xtest, ytrain, ytest train_test_split(X, y, random_state»-&)
38
39 dtc - DecisionTreeClassifier(criterion»"entropy”)
40 Dag_moael=EaggingClassifier(Dase_estimator=dtc> n_estimators=i' , bootstrap=True)
41 bag_model-bag_model.fit(Xt rain,ytrain)
42 ytest_pred-bag_model.predict(Xtest)
43 print(bag_model.score(Xtest, ytest))
44 print(confusion matrixfytest, ytest pred))
45
46 lr = LcgisticRegression();
47 bnb - BernoulliMBf)
48 gnb - GaussianNB()
49
50 Dase_methods»[lr, bnb, gnb, dtc]
51 for brr in base_metnods :
52 print("Method: ", Dm)
bag_model^BaggingClassifier(base_estimator=bni, n_estimators=l*i?, bootstrap=True)
54 bag_model*bag_model.fit(Xtrain,ytrain)
55 ytest_predTbag_n-odel .predict(Xtest)
56 prirt(bag_model.score(Xtest, ytest))
57 print(confusion_matrix(ytest, ytest_pred))
Результат:
Replit: Updating package configuration
--> pythonJ m poetry install
Installing dependencies from lock file
Package operations: b installs, 3 updates, 6 renewals
• Updating nirrpy (1.21.2 -> 1.21.4)
- Updating joblib (1.6.1 -> 1.1.6)
• Updating scipy (1.4.1 -> 1.6.1)
• Installing threadpoolctl (3.6.6)
• Installing pytz (2621.3)
• Installing scikit-learn (1.6.1)
• Installing pandas (1.3.4)
• Installing sklearn (6.6)
I
Console Shell
a b c У
e 5 1 2 low
1 8 8 3 normal
2 9 16 2 normal
3 6 7 6 normal
4 Л 8 4 normal
19b 6 8 2 low
1% 7 3 3 normal
197 6 18 2 normal
198 6 15 4 normal
199 8 6 2 normal
[200 rows x 4 columns]
0.88
[[ 1 6 2]
f « 16 3]
[ e 1 27]]
Method: LogisticRegression()
0.96
[[ 1 6 2]
Г e 19 el
[ e 6 28]]
Method: BeinoulliNB()
6.58
Il « 6 3]
[ e 1 18]
[ e 6 28]]
Method: GaussianNB()
0.88
U 1 e 2]
[ « 16 3]
[ e 1 27]]
Method: DecisionTzeeClassifier(criterion-'entropy')
0.86
[[ 1 0 2]
[ e 15 4]
1 6 1 27]]
i 1
Заключение
В работе предложен метод ансамблирования обучающихся алгорит-
мов, являющийся модификацией алгоритма стекинга. Поставлены экспери-
менты на реальных данных, показавшие, что предложенный алгоритм в
большинстве случаев превосходит предложенные ранее аналогичные алго-
ритмы.
Предложенный алгоритм обладает следующими преимуществами:
• осуществляется борьба с «неоднородностью» метапризнаков;
• происходит эффективное использование обучающей выборки.
Алгоритм ансамблирования стекинг
Реализуем модель стекинга в среде Jupyter Notebook.
Классификация данных с помощью модели стекинга включает в себя:
1. Подготовку и проверку данных.
2. Обучение классификатора stackling.
3. Прогнозирование данных испытаний и проверка точности.
2.1. Подготовка данных
Загрузка необходимых библиотек (рис. 1).
import pandas as pd
import numpy as rp
from sklearn.linea^jTodel import LinearRegression
from sklearn.metrics import r2_sccre
from sklearn.model_selection import GridSearchCV
import matplotlib.pyplot as pit
import seaborn as srs
sns.set(font_scale=1.5)
import warnings
warnings.filterwarnings("ignore")
%matplotlib inline
Рисунок 1 - За1рузка библиотек
Возьмем набор данных с ресурса «Datasetsearch» от Google. Данные отобра-
жают эффективность вмешательства пожарно-спасательных служб в инцидент.
Эти данные каждый год собирает Главное управление гражданской безопасности
и кризисного управления от пожарно-спасательных служб. В датасете зарегистри-
рованы такие важные критерии, как количество произошедших инцидентов, коли-
чество спасенных людей из них, количество жертв, департамент службы, техноло-
гические риски, дорожно-транспортные происшествия, регион, категория инци-
дента и другие. Все столбцы формируют проблематику набора, но проблема, кото-
рую демонстрирует собой этот набор данных, посвящена разделению зарегистри-
рованных внештатных ситуаций но категориям. Очень часто перерабатывать такие
наборы вручную становится крайне сложно и тяжело, поэтому использовать алго-
ритм машинного обучения стало бы значительным успехом при решении задач
подобного рода. В качестве целевого столбца возьмем категорию инцидента, а
признаками будут столбцы «количество произошедших инцидентов», «количество
спасенных людей», «количество жертв», «департамент службы», «технологиче-
ские риски», «дорожно-транспортные происшествия», «регион», «категория инци-
дента» и другие (рис. 2).
dava pd.read_csv(’inter\₽m;ion52PlH.csv', sep-"; , encoding • "IS0*8859'l“)
data
Annee Zone Region Numeio Departement Catdgone Incenoies Secours a vHrtime Aides a personnes Secours a personne Accidents de circulation Risques technologiques Protection des biens Divers 0
0 20’0 Sud PACA BMPM Boucnes-du- Rn6re Na\ 7540 680'8 Ю542 *8563 6462 ’952 3274 8426
1 20'0 ne-de- Fiance "le-ce- France BSPP P® r Nas 17620 333828 23852 354680 22919 4’47 9’29 63055
2 20Ю Sud-est Rhone- Apes 1 Ain 20 2372 21505 1197 22702 2510 468 831 1428
3 20-C ’•o'd Psca'die 2 Aisne 20 3060 26984 3058 30942 2305 543 ’363 2074
4 20’0 Suo-esr Auvergne 3 Allier 30 1575 154*0 1853 17263 1935 272 832 1186
93 20’0 iie-de- Fia<K4 le-oe- Rance 95 vanO-ise 10 6326 64730 5338 70068 4686 *682 3977 9819
94 20’0 AntIMM Guadeloupe 971 Guadeloupe 30 1928 25596 149 25745 3593 124 310 758
95 20’0 apt nes Man-mque 972 Martinique 3o 1702 23297 10 2330’ 2593 132 324 266
96 20’0 Guyana Guyana 973 Guyana 40 1441 8907 68 8975 1913 29 215 3093
97 2010 ocean indien Reunion 974 Reunion 20 6981 26725 152 26877 4342 122 1912 6068
98 rows x 16 columns
Рисунок 2 - Набор данных
Проверим датасет на наличие пропусков. Заменим пропущенные значения
на среднее значение столбца (рис. 3).
: data[ Catdgorie'] = data[’Cat£gorie' ].replace(np.ran, np.irean(t*ata[ 'Categorie' ]))
data.isnull().count()
: Arnee 98
Zone 98
Region 98
Num£ro 98
Departement 98
Cat£gorie 98
Incendies 98
Secours a victirre 98
Aides a personnes 98
Secours a personne 98
Accidents de circulation 98
Risques technoicgiques 98
Protection des biens 98
Divers 98
Operations diverses 98
Total interventions 98
dtype: intM
Рисунок 3 - Наличие пропусков
Так как в нашей выборке присутствуют колонки с текстовыми значениями,
такие как «Зона», «Регион», «Департамент» для того, чтобы их можно было ис-
пользовать в модели, закодируем признаки с помощью One-hot кодирования. То
есть превратим их в числа, не потеряв их смысла. В библиотеке Pandas One-hot
кодирование выполняется функцией pd.get dummies. В переменную «X» сохраним
закодированный датасет, а в переменную «X origin» - оригинальный (рис. 4).
: X - pd.get_dummies(data.iloc[:.1:])
. x.bead()
Cateaone Incendies Secours a viCtiirte Aides a personnes Swouis a per sonne Accidents H ceculauon RiSques (echnologiques Protection des biens Divers Operations diverse» " Departement. Tarn. tt-Garonne Departement.Terntoi de Ball
2 20 2372 2’505 1197 22’02 25’0 468 831 1428 2259 0
3 20 iW> 26984 JC58 ДО 42 2305 543 1363 2074 3437 ... 0
4 3 0 1575 15410 '853 17203 ’935 272 832 1’86 20’8 ... 0
5 50 ’69 ’996 20 8016 Ю87 96 240 1667 190? 0
6 50 687 5783 300 6083 731 766 394 542 936 0
5 rows > 239 columns
Рисунок 4 - One-hot кодирование
В переменную «у» сохраним целевой столбец, (рис. 6).
у = data['Total interventions']
Рисунок 5 - Целевой столбец
Для того, чтобы улучшить качество моделей мы отнормируем данные с по-
мощью стандартной нормировки. То есть приведем данные к общей шкале (к од-
ному диапазону от -1 до 1, среднее значение - 0). библиотеке sklearn существует
класс StandardScalerQ для этой цели (рис. 6).
from sklearn.preprocessing import StandarcScaler
scales = Starda^dScalerO
X = scaler,fit_transform(X)
Рисунок 6 - Нормировка данных
Разделим выборку на обучающую и тестовую (рис. 7).
from sklearn.mooel_selection import train_test_split
Xjtrainj, Xjtest, y_train, y_test = train_test_split(X, y.values,
train_size=0.S,
rardoiT_state=0)
Рисунок 7 - Разделение выборки
2.2. Обучение классификатора stacking
Прежде чем создать модель стекинга, нужно подобрать для нее несколько
раболающих простых моделей машинного обучения. За основу возьмем три раз-
ные модели; линейную регрессию, метод опорных векторов и XGBoost. Напишем
функцию (рис. 8) для подбора лучших параметров каждой модели - для этой
функции используем GridSearchCV. В качестве меры точности возьмем r2-scorc.
Разобьем данные на 5 фолдов.
def GridSearchParamsfHodelj param_name):
CVjnodel GridSearchCV(estimator-nodel,
param_grid=param_name,
cv-S,
scorings‘r2*,
n_joos = -1,
verbose-10)
CVjnodel.fit(X_train, y_train)
print(f'Лучшее качество модели {model}: {round(CVjnodel.best_score_,4)}')
print(f'Лучшие параметры модели {rrodel}: {CV mooel.best_pararcs_}')
return Cv_rrodel.best_score_, CV_moCel.best_params_, CVjnodel
from sklearn.metrics import r2_score
def test(model):
y_test_predacted = mocel.predict(X_test)
test_score r2_score(y_test, y_test_predicted)
print(f"Качеств: на тестовой выборке - {round(test_score,4)}')
return testscore
Рисунок 8 - GridSearchCV
Зададим параметры, которые мы будем отбирать для каждой из моделей и
запустим GridSearchCV. (рис. 9, рис. 10, рис. 11).
Linear Regression
model = LinearRegression()
paranr_narie = {'n_jobs' : [1,5, 10]}
Ir = GridSearchParams(mcdel, param_narre)
lr_test = test(lr[-l])
Fitting 5 folcs for each cf 3 candidates, totalling 15 fits
Лучшее качество модели LinearRegression(): 0.8709
Лучшие параметры модели LinearReg^ession(): {’n_jobs': 1}
Качество на тестовой вьборке - 0.9693
Support Vector Regressor
from sklearn.svm import SVR
pararr_nane = {’C: [50,130,150],
'kernel' : ['linear', 'poly', ' rbf' ]
}
model = SVR()
sv = GridSearchParams(mcdel, pa^am_name)
sv_test = test(sv[-l])
citting 5 folds for each of 9 candidates, totalling 45 fits
Лучшее качество модели SVR(): 0.7996
Лучшие параметры модели SVR(): {'С: 153, 'kerrel': 'linear'}
Качество на тестовой выборке - 0.8868
Рисунок 10 - Модель опорных векторов
Pitting 5 folds for each of 16 candidates, totalling 88 fits
Лучшее качество модели XGBRegressor(Dase_score-hone, buoster-uore, callbacks-hone,
colsample_bylevel-hore, colsan?ple_bynode-hone,
colsample_bytree-None, early_stopping_rounds-None,
eraDle_categcricai»False, eval_metric-None, gairma-ljone,
gpu_id-hone, grow_pci2icy-4one, importance_type-llone,
inte^actlon-Constraints-None, learning_rate-hone, max_bin-None,
max_cat_to_onebot-hore, max_delta_step-flore, nDax_deptb-Nore,
max_leaves-hone, min_child_weight-hone, missing-nan,
monotone_constraints-Hone, n_estimato',s-10e, n_jobs-nore,
nurt_oarallel_tree-Nore, predictor-hone, randorr_state-None,
reg_alpha»None, reg^larroda-none, ...): 0.8571
Лучшие параметры модели XG8Regressor(base_score-‘Jo*’e, booster-Nore, calloacks-Mone,
colsample_bylevel-Lone, colsanrple_bynode-hone,
colsample_bytree-None, early_stopping_rourds-Nore,
erable_categorical-False, eval_,necric.-4one, gairma-hone,
gpu_id-None, grov»_policy-rione, importance_type-None,
irtenaction_con$traints-Hone, learning_rate-None, max_bin-None,
max_cat_tc_onehot-hone, max_delta_step-tlore, max_deptn-hore,
nax_leaves-hone, min_child_weigrt-None, missing-nan,
nonotcne_constraints-hone, n_estimato’'s-100, n_jops-fiore,
nurr_parallel_tree-i<one, predictor-hone, ranoorr_state-None,
reg_alpha-Uone, reg_lan>Dda-hone, ...): {’max_depth': 7, 'n_estimators': 103}
Качество на тестовой вь-борке - 8.9953
Рисунок 11 - Модель XGBoost
Лучшее качество на тестовой выборке показала модель XGBoost (рис. 12).
data - {‘XGBoost':[rf( ], rf^test], linear Regression’:[IrJ »J, latest],'Support Vector Regression':fsv[ J,sv_testJ}
df - pd.DataFrame.fro»_dict(oata)
df.index - ['train', 'test'J
df.round(3)
XGBoost Linear Regression Support vector Regression
train 0 857 0.871 0 800
test 0 995 0.969 0 887
Создадим модель стекинга на основе трёх предыдущих моделей с лучшими
подобранными параметрами, Напишем функцию для предсказания классов и веро-
ятностей классов (рис. 13).
Steking
: fro-n sklearn.mooel_selectlon import cross_val_predict
from tqdm.noteoook import tqdm
: def compute_meta_feature(model, X_tnain, X_test, y_train, cv):
try:
train_anshers - cross_val„predict(model, X_train, y_train, cv=cv, method*’predict_pnoba')[:, 1]
model.fit(X_train, y_train)
return trair_ansv.ers, model.predict_proba(X_test)[:, 1]
except Exception:
trair_ansv.ers - cross_val_predict(model, X_train, y_train, cv-cv, method-'predict')
model.fit(X_train, y_train)
return train_arsv.ers, model.predict(x_test)
: models - []
models.append(SVR(C=2i‘, kernel*’linear’))
models.append(LinearRegression(n_jobs-l))
models.append(xgboost.XGBRegressor(max_depth«7J n_estimato,,s*ISflf))
meta_features_train » np.zeros((X_train.shape[0], ))
mexa_features_test = np.zeros((X_test.sbape[ ], 9))
Рисунок 13 - Функция предсказания
В список «models» добавим лучшие модели с подобранными параметрами.
Архитектура модели стекинга состоит из двух уровней: «нулевого» уровня, в ко-
тором несколько моделей делают прогнозы на основе данных и «первого» уровня,
где модель учится лучшим образом совмещать прогнозы с «нулевого» уровня.
Реализуем «нулевой» уровень.
Base models (level-0)
: for model in tqdm(models):
train, test compute_meta_feature(,noael, X_train, X_test, y_train, 5)
meta_features_train - np.append(meta_features_tnain, trtain.reshape((train.size, 1)), axis-1)
meta_features_test np.apperd(meta_featdnes_test, test.reshape((test.size, 1)), axis-1)
100%
3/3 [CO 02<00 00 1 I7ivs]
Рисунок 14 - «Нулевой» уровень
Реализуем «первый» уровень. В качестве метамодели возьмём линейную ре-
грессию (рис. 14).
Meta model (level-1)
]: stacking_fflodel = LirearRegression()
stacking_model.fit(meta_features_train, y_train)
]: LinearRegression()
Рисунок 15 - «Первый» уровень
2.3. Прогнозирование данных испытаний и проверка точности
Оценим результаты модели стекинга на тестовой выборке (рис. 16).
y_train_predicted = stacking_nodel.predict(meta_features_train)
y_test_predicted = stackirg_nodel.predict('neta_features_test)
test_scone = r2_score(y_test, y_test_p^edicted)
print(f"KaHecTBO на тестовой выборке - {round(test_score.,4)}")
Качество на тестовой вьборке - 0.9839
Рисунок 16 - Оценка результатов
Качество модели вышло таким же, как и у xgboost. Для маленького набора
данных, который используется в работе, улучшения в качестве при использовании
стекинга могут быть незаметны, но на больших объемах данных можно получить
впечатляющие результаты.
Сель векторного квантования (LVQ)
Крал кие теоретические сведения
Что такое сеть векторного квантования?
Сеть векторного квантования (англ. LVQ - learning vector quantization) -
это алгоритм, который является типом искусственных нейронных сетей и ис-
пользует нейронные вычисления. В более широком смысле можно сказать, что
это тип вычислительного интеллекта. Этот алгоритм использует конкурентный
подход к обучению, основанный на принципе «победитель получает все», Ал-
горитм LVQ позволяет выбрать количество экземпляров обучения, которые
нужно пройти, а затем узнать, как эти экземпляры выглядят. LVQ был изобре-
тен Теуво Кохоненом и связан с алгоритмом k-ближайшего соседа.
Этот алгоритм используется для прогнозного моделирования. Прогнозы
делаются путем нахождения наилучшего соответствия среди библиотеки шаб-
лонов. Разница в том, что библиотека шаблонов изучается на основе обучаю-
щих данных, а не с использованием самих обучающих шаблонов.
Библиотека шаблонов называется векторами кодовой книги, а каждый
шаблон называется кодовой книгой.
Основная цель LVQ с точки зрения обработки информации состоит в том,
чтобы подготовить в области наблюдаемых выборок данных набор векторов
кодовой книги. Далее, эти векторы затем используются для классификации не-
видимых векторов. Первоначально составляется случайный пул (набор) векто-
ров, а затем они подвергаются обучающей выборке. При использовании страте-
гии «победитель получает все» выбирается либо один, либо те векторы, кото-
рые наиболее похожи на заданный входной: шаблон. Затем они корректируются
таким образом, чтобы быть ближе к входному вектору, а иногда и дальше от
занявшего второе место. При повторении этого процесса это приводит к рас-
пределению векторов кодовой книги во входном пространстве, которое может
приблизительно соответствовать распределению выборок, лежащих в основе
набора тестовых данных.
LVQ имеет два уровня: один - входной, а второй - выходной. Архитекту-
ра векторного квантования обучения с количеством классов во входных данных
и п количеством входных функций! для любого образца приведена ниже:
Рисунок 1 - Архитектура LVQ
Начало работы с Python
Поскольку практическая реализация примера алгоритме! будет происхо-
дить на языке программирования Python, то для начала разберем основы работы
с ним. Установить Python можно на официальном сайте https://www.pylhon.org/
С Й pythonjotg
Python rfo
c* python
About Downloads Docum
Download the latest versior
5- ЗД1 fcfep
python
for
windows
Install Python 3.9.1 (64-bit)
$**a uwM Mow to tnsuU Python внмЛ rau*>9&. or choose
Cuicorw* to ими» or foanw.
I*k Wtt Otf, 4e cumeriltMe
Gcatet tMrt<utj **d M< «HOortMAS
-> Customize nstoiiaton
Осси кхйм- and ftMwes
Q tnstai launcher for aiI user* доогкпепймя
0Add Python 19 to PATH
DowtilOdd Python 3 9.1
Setup was successful
Рисунок 2 - Установка Python
Чтобы проверить установку, можно запустить командную строку Win-
dows и в открывшемся окне консоли ввести «python -V». После запуска должна
появиться надпись Python с его версией (рис. 3).
Эй
Microsoft Windows [Version 1€
(с) Корпорация Майкрософт (Mi
С:\Users\Mimika>python -V
Python 3.9.1
Рисунок 3 -11роверка установки
Для написания и запуска кода на Python можно использовать интерактив-
ную оболочку idle, которая устанавливается вместе с Python, либо использовать
внешний редактор и запускать код через консоль.
Также можно создать программный файл (с расширением .ру) и указать
путь к нему в командной строке Windows.
test.py — Блокнот
Файл Правка Формат Вид Справка
|пате - 1приС("Введите имя: ")
surname 1при1("Введите фамилию: ")
рг1п1("3дравствуйте,", surname, name)
Рисунок 4 - Файл test.py
(С: \Users\Mimika>C : \Test\test. ру
Введите имя: Ann
Введите фамилию: Ivanova
Здравствуйте, Ivanova Ann
Рисунок 5 - Запуск файла «test.py»
В данной работе используется idle. Для его запуска в Пуске необходимо
прописать название «idle» и запустить оболочку (рис. 6).
IDLE Shell 3.9.1 - □ X
File Edit Shell Debug Options Window Help
Python 3.9.1 (tags/v3.9.1:le5d33e, Dec 7 2020, 17:03:21) [MSC v.1927 64 bit (AM
D64) J or. Win32
Type "help", "copyright", "credits" or "licer.seO" for more information.
>» |
Рисунок 6 - Запуск idle
В данном фрагменте уже можно прописывать последовательно команды
Python. Например:
»> print ("Hello world")
Hello world
>» I
Для того чтобы открыть редактор кода нужно нажать File » New File. В
открывшемся окне можно написать код. Для его запуска необходимо нажать
Run » Run Module или клавишу F5 (предварительно необходимо сохранить
файл с расширением .ру). Результат запуска отображается в idle.
untitled
File Edit Fermat Run Options Window Help
Рисунок 7 - Редактор кода
Пример реализации на Python
Для примера будем использовать псевдослучайный набор сгенерирован-
ных классификационных данных.
1 XI X2 Y
2 2.7810836 2.550537003 0
1.465489372 2.362125076 0
4 3.396561688 4.400293529 0
1.38807019 1.850220317 0
6 3.06407232 3.005305973 0
7 7.627531214 2.759262235 1
8 5.332441248 2.088626775 1
6.922596716 1.77106367 1
108.675418651 -0.242068655 1
1 7.673756466 3.508563011 1
Евклидово расстояние
Первый необходимый шаг - вычислить расстояние между двумя строка-
ми в наборе данных.
Строки данных в основном состоят из чисел, и простой способ вычислить
расстояние между двумя строками или векторами чисел - провести прямую ли-
нию. Это имеет смысл в 2D или 3D и хорошо масштабируется до более высоких
размеров.
Можно вычислить расстояние по прямой между двумя векторами, ис-
пользуя меру евклидова расстояния. Он рассчитывается как квадратный корень
из суммы квадратов разностей между двумя векторами.
distance sqrt[sum((xl i-x2 i)A2)
где xl - первая строка данных, х2 - вторая строка данных, a i - индекс для
определенного столбца, который суммируется по всем столбцам.
При евклидовом расстоянии, чем меньше значение, тем более похожими
будут две записи. Значение 0 означает, что между двумя записями нет разницы.
Ниже представлен пример для расчета расстояния между первой строкой
и каждой строкой в наборе данных, включая саму строку.
fron math -r;.rt sqrt
I расчет евклидова расстояния между двумя векторами
ef euclidean_distance(rowl, row2):
distance - 0.0
fori in range(let(row!)-1):
distance +« (rowl(i) - row2[i])-2
retirr. sqrt (distance)
dataset = [[2.7810336,2.559537003,0],
[1.465489372,2.362125076,0],
(3.396561688,4.400293529,0],
[1.38307019,1.350220317,0],
[3.0€40"’232,3.005305973,0],
[7.627531214,2.759262235,1],
[5.332441248,2.098626775,1],
[6.922596716,1.77106367,1],
[8.675418651,-0.242068655,1],
[7.673756466,3.503563011,1]]
rowO » dataset[0]
f rcw dataset;
distance euclidean_distance(rowo, rcw)
print(distance)
Функция с именем euclidean distance (), которая реализует вычисление
расстояния по прямой между двумя векторами, используя меру евклидова рас-
стояния, предполагает, что последний столбец в каждой строке является вы-
ходным значением, которое игнорируется при вычислении расстояния.
При выполнении этого примера печатаются расстояния между первой
строкой и всеми остальными строками. Как и ожидалось расстояние между
первой строкой и самой собой будет равно 0.
0.G
1.329017391527573?
1.9494646655653247
1.5591439385540549
О.5356280721935492
4.350940136936411
2.592833759950511
4.214227042632567
6.522409938228337
4.935585382449795
Теперь используем расчет расстояния, чтобы найти наиболее подходя-
щую единицу в наборе данных.
Лучшая единица соответствия
Лучшая единица соответствия (англ. BMU - best matching unit) - это век-
тор кодовой книги, который больше всего похож на новый фрагмент данных.
Чтобы найти BMU для нового фрагмента данных в наборе данных, мы
должны сначала вычислить расстояние между каждой кодовой книгой и новым
фрагментом данных. Для этого используем функцию расстояния выше.
После расчета расстояний мы должны отсортировать все кодовые книги
по их расстоянию до новых данных. Затем мы можем вернуть первый или
наиболее похожий вектор кодовой книги.
Мы можем сделать это, отслеживая расстояние для каждой записи в
наборе данных в виде кортежа, отсортировывая список кортежей по расстоя-
нию (в порядке убывания), а затем получив BMU.
Напишем функцию get best matching unit (), которая реализует это.
fror лаch "т >rt sqrt
* расчет евклидова расстояния между двумя векторами
ief euclidean_distance(rowl, row2):
distance • 0.0
for x it range(len(rowl)-1):
distance += (rcwl[x] - xow2[x])**2
return sqrt(distance)
t нахождение лучшей единицы соответствия
get_best n,atching_jnit (codebooks, test_rcw) :
distances = list()
f codebook codebooks:
disc • euclidean_distance(codebook, test_row)
distances.append((codebook, dxst))
distances, sort (key^.aiabde tup: tup(l])
return distances(0)(0)
dataset - ([2.7810836,2.553537003,0],
(1.465489372,2.362125076,0],
(3.396561688,4.400293529,0],
[1.38807019,1.850220317,0],
[3.06407232,3.005305973,0],
[7.627531214,2.759262235,1] ,
[5.332441248,2.088626775,1],
[6.922596716,1.77106367,1],
[8.675418651,-0.242068655,1],
[7.673756466,3.508563011,1]]
test_row • dataset[0]
bitu get_best_KAtching_jnxt(dataset,
print (bitu)
test_xow)
Функция euclidean distance (), разработанная на предыдущем шаге, ис-
пользуется для вычисления расстояния между каждой таблицей кодов и новой
строкой test row.
Список кодовой книги и дистанционных кортежей сортируется там, где
используется специальный ключ, гарантирующий, что второй элемент в корте-
же (tup |1|) используется в операции сортировки.
Наконец, верхний или наиболее похожий вектор кодовой книги возвра-
щается как BMU.
При выполнении этого примера BMU в наборе данных печатается в пер-
вой записи. Как и ожидалось, первая запись наиболее похожа на себя и нахо-
дится в верхней части списка.
[2.7S10S36, 2.55U537003, 0)
Делать прогнозы с набором векторов кодовой книги - это то же самое.
Мы используем алгоритм 1-ближайшего соседа. То есть для каждого но-
вого шаблона, для которого мы хотим сделать прогноз, мы находим наиболее
похожий вектор кодовой книги в наборе и возвращаем связанное с ним значе-
ние класса.
Теперь, когда мы знаем, как получить лучшую единицу соответствия из
набора векторов кодовой книги, нам нужно научиться их обучать.
Обучающие векторы кодовой книги
Первым шагом в обучении набора векторов кодовой книги является ини-
циализация набора.
Мы можем инициализировать его с помощью шаблонов, созданных из
случайных функций в наборе обучающих данных.
Ниже представлена функция random codebook (), которая реализует это.
Случайные входные и выходные функции выбираются из обучающих данных.
♦ СоАДякие случайного вектора кодовой книги
ef randoir_codebook (train) :
n_recotds ler. (train)
n_features = len(train[0])
codetack [train[randrange(n_records)][i] t i range(n_features)I
ret codehook
После того, как векторы кодовой книги инициализированы как случай-
ный набор, они должны быть адаптированы для наилучшего обобщения обуча-
ющих данных.
Это делается итеративно.
1. Эпохи: на верхнем уровне процесс повторяется для фиксированного ко-
личества эпох или экспозиций обучающих данных.
2. Набор обучающих данных: в эпоху каждый обучающий шаблон исполь-
зуется по одному для обновления набора векторов кодовой книги.
3. Особенности шаблона: для данного шаблона обучения каждая функция
вектора наилучшего соответствия кодовой книги обновляется, чтобы
сдвинуть его ближе или дальше.
Наилучшая совпадающая единица находится для каждого обучающего
шаблона, и обновляется только эта наилучшая совпадающая единица. Разница
между шаблоном обучения и BMU рассчитывается как ошибка. Значения клас-
са (предполагается, что это последнее значение в списке) сравниваются. Если
они совпадают, ошибка добавляется к BMU, чтобы приблизить его к шаблону
обучения, в противном случае она вычитается, чтобы отодвинуть ее дальше.
Величина, которую регулирует BMU, контролируется скоростью обуче-
ния. Это взвешивание количества изменений, внесенных во все BMU. Напри-
мер, скорость обучения 0,3 означает, что BMU перемещаются только на 30 %
разницы или ошибки между шаблонами обучения и BMU.
Кроме того, скорость обучения регулируется таким образом, чтобы она
имела максимальный эффект в первую эпоху и меньший эффект по мере про-
должения обучения до тех пор, пока она не окажет минимального эффекта в
последнюю эпоху. Это называется графиком скорости обучения с линейным за-
туханием и также может использоваться в искусственных нейронных сетях.
Мы можем резюмировать этот спад в скорости обучения по номерам эпох
следующим образом:
rate = learning rate * (J .0 - (epoch/totai. epochs))
Проверим это уравнение, приняв скорость обучения 0,3 и 10 эпох. Ско-
рость обучения для каждой эпохи будет следующей:
Epoch 20 3 1 42 5 3 64 7 5 86 9 7 108 119 Effective Learning Rate 0.3 0.27 0.24 0.21 0.18 0.15 0.12 0.09 0.06 0.03
Ниже приведена функция с именем train codebooks (), которая реализует
процедуру обучения набора векторов кодовой книги с учетом набора обучаю-
щих данных.
f Обучение набора векторов кодовой книги
ef tram_ccdebccks (train, n_codebooks, Irate, epochs):
codebosks (randon._c: detook (train) for 1 ir range(n_codebooks)]
for epoch ir range(epochs):
rate = Irate * (1.0-(epoch/float(epochs)))
sum_error 0.0
fcr row in tram:
bmu get_best_matching_unit(codebooks, row)
for i in range(len(rcw)-1):
error row[i] - bB>u[i]
surr._error error*‘2
if bn.uf-1] “ raw[-l):
fcnrj(i) + rate * error
else:
bmu(i) - rate ‘ error
print ( . Irate I. f, „гж%. f % (epcch, rate, swr._error))
return codebooks
Функция принимает 3 дополнительных аргумента к набору обучающих
данных, количество векторов кодовой книги для создания и обучения, началь-
ную скорость обучения и количество эпох, для которых нужно обучать векторы
кодовой книги.
Вы также можете видеть, что функция отслеживает сумму квадратов
ошибок для каждой эпохи и печатает сообщение, показывающее номер эпохи,
эффективную скорость обучения и сумму квадратов ошибок. Это полезно при
отладке обучающей функции или конкретной конфигурации для данной задачи
прогнозирования.
Также представлено использование функций randonicodebook () для
инициализации векторов кодовой книги и get best matching unit (), чтобы
найти ВМС для каждого обучающего шаблона в эпоху.
Теперь объединим все приведенные выше примеры и изучим набор век-
торов кодовой книги для нашего сгенерированного псевдослучайного (то есть
полученного методом random любого языка программирования, а не операция-
ми генерирования атомных ядер, что является единственно верным понятием
случайного числа) набора данных.
Итоговый пример:
from math import sqrt
from random import randrange
from random import seed
# расчет евклидова расстояния между двумя векгорами
def eucl idcan distance( row I. row2):
distance = 0.0
for i in range(len(rowl )-l):
distance += (row I [i] - row2[i])**2
return sqrt(distancc)
# нахождение лучшей единицы соответствия
def get best matching unitfeodebooks, test row):
distances = Iist()
for codebook in codebooks:
dist = euclidean_distance(codcbook, test row)
distances, uppendt (codebook, dist))
distances.sonfkey-lambda tup: tup| 1J)
return distances[0][0]
# Создание случайного вектора кодовой книги
def random codebook(train):
n records = lent train)
n features = lcn(tram[0])
codebook = [truin[raiidrange(n rccords)][i] for i in range(n features)]
return codebook
fr Обучение набора векторов кодовой книги
def train codcbooks(tram, n codebooks. Irate, epochs):
codebooks ~ [random codebook(tram) for i in range(n codebooks)]
for epoch in range(epochs):
rate = Irate * (1.0-(epoch/float( epochs)))
sum error = 0.0
for row in train:
bmu = get best matchmg_unit(codcbooks. row)
for i in range( len( row)-1):
error = row(i] - bmu[i]
sum error += error**2
if bmu[-l] = row|-l):
bmu| 11 +- rate * error
else:
bmu 11] — rare * error
print('>epoch %d, Irate~%.3f. enor-%.3f % (epoch, rate, sum error))
return codebooks
seed!1)
dataset = [[2.7810836,2.550537003,0],
[ 1.465489372,2.362125076.0 J,
[3.396561688,4 400293529.0].
[1.38807019,1.850220317,0],
[3.06407232,3.005305973.0],
[7.627531214,2.759262235,1 ].
[5.332441248,2.088626775,1 ],
[6.922596716,1.77106367,1 ],
[8.675418651 .-0.242068655,1 ].
[7.673756466,3.508563011,1]]
learn rate = 0.3
n epochs® 10
n codebooks = 2
codebooks - train cudebook s( data set. n codebooks, learn rate, n epochs)
printfCodebooks: %s’ % codebooks)
При выполнении этого примера обучается набор из 2 векторов кодовой
книги для 10 эпох с начальной скоростью обучения 0,3. Детали печатаются
каждую эпоху, и отображается набор из 2 векторов кодовой книги, извлечен-
ных из обучающих данных.
>epoch=0
>еросп=1
>ерос’п=2
>epoch=3
>epoch=4
>epoch=5
>epoch=6
>epoch=7
>epoch=S
>epoch=9
lxate=0.300
lxate=0.270
lxate=0.240
lrate=0.210
lxate=0.130
lxate=0.150
lzate=0.120
lxate=0.090
lxate=0.060
lxate=0.030
exxox=43.270
exxox»30.403
exxoxe27.146
exxox=26.301
exxox=25.537
exxox=24.7=9
exxox=24.058
erxox=23.346
error=22.654
erxor=21.982
Codebecks: [[2.432316086217663, 2.839821664184211, 0]
[7.319592257892681, 1.97013332654341, 1]]
•s'» I
Мы видим, что изменения в скорости обучения соответствуют нашим
ожиданиям, рассмотренным выше для каждой эпохи. Мы также можем видеть,
что сумма квадратов ошибок для каждой эпохи продолжает снижаться в конце
обучения и есть возможность настроить пример дальше, чтобы добиться мень-
ших ошибок.
Задание для самостоятельной работы
Реализовать LVQ. используя реальный набор данных.
Кон1 рольные вопросы
1. Что такое LVQ?
2. Какие уровни имеет LVQ?
3. Как вычислить расстояние по прямой между двумя векторами4
4. Что такое BMU?
Кластеризация на основе распределении
1. Кра 1 кие теоретические сведения
Кластер (англ, cluster) - это набор сгруппированных вместе сущно-
стей/объектов, схожих между собой больше, чем с элементами других класте-
ров (групп), иными словами - набор компактных и изолированных точек.
Кластеризация (англ, clustering) или кластерный анализ (англ, cluster
analysis) - это одна из самых фундаментальных проблем машинного обучения
без учителя. Она представляет из себя совокупность методов и алгоритмов, для
разбиения на кластеры схожих между собой сущностей на основе такого крите-
рия сходства, чтобы близость между ними в одном кластере была высокая, в то
время как сходство между сущностями из разных кластеров низкое (например,
исходя из информации о расстояниях или мерах близости).
Чем больше сходство внутри кластера и чем больше разница между кла-
стерами, тем отчетливее кластеризация.
* •
• •• •
м • • •••
е е . • • •
• -х .’•рХТГП
е1 ••Bg • gwg • ••• «м
•I «|* |а •** g Л ,*•* I
• И • _ •
Рисунок 1 - Пример кластеризации
Кластеризация на основе распределений
Кластеризация на основе моделей распределения - это модель кластери-
зации, которая основывается на возможной вероятности того, что все точки
данных в кластере принадлежа г одному и тому же распределению (нормально-
му, гауссовскому). Полезной особенностью этого подхода является то, что он
похож на выборку случайных объектов из распределения для создания искус-
ственного набора данных.
Модели гауссовой смеси (GMM - Gaussian mixture models) - это алго-
ритм, основанный на смеси гауссовых распределений. Поскольку используется
нечеткая кластеризация, то параметром выступает смесь весов компонентов (я),
а также среднее значение (ц) / ковариационная матрица (X) - для многомерного
случая.
Гауссово распределение (нормальное распределение) имеет форму коло-
колообразной кривой, а точки данных симметрично распределены вокруг сред-
него значения (р).
Допустим, существует к гауссовских распределений со средними значе-
ниями (ри) и значениями ковариации (Zk). Также присутствует еще один пара-
метр, который определяет количество точек для распределения, т. е. плотность
распределения.
Для одномерной колоколообразной кривой плотность распределения:
। U м)2
/(ж д,а2) = е
\ 2тг<т“
где ц - среднее значение, а о2 - дисперсия.
Для двумерной кривой плотность распределения рассчитывается:
f(x д, х) = . L,c-p
\ 2nisi
где х - входной вектор, р - средний вектор, a L - ковариационная матрица.
После определения количества кластеров и присваивания случайным об-
разом значения для среднего, ковариации и плотности, выполняется ЕМ-
алгоритм.
Алгоритм ожидания-максимизации, или ЕМ-алгоритм (ЕМ Expectation-
Maximization) - это итеративный подход для поиска максимального правдопо-
добия в присутствии скрытых переменных.
ЕМ-алгоритм состоит из двух этапов:
• Шаг Е - оценка (предположение) значений недостающих или скрытых
переменных.
Необходимо найти вероятность принадлежности каждой точки Xi распре-
делению/кластеру ji, ..., jk, т. е. разделить вероятность принадлежности х, кла-
стеру на сумму принадлежностей хк к ji,...,
3,} ZjTtjNfxi-.upty
• М-шаг или шаг максимизации - на основе значений, полученных на
предыдущем шаге, полные данные используются для обновления пара-
метров.
Необходимо обновить среднее значение, значение ковариации и плот-
ность распределения. Они обновляются следующим образом:
Плотность распределения обновляется соотношением количества точек в
кластере и общего количества точек.
Среднее значение и ковариационная матрица обновляются на основе зна-
чений. присвоенных распределению, пропорционально значениям вероятности
для точки данных. Следовательно, точка данных, которая является частью этого
распределения с большей вероятностью, будет вносить большую часть:
где n - количество точек в кластере и Т - оператор транспонирования.
На основе обновленных значений, сгенерированных на этом этапе, вы-
числяются новые вероятности для каждой точки данных и итеративно обнов-
ляются значения. Этот процесс повторяется для максимизирования функции
логарифмического правдоподобия.
2. Установка Python
Для работы будет использоваться язык программирования Python (версии
не ниже 3.5). Скачать Python можно на официальном сайте [1]. Подробней об
установке можно прочитать в статье [2].
windows
Install Python 3.7.2 (64-bit)
Select Install Mow to install Python with default settings, or choose
Customize to enable or disable features.
Ф insta Now
C:\Users\Eugene\Appbdta\Local\Programs\Python\Python37
Includes IDLE, pip and documentation
Creates shortcuts and file associations
-> Qistom'ze installation
Choose location and features
bJ Install launcher for all users (recommended)
0 Add Python 3.7 to PATH Cancel
Рисунок 2 - Установка Python
Проверка установки осуществляется в командной строке Windows с по-
мощью команды «python -V». После запуска должна появиться надпись Python
и его версия.
Также понадобится менеджер пакетов PIP. Он подгружает необходимые
пакеты для работы и проекта. В новых версиях PIP устанавливается вместе с
Python по умолчанию. Если его нет, установку можно прочитать в статье |3].
Для работы с Python можно использовать встроенную оболочку idle или
создать файл с расширением «.ру» и указать путь к нему в командной строке
Windows.
3. Реал (нация на Python
В качестве примера были взяты данные [4] соотношения роста и веса лю-
дей.
Для чтения данных можно использовать pandas - это библиотека Python,
которая предоставляет удобные инструменты для специализированного анализа
и хранения данных [6].
Pandas подходит для работы с одномерными и двумерными таблицами
данных, CSV файлами, таблицами Excel.
Установить библиотеку pandas можно через Anaconda (дисгрибутив язы-
ков программирования Python и R), поскольку у него есть пакетный менеджер
conda. Подробней об установке пакета Anaconda в статье [7]. Либо через мене-
джера пакетов Р1Р. Команда «pip install pandas» в cmd.
Также понадобится библиотека matplotlib.pyplot, предназначенная для по-
строения графиков [8]. Команда «pip install matplotlib» в cmd.
Skleam.mixture - это пакет, который позволяет изучать модели гауссовой
смеси. Класс skleam.mixture.GaussianMixture позволяет выполнять оценку па-
раметров распределения гауссовой смеси |9]. Команда установки библиотеки
машинного обучения: «pip install -U scikit-leam scipy matplotlib» в cmd.
Как говорилось ранее для примера взято соотношение роста и веса лю-
дей. Данные находятся в файле «HW.csv» (рис. 3). Файл с данными лучше по-
местить в папку, где хранится программный код).
_ А
Height,Weigh
174,71
203,99
182,82
184,75
181,81
180,59
170,71
Рисунок 3 - Содержание файла «herat.csv»
Для работы с данными импортируем pandas и обозначить его как pd.
import pandas as pd
hw_data = pd.read_csv( )
Для построения графика данных импортируем пакет pyplot и обозначим
его как pit.
ort itatplctlih .pyplot as pit
Выведем данные (рис. 4). Метод matplotlib.pyplot.scatter ( х , у ...) задает
позиции данных (х, у Boat или массив), a show выводит график.
pit.scatter(hw_data [ ],hw_data [ J) #п-зиции данных
pit. show () ^показать график.
Используя класс scikit-learn Gaussian Mixture, можно создать GMM и запу-
стить алгоритм ЕМ в нескольких строках кода
fr г slclearn.mixture irp rt Gaussianl-fxxture
Допустим, будут использоваться данные для весовой категории в тхэк-
вондо (суперлёгкий вес, лёгкий вес, средний вес и тяжёлый вес).
Следовательно, зададим количество компонент в смеси 4 (n components
int, по умолчанию = 1).
Метод «fit» используется для оценки парамезров модели с помощью ЕМ-
алгорит ма.
Метод «predict» используется для предсказания меток для выборок дан-
ных в х, используя обученную модель.
Также можно задать цвет и форму для компонент и подписать оси и оза-
главить график.
На рисунке 5 показан полный код программы. Вывод результата пред-
ставлен на рисунке 6.
import pandas as pd #для работы с данными
ijq rt rrAtplotlib.pyplct as pit *для построения графика
f: sklearn.mixture GaussianMxxture
from sklearn.metrics imp _t silhouette_score
hw_data = pd.read_csv( .csv ) #загрузка данных
^количество компонент смеси 4
gm " GaussianMlxture(n_componentse4).fit(hw_data) #оценка параметров модели с помощью ЕМ
^прогнозирование
labels grr.predict (hw_data) t-редсказание меток для выборок данных в х
hw_data£ - iter ]“labels
hw_data.columns (‘Heigh*f ’Weight','cluster'J #метки столбцов DataFrame
(оценка валидации кластера
cluster_validation silhouette_score(hw_data, labels, metric» cl .de )
^внешний вид и вывод результата
color=[ с si', ,'blue',' <]
rcark»( , , , , ']
for k in range(О,4):
hwd =hw_data[hw_data{".... r"]==k]
pit.scatter(hwd[ ],hwd( ],c"color[k],rcarker"markfkJ,edgecolors" j
(вывод оценки
print( Оценка в _ : k. г 4 cluster_validation)
plt.xlabel(' I )
pit.ylabel('E- )
plt.title( )
pit.show()
Рисунок 5 - Листинг программного кода алгоритма «GMM»
GMM
Рисунок 6 - Результат кластеризации
Теперь необходимо сделаем оценку качества кластеризации. Будет ис-
пользоваться внутренний метод оценки (внутренняя валидация), поскольку это
метод позволяет оценивать кластеризацию, опираясь только на информацию в
данных (без использования внешних).
Для этого подойдет коэффициент (оценка) силуэта silhouettescore.
г. sklearr. .metrics pert silho-ette_score
Для его расчета используются среднее виутрикластерное расстояние и
среднее расстояние до ближайшего кластера.
cl’jster_validation - silho'aette_score(hw_data, labels, metric- )
Первый параметр - это массив сущностей, второй - прогнозируемые мет-
ки, а третий - метрика, используемая при вычислении расстояния между экзем-
плярами в массиве объектов (для числовых значений по умолчанию использу-
ется евклидово расстояние). Подробнее можно узнать в статье 110].
Выведем результат:
print( ...... % cluster_validation)
================== RESTART: C:\Use
OueriKa ьа.тидации кластера: 0.3372
।
Итак, оценка составляет 33 %, что ожидаемо, поскольку кластеры распо-
ложены близко друг к другу.
Так можно сделать вывод, что определение кластеров зависит от многих
факторов, включая входные данные.
Алгоритм кластеризации кластерный центроид
Требуется определить соотношение цена-качество подержанных автомо-
билей, выставленных на продажу. Для этого нужно с помощью информации о
цене и состояния автомобилей произвести кластеризацию методом к-средних,
выявить центроиды для каждого кластера. Точностью распределения данных
будет считаться количество кластеров, которое нужно определить «методом
локтя». Нужно охарактеризовать каждый кластер - где собраны лучшие
варианты, где худшие. Для этого понадобится найти набор данных по ключе-
вым словам «Used Car Price», выбрать https://datasetsearch.research.google.com/-
search?query=Used%20Car%20Price&docid=L2cvMTFtcGIxN3hyMg%3D%3D и
сделать алгоритм на основе этих данных.
Скачивание набора данных:
Go gie
Q, jsedCarPnce
• Послали** овноаланха - Фора*»’ е»а>а»а~и> » проа» иело'а.ыама » Там* Б*епл«><к>
Найдено боте 100 набоек» дннт
Used Car Price Dau
«rawkagjjecom
(53 «•
цАноалос. >Л 20, .Wl
«“»os used car purchases ccrrsumer
росе index (CPI) annual averao
мм aiat.tta «rr
OdHiwnero Var 22,2021
kaggle
Used Car Price Data
Predict price of used cars based on cw features and its current condition
□ ’’ <
Ciattrf аы шоаросй на этот набор ддмнда М (Пэсиотгет» о tocgte аматыи?)
(Q ар4Э»11Ьрм)
набор данный обноагем
Feb 29,2021
Рисунок I - Набор данных
4- ом<*
@ Ноте
9 Coanpei tons
И Douseis
о code
® DttCUSSKXIS
© Courses
v Мо-а
<*, Used С» Нк* D«t*
te и*м cars Dour*
p> vencieoiUMt
b New Can Price 2019
Moasorco CaiaKe
Vie* Active Events
Рисунок 2 - Набор данных
А В C D E F G H I
1 Model,Sdllng Price.Kilometers Driven,Year,Owner,Fuel Type,Transmission,Insurance,Car Condition
2 MarutiWagonR1.0LXI,312165,82238,2014,First Owner,Petrol + CNG,MANUAL, Expired, 4.2
3 ToyotaEtiosLiva,313799,30558,2013,First Owner,Petrol,MANUAL,12-09-2021,4.4
4 MarutiAlto800,295999,22164,2018,First Owner,Petrol,MANUAL,01-12-2020,4.8
5 MarutiSwift,435199,30535,2013,First Owner,Diesel,MANUAL,Comp,4.3
6 MarutiWagonRl.0,289099,15738,2013,First Owner,Petrol,MANUAL,11-08-2021,4.3
7 HyundaiElitei20ASTA1.2,708199,32652,2018,First Owner,Petrol,MH12,Comp,4.7
8 HyundaiGrandil0SPORTZ1.2KAPPA,410788,32496,2013,First Owner,Petrol,MANUAL,Expired,4.4
9 HyundaiElitei20ASTA,606599,27487,2015,First Owner,Petrol,MANUAL,22-03-2021,4.6
10 MarutiCelerio,459199,41383,2018,First Owner,PetrolMANUAL,06-03-2021,4.4
11 MarutiWagonRl.0,265899,65476,2012,First Owner,Petrol + CNG,MANUAL,23-10-2021,4.3
12 MarutiSwiftDzireVXI1.2BS,426999,27992,2013,First Owner,Petrol,MANUAL,26-05-2021,4.4
13 MarutiDzire,671499,14061,2018,FirstOwner,Petrol,MANUAL,11-07-2021,4.8
14 HondaCivicl.8S,146870,52138,2007,Third Owner,Petrol,MANUAL,Expired,4
15 MarutiAltoKlOVXI,290099,46410,2014,Second Owner,Petrol,TS07„3.9
16 MarutiAlto800LXI,285399,47168,2016,First Owner,Petrol + CNG,MANUAL,17-03-2021,4.2
17 HyundaiVernaFLUIDIC1.6EX,529699,72813,2013,First Owner,Petrol + CNG,MANUAL,09-01-2022,4.2
18 ToyotaEtiosCROSSl.4,424399,79123,2015,First Owner,Diesel,MANUAL,07-07-2021,4.3
19 HondaCitySVCVT,615799,72097,2016,First Owner,Petrol,AUTOMATIC,02-02-2021,4.4
20 VolkswagenVentoHlGHLlNE,413999,151201,2014,First Owner,Diesel,MANUAL,10-08-2021,4.3
21 Hyundaii20MAGNAO,328199,73356,2012,First Owner,Petrol,MANUAL,29-07-2021,4.3
22 VolkswagenPoloGT,948899,14516,2018,First Owner,Petrol,MANUAL,07-10-2021,4.9
23 MahindraTUV300,656399,34658,2016,FirstOwner,Diesel,MANUAL,02-07-2021,4.5
24 HondaAmazel.5VCVT,698899,53486,2018,First Owner,Diesel,UP14,Third_party,4.5
25 TataNanoXT,100599,35905,2014,First Owner,Petrol,MANUAL,24-11-2021,4.3
26 RenaultKwid,250399,39278,2016,Second Owner,Petrol,MANUAL,21-11-2021,4.2
27 MarutiAltoKlO,309999,36245,2017,First Owner,Petrol,MANUAL,23-09-2021,4.7
28 HyundaiElitei20SPORTZ,518099,61923,2015,First Owner,Petrol,MANUAL,Expired,4.4
29 MarutiZenEstilo,211799,39612,2010,Third Owner,Petrol,MANUAL,13-06-2021,4.2
car data (+)
Рисунок 3 - Отображение данных
Решение:
Для работы потребуются библиотеки matplotlib и pandas. Matplotlib -
библиотека для визуализации данных двумерной графикой. Pandas - библиоте-
ка для обработки и анализа данных.
import matplotlib.pyplot as mtp
import pandas as pd
Импорт данных:
dataset = pd.read_csv('car_data.csv *)
Извлечение нужных данных. Извлечение только 1-го и 8-го параметра:
цены автомобиля и состояния автомобиля, так как нужен двухмерный график
для визуализации модели.
х = dataset Л1ос[: > [1, 8]]. values
Поиск оптимального количества кластеров для задачи кластеризации. Для
этой цели будет использоваться метод локтя. Метод локтя использует концеп-
цию WCSS для построения графика путем нанесения значений WCSS по оси Y
и количества кластеров по оси X. Будет происходить вычисление значения
WCSS для различных значений к в диапазоне от 1 до 10.
С помощью модуля sklearn.cluster, в котором собраны алгоритмы класте-
ризации, используется класс KMeans для формирования кластеров алгоритмом
к-средних
from sklearn.cluster import KMeans
Создание переменной wcss_list для инициализации пустого списка, кото-
рый используется для хранения значения WCSS, вычисленного для различных
значений к в диапазоне от 1 до 10.
wcss_list = [
Инициализация цикла for для итерации с другим значением к в диапазоне
от 1 до 10; поскольку цикл for в Python исключает исходящий предел, поэтому
принимается 11, чтобы включить 10-е значение.
for i in range(l_> 11):
kmeans = KMeans(n_clusters=i)
Обучение модели входными данными с помощью метода fit()
kmeans.fit(х)
Добавление в список значения внутри кластерной суммы квадратов с по-
мощью атрибута inertia
wcss_list.append(kmeans.inertia_)
Построение графика между количеством кластеров и WCSS
mtp.plot(range(l> 11), wcss_list)
mtp.title(‘График метода локтя’)
mtp.xlabel('Число кластеров')
mtp.ylabel('WCSS1)
mtp.show()
Результат:
X Figure 1 □ X
Рисунок 4 - «Метод локтя»
Из приведенного выше графика видно, что точка изгиба находится в 3.
Таким образом, количество кластеров здесь будет равно 3.
Поскольку имеется количество кластеров, теперь можно производить
кластеризацию.
Будет использоваться та же строка кода, что и в предыдущий раз, но здесь
вместо использования i будет использоваться 3, так как необходимо сформиро-
вать 3 кластера.
kmeans = KMeans(n_clusters=3)
Создание переменной y_predict, использование метода прогнозирования
соответствия fit_predict(), который устанавливает для каждого наблюдения, к
какому кластеру он принадлежит.
y_preclict = kmeans .fit_predict (х)
Визуализация кластеров. Для визуализации кластеров будет использо-
ваться диаграмма рассеяния с использованием функции mtp.scatter () библиоте-
ки matplotlib.
Код для каждого кластера в диапазоне от 1 до 3. Первая координата
mtp.scatter, то есть х |у predict == 0, 0] содержит значение х для отображения
матрицы значений, вторая координата находится в диапазоне от 0 до 1 (по оси
у), s - размер, с - цвет.
mtp.scatter(x[y_predict == 0, 0], x[y_predict == 0, 1], s = 50, с = ‘д', label = 'Кластер 1‘)
mtp.scatter(x[y_predict «« 1, 0], x[y_predict «« 1, 1], s 50, c * 'b‘, label = ’Кластер 2’)
mtp.scatter(x[y_predict == 2, 0], x[y_predict == 2, 1], s = 50, c = ‘m‘, label = 'Кластер 3')
Использование атрибута cluster centers, который возвращает координаты
цетроида.
mtp.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 100, с » 'r', label = 'Центроид')
Отображение результатов:
mtp.title('Кластеры')
mtр.xlabel('Цена авто')
mtp.уlabel('Состояние авто')
mtp.legend()
mtp.show()
Результаты:
\ Figure 1 — □ X
Кластеры
Выходное изображение ясно показывает три разных кластера с разными
цветами, в каждом из которых присутствует центроид.
Кластеры формируются между двумя параметрами набора данных: цена
автомобиля и состояние автомобиля.
Вывод: Кластер 1 отображает самые лучшие автомобили по соотношению
цена-качество. Кластер 3 наоборот имеет худшие варианты. Кластер 2 - сред-
ние варианты.
Отображение результатов распределения данных по кластерам с помо-
щью проводника переменных.
8? y_pred ct • NumPy object алгау
index Model Selling Price Негу C Year Owner u el Typ nsmrss surant ar Condibo 0
0 MarutIWjgonRl,0i XI 312165 82238 2014 First Owner Petr- MANU. Fxpl_ 4.2 0 0
First:
1 ToyotaEtiosliva 313799 30558 2013 Oarer Petr- MANU 12-0- 4.4 1 0
2 Ha rutiAlto800 293999 22164 2018 First Owner Petr- MANU- 01-1- 4.8 2 0
3 HarutiSwift 435199 30535 2013 First (Wer Qles- MANU. <-<W 4.3 3 1
4 MarutiWagonRl.0 289099 15738 2013 First Owner Petr- MANU- 11 0. 4.3 4 0
5 HyundaiElltei20ASlAl.2 708199 32652 2018 F irst Owner Petr- Hl 12 (oop 4.7 5 1
6 HyundaiGrandil0SPORT71 2KAPPA 410788 32496 2013 First ftwr Petr- HAND. fxpi- 4.4 6 0
7 HyundaiElit«i20A51A 606599 27487 2015 First Owner Petr- MANU- 22 0L 4.6 7 1
8 MarutiCelerio 459199 41383 2018 First Omer Petr- MANU. 06 0L 4.4 В 1
9 MarutiWagonRl, <1 265899 65476 2012 First Owner Petr- MANU,. 23-1- 4.3 9 0
10 MarutiSwif tDzireVXIl.285 426999 27992 2013 First Owner Petr- MANU- 26 0L 4.4 10 1
Format Resee Й Background color g Column min/max
Save and a
Format Resize x] Background color
Рисунок 6 - Результаты
& 8? уjjrea ct - NumPy object array
index Model Selling Price eters C veai Owner uel Typ nsmns suranc ar Conditio 0
13 MurutiAltoKieVXI 290099 46410 2014 Seco_ Petr- TS07 nan 3.9 13 0
14 Marut lAltu800;Xl 285399 47168 2016 First Omer Petr- MANJ. 17-0- 4.2 14 0
15 HyundalVernaFlUIDICl.6EX 529699 72813 2013 First Owner Petr- MANU- 09-0- 4.2 15 1
16 ToyotaEtiosCROSS1.4 424399 79123 2015 First Owner Dies- MANU 07-0- 4.3 16 0
17 HondaC ItySVtVI 615799 72097 2016 First Owner Petr_ AUlO- 02-0- 4.4 17 1
18 VolkswagcnVcntoHlGHlINI 413999 1512- 2014 First Owner Dies- MANJ. W 0_ 4.3 18 0
19 Hyundai 12eWfcHAO 328199 73356 2012 First Owner Petr- MAN,!. 29-O- 4.3 19 0
20 VolkswagenPoloGI 948899 14516 2018 First Owner Petr- MAN.! 07-1- 4.9 20 2
21 MunindraHW300 656399 34658 2016 First Omer Dies- MANU. 02 0— 4.5 21 1
22 HondaAaazel. 5VCV1 690899 53486 2018 First Omer Dies- UP14 Thir- 4.5 22 1
23 TataNanoXT 100599 35905 2014 First Owner Petr- MANU. 24 1_ 4.3 23 0
Fo-mat Resize xi Background color E column mirvmax Save and Cl Format Resize K. Backgrotrd color
Рисунок 7 - Результаты
Из результатов видно, что, например, первый автомобиль принадлежит к
первому кластеру (так как отсчет ведется с 0), четвертый автомобиль - ко вто-
рому, 21 -й - к третьему.
i it matplotlib.pyplot mtp
import pandas ar, pd
dataset = pd.read_csv('cor_data.csv‘)
x « dataset.iloc[, [1, 8]].values
fi sklearn.cluster oct KMeans
wcss_list []
for i in range(l, 11):
kmeans = KMeans(n_clusters=i)
kmeans.fit(x)
wcss_list.append(kmeans.inertia_)
mtp.plot(range(1, 11), wcss_list)
mtp.title('График тетода локтя‘)
mtp.xlabel(‘Число кластеров')
mtp.ylabel(‘WCSS’)
mtp.show() » иtрисовка графика
kmeans = KHeans(n_clusters=3)
y_predict » kmeans.fit_predict(x)
mtp.scatter(x[y_predict == 0, 0], x[y_predict == 0, 1], s = 50, c = ‘g , label = ‘Кластер 1‘)
mtp.scatter(x[y_predict == 1, 0], x[y_predict 1, 1], s = 50, c = 'b‘, label = ‘кластер 2)
mtp.scatter(x[y_predict == 2, ej, x[y_predict == 2, 1], s = 50, c * 'm‘, label = ‘Кластер 3)
mtp.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 100, c = 'r', label = ‘Центроид')
mtp.title( 'кластеры')
mtp.xlabel(‘Цена авто)
mtp.ylabel(‘Состояние авто")
mtp.legend()
mtp.showQ * отрисовка графика___________________________________________________________________________________
Рисунок 8 - Листинг программного кода алгоритма
«кластеризации методом к-срсдних»
Самостоятельное задание
По набору данных
hltps://datasetsearch.rescarch.google.com/search?query=Winc%20Rating&doc
id=L2cvMTFsMTJ3N184dg%3D%3D, который хранит в себе информацию о ви-
нах, нужно определить соотношение цена-качество данной продукции. Для это-
го нужно с помощью информации о рейтинге и пене товара произвести класте-
ризацию методом k-средних, выявить центроиды для каждого кластера. Точно-
стью распределения данных будет считаться количество кластеров, которое
нужно определить «методом локтя». Нужно охарактеризовать каждый клас-
тер - где собраны лучшие варианты, где худшие. В данном наборе присутству-
ют 4 варианта:
1 вариант. https://www.kaggle.com/budnyak/wine-rating-and-price?select^Red.csv
2 вариант. https://www.kaggle.com/budnyak/wine-rating-and-price2selccl5-Rose.csv
3 вариант. https://www.kaggle.com,budnyak/wine-rati ng-and-pricc?selcct=Spark-
ling.csv
4 вариант. https://www.kaggle.com/budnyak/wine-rating-and-price?selcct=Wh itc.csv
Требуется определить автомобили с наименьшим пробегом относительно
своего года выпуска. Для этого нужно с помощью информации о пробеге и годе
выпуска автомобиля произвести кластеризацию методом к-средних, выявить
центроиды для каждого кластера. Точностью распределения данных будет счи-
таться количество кластеров, которое нужно определить «методом локтя».
Нужно охарактеризовать каждый кластер - где собраны лучшие варианты, где
худшие.
5 вариант, https://www.kaggle.com/nehalbirla/vehicle-dataset-froin-cardekho
6 вариант, https://www.kaggle.com/caganseval/car-data
7 вариант, https://www.kaggle.com/spideysloth/pakwheels-cars-dataset
8 вариант. https://www.kagglc.com/amritverma/car-data
9 вариант, https://www.kaggle.com/aishwaryamuthukumar/cars-dataset-audi-bmw-
ford-hyundai-skoda-vw
10 вариант, https://www.kaggle.com/ander289386/cars-germany
Контрольные вопросы
1. Определение кластеризации.
2. Описать работу алгоритма к-средних.
3. Что такое центроид?
4. Что такое «метод локтя»?
Иерархические алгоритмы (иерархия кластеров)
Загружаем следующие библиотеки для прикладного решения поставлен-
ной задачи:
inport perdas as pd
import numpy as np
from scipy.stats import variation
import matplotlib.pyplot as olt
frorr pandas.plotting import scatter_matrix
import seaborn as sns
from sklearn.metrics import r2_score
Рисунок 1 - Требуемые библиотеки
import pandas as pd и import numpy as np - нужны для импорта библиотеки
pandas (для анализа данных) и numpy (для работы с многомерными массивами),
from scipy.stats import variation - функция нужна для того, чтобы вычислить ко-
эффициент вариации (отношение стандартного отклонения к среднему значе-
нию).
import matplotlib.pyplot as pit - простые функции для редактирования эле-
ментов графика (линии, изображения, текст).
from pandas.plotting import scatter matrix - построение диаграммы рассеивания,
import seaborn as sns - библиотека понадобится для отрисовывания простых
I рафиков.
from sklearn.metrics import r2_score - расчет коэффициента R2 (коэффици-
ент детерминации).
Ссылка на источник данных: https://dropmefiles.com/6tShH
Прочитаем файл с данными при помощи функции read excel() из файла
UU DataSet.xIsx, при помощи sheet name можно выбрать название конкретного
листа (в примере «Marketing»):
df=pd.read_excel(wUU_OataSet.xlsx", sheet_name="Marketing")
Рисунок 2 - Функция read exccl()
Вывод первых пяти строк из таблицы с данными:
df.head()
Дам Продажи Сезонность Средняя цена Л «ции Наружна Промо Интернет PR Публикации Известность Рекламные контакты Лояльно, ть Поиск Конкурент 1 Конкурент Кон 2
0 20U. 01-01 1536 1.127785 27 0 4703 0 18’5 38! 40С 0.095 3994 0.612 22990 29149 З’беЗ
1 2014- 02-Э’ 1512 14M-C 29 с 5’91 0 17П 385 39С 0.095 4 $49 С.618 23404 24’8’ 381-58
2 2014- 03-01 1329 ’0’5061 29 0 4961 0 1657 429 369 0.095 4362 0.579 22114 2390' 35373
3 2014- 04-0' 1366 0079785 29 0 43’5 0 39’5 434 365 0095 3884 059’ 1,9824 20162 32273
4 3014- 05-0’ 1036 С’6С463 31 с 4229 0 3727 4’8 358 0.145 5620 0 54’ 18464 166Х 31031
Рисунок 3 - Результат вывода при помощи функции read excel()
Теперь построим гистограмму по столбцу «Продажи» с 5 карманами (ин-
тервалами), обычно, выбирают от 3 до 15.
plt.figure(figsize=(10,5))
sns.distplot(df[ ’Продажи' ], colorss’g', hist_ky.s={’alpha' :0.4}, bins-5)
Рисунок 4 - Построение гистограммы при помощи sns.distplot()
Построим график продаж но месяцам:
df [ ['Продажи']].plot figsize=(18,3))
Рисунок 5 - Линейный график при помощи метода plot
Добавим к этому же графику график количества рекламных контактов:
'Рекламные контакты'''.plot figsize=(15j3))
plt.figure()
df Г['Продажи',
plt.legcna();
Рисунок 6 - График с продажами
и рекламными контактами
Теперь построим диаграммы рассеивания пар признаков по продажам, се-
зонности, средней цене, наружке, промо, интернету и известности.
sns.pairplot - функция, которая может создать сетку осей, через которую
каждая числовая переменная, хранящаяся в данных, распределяется по осям X
и Y в структуре столбцов и строк.
srs.pairplot(df[[’Продажи', ’Сезонность , 'Средняя цена', 'Наружна', 'Промо', 'Интернет*, 'Известность']],he£ght«3)
Рисунок 7 - Результат функции sns.pairplot
Диаграммы рассеивания пар признаков показывают зависимости, что по-
может при расчете парных корреляций.
df.corr() - функция для поиска корреляций между столбцами данных.
df.corrj)
Продажи Сезонность Средняя ценз Акции Наружи» Пре ио Интернет PR Публикации Иадсстиость РскаТамные агомтакты Лоильиость Поиск
1000006 0.451*95 0863836 0’78902 0460641 0.261046 01Ш96 0.2C6920 0.201714 0220181 0546700 0516626 04С6099
Сезонность 0x5149$ 'СОХО? 039643$ 0129791 0106189 0 164096 0171114 0.278840 0.352332 0166217 0564196 0056930 0713460
Средняя ценл 0863816 0296415 ЮОСООО 0502519 0457103 0.0’1371 0 318938 0.124*82 0329587 O5OLC51 0280960 0446159 0.197918
Акции 0 738902 0.129791 0502519 КчхОО’ 0227619 0.384887 0 506933 0.115396 0467995 016736С С.65239* 0577653 04460)7
нэружкз U1460641 0105'89 J457 W3 0227619 1ОСООТО 0.6’78^6 J 439744 0177631 0.559314 М669705 0235948 007’883 03126СС
ромэ 026*046 0.164С98 001’371 0384887 ОД* 7896 1 ’OjjCO 0Л72а49 011564$ с848205 Об»’ $02 07583*4 0462158 0668353
Интернет 0106396 -0171114 0118918 0358933 0439744 0.572849 иХйийо 0.165392 0580723 0740952 С^17«^ 0099*02 0450164
И» 030,92с 0278841 0122484 0115396 0.177631 13’5645 0165392 1.ЭОООСО 0882314 01241411 0056785 024Л60 (M2S2S4
Публикации 0201714 0252332 0029587 0467095 0 559314 6.8462L5 0 580723 ’.582314 1 200000 0582684 О7ХМ01 0584688 0’38192
Известность 0220161 0.166217 050CG5T 0 167360 0669755 0.691502 0741Я52 0.12*141 8 58268* IOOluO 0472588 0004285 0477195
Рекламные контакты 0.546700 С 564’96 02Э096С 0652394 0235946 0.758344 05’7097 055678$ 0 750401 0472588 IXXKOO 0355592 1>94. 20,
>ОК Ль г Ь(П. 0$1ы>26 C05W3C Ц44Ы59 0577653 0071883 С 462158 оотз; 0.243160 O.$89t>88 ОиО42в5 0355592 icuuooe О16739С
Поис* В *ЗЫН9 (1711460 Q197918 044ВО67 32-2680 O.GC8353 u4$0lb4 0.125254 8.708393 0477195 С 94028,' 0167397 юэоазо
сОн./рсг» С 4-4456 '.964213 0 381077 QIS’-495 0142*42 €.048547 0183*81 О.2242Ы 8257353 0186G33 0.461858 0008270 065298*
Конкурент i 0603970 '..«0940? 0473656 029*539 0269689 0-173588 000074 0.178919 0.235202 0058686 0631489 0055357 07568’9
Конкурент J 0194866. 1031969 О073258 0145*75 0206893 0.3G44Q1 0099056 0.331M8 0.561908 0221472 0 698122 006Т132 0638656
Рисунок 8 - Поиск корреляции при помощи df.corr()
При помощи sns.heatmap построим тепловую карту, выведем корреляции
0,3 и < 0,3.
corn = cf.corrj)
plt.figure(figsize=(14, 14);
sns.heaTnap(corr\(ccrr >= 0.3) | (corn <= -0.3)],
стзр= '"RdBu_r", vmax=1.0, vmin=-1.0, linewidths=0.1,
аппо1=Тгие, annot_kws={"size : 8}, square=True);
гМ>ли»аа<«|»
Ulfc, ТНЛ ТЬ
«вп-МкТЬ
Л» «г» по т*
Г.МО
И>«" »Р»И1 1
КОивУР«НТ 2
Кьмкуре-нг 3
Рисунок 9 - Результат построения тепловой карты
Судя по тепловой карте, сезонность и количество поисковых запросов по
первому конкуренту попали в один кластер, акции и лояльность попали в дру-
гой кластер. Можно привести к более удобному виду:
cor=df.corr()
зг=[]
for i in df.columns[2:]:
#print(round(variation(df[i])J4)J ’\t'j round (cor [ 'Продажи' ] [i ]_, 4), i)
ar.append'^, rcund(variation(df [i]) ,4), ~ound(co< Продажи ’] 'i ] ,4) ])
Pf_cv=pd.DataFrame(ar, columns=[ Признак', 1 Вариация'Корреляция‘])
df_cv
Признак Вариация Корреляция
0 Сезо—ость 0.1258 С4515
1 Средняя ценз 0.0508 -С 8638
2 Акции 3.3166 С.7089
3 Наружкз 0.1926 0.4606
4 Г ромо 1.0609 С 2610
5 Ин-ер нет 0.3476 -01063
6 PR 0.2861 -С.2069
7 Публикации 0.1623 С 2017
8 Изе ес_- ость 0.1951 -0.2202
9 Рекламное кон-зк~ы 0.1800 С 5467
10 Лояльность 0.1054 С 5166
11 Поиск 0.1633 С 4061
12 Конкурент 1 0,1588 0.4145
13 Конкуре*’-2 0.0732 С 6040
14 Конкурент 3 0.1424 С 1949
Рисунок 10 - Ьолее удобное представление при помощи df.corr()
Результат кластеризации, где видна связь сезонности и первого конкурен-
та: sns.jointplot - функция показывает совместное распределение по двум пере-
менным.
х- 'Сезонность'
у='Конкурент 1'
sns.jointplot(х=х, у=ул daxa=d^, kind='reg');
pit.xlacel(x);
pit.ylabel(y);
plt.show();
Сезонкость
Рисунок 11 - sns.jointplot но Конкуренту 1 и Сезонности
Проведем аналитику при помощи методов кластеризации. Для отбора
признаков кластеризации, можем использовать clustermapO из библиотеки
Seaborn. Эта функция поможет построить кластерную карту, которая покажет
количество попаданий точек в каждую ячейку.
plt.figure(figsize=( 14,14))
sns.clustcrmap(df.corr())
<seabom.matrix.ChisterGrid at 0x7id7baac3etl)>
<Figure size lOOSxIOOX with 0 Axcs>
Результат:
Наружка
PR
- Продажи
Интернет
- 08
04
00
Средняя цена
Конкурент 3
- Конкурент 2
- Сезонность
- Конкурент 1
-Акции
Лояльность
Известность
-Промо
-Публикации
3
£
7
С
5
Рисунок 12 - Тепловая карта при помощи clustermapf)
с учетом иерархической кластеризации признаков
- Рекламные контакты
Таким образом, можно сделать вывод, что иерархическая кластеризация
может быть удобна в тех случаях, когда данные представлены в неявном виде,
немаркированные и насортированные. Python не грсбует больших вычисли-
тельных мощностей, что позволит производить анализ большого количества
данных без нужды в мощном ПК. Кроме того, библиотеки для анализа распро-
страняются в бесплатном формате, что позволит проводит анализ любому же-
лающему пользователю.
Искусственная нейронная сеть
1.1. Упаковка Python и библиотеки NumPy
Установочный файл Python находится на официальном сайте
www.pMhon.org в разделе «Downloads». Рекомендуется поставить галочку
«Add Python 3.x to PATH» (рис. 1), которая добавляет путь до выполняемых фай-
лов Python в системную переменную РА ГН. После нажатия кнопки «Install
Now» произойдет установка.
Рисунок 1 - Установка Python
Вместе с версиями Python 2.7.9+ и Python 3.4+ автоматически устанавли-
вается стандартный менеджер пакетов Python - pip. С его помощью мы устано-
вим библиотеку NumPy.
NumPy - это библиотека языка Python, помогающая в разнообразных ма-
тематических вычислениях. Для установки NumPy откройте командную строку.
Чтобы установить NumPy с менеджером пакетов для Python 3, выполните сле-
дующую команду:
pip install numpy
Pip загружает пакет NumPy и уведомляет, что он был успешно установ-
лен.
Также понадобятся библиотеки pandas и sklearn. Pandas - программный
модуль, предназначенный для обработки и анализа данных. Sklearn -для ма-
шинного обучения. Установка аналогична.
Саму программу можно писать как в текстовом редакторе и сохранить
файл с расширением «.ру», так и в любой удобной IDE.
1.2. Пример работы простой нейронной сети в Python
Рассмотрим пример построения и обучения простой нейронной сети в
Python.
Представим, что перед нами стоит задача: необходимо спрогнозировать
баллы, которые будут получены студентом на экзамене в зависимости от сле-
дующих входных признаков: пол студента, пообедал ли студент перед экзаме-
ном, закончен ли курс подготовки к экзамену.
Для начала посмотрим простую нейронную сеть, а затем будем трениро-
вать ее на реальных данных.
Построим сеть, состоящую из 3 слоёв: входной, скрытый и выходной
(рис. 2).
Output
Input
Оценка
Рисунок 2 - Архитектура нейросети
Создадим класс нейронной сети в python и его конструктор, который
имеет входной параметр learning-rate или скорость обучения, о котором было
упомянуто выше.
class Network(objecl):
INPUT DIM=3
HIDDEN DIM = 2
OUTPUT DIM = 1
def init (self, learning late):
sclf.weights_O_l = np.random.normal(0.0, 1.0, (self.HIDDEN DIM, self.INPUT DIM))
self.weights 1 2 ж np.random.normal(0.0, 1.0, (self.OUTPUT DIM, self.HIDDEN DIM))
seif.learning rate « np.arrayf [learning rate])
INPUT DIM, HIDDEN DIM, OUTPUT DIM - гиперпараметры, опреде-
ляющие размерность сети: входной, скрытый и выходной слои соответственно.
Пока сеть не прошла процесс обучения и подбора корректных весов по-
ставим ей рандомные веса, воспользовавшись функцией np.random.normal, ге-
нерирующей массив случайных значений согласно нормальному распределе-
нию, где первый параметр - среднее значение распределения, второй - стан-
дартное отклонение, и третий параметр - размерность массива. В нашем случае
нам необходимы многомерные массивы: 2 х 3 для весов идущих от первого
слоя ко второму (3 входных нейрона и 2 в скрытом слое) и 1 *2, соответствен-
но для второго и третьего слоёв.
Также определим метод, задающий функцию активации - сигмоид. Сиг-
моида очень часто применяется в задачах классификации, поскольку она явля-
ется непрерывной гладкой функцией и меняется в диапазоне от -I до 1.
def F(seJf, х):
return 1/(1+ np.cxp(-x))
Метод прямого распространения или вычисления выходных параметров в
зависимости от входных (вспомним пункт 2.5):
def forward(sclf, inputs):
outputs 2 = self.F(np.dot(sclt.weights 0 1, inputs))
outputs 3 = self.F(np.dot(self.weights 1 2. outputs 2))
return outputs 3
Функция dot() вычисляет скалярное произведение двух массивов. F -
функция активации.
Соответственно, inputs - входные параметры первого слоя, передаваемые
на вход функции, outputs 2 - результирующие параметры второго слоя, они же
являются входными параметрами третьего слоя, outputs 3 - выходные парамет-
ры сети.
Для того чтобы в результате работы сети были получены валидные пока-
затели и сеть не давала хаотичных выходов, необходимо подвергнуть ее про-
цессу обучения, схожего с эволюцией живого существа. Обучать сеть мы будем
методом обратного распространения ошибки.
Метод обратного распространения:
def back ward(self, inputs, expected predict):
inputs 1 = np,dot(self.weights_0 I. inputs)
outputs I = sclf.F(inputs_ 1)
inputs_2 - np.dot(sclf.weights_ I 2, outputs_1)
outputs_2 = self.F(inputs_2)
actual predict = outputs 2[0]
error layer 3 = np,array([actual _predict - expectedprediet])
gradient layer 2 = actual -predict * (1 - actual-predict)
weights delta layer 2 = error layer_ 3 * gradient layer 2
>el!.weights 1 2 -= (np.dot(wcights delta layer 2, outputs l.reshape( I, len(outputs 1)))) * sclf.leammg rate
error layer 2 = weights delta layer 2 * sei I . w eights I 2
gradient layer I = outputs 1 *(1 - outputs 1)
weights delta layer 1 = error layer 2 * gradient layer I
self.weights 0 I np.dot(inputs.rcshapc(len(inputs), 1), weights delta layer 1).T * sclf.leaming rate
В данном методе мы сначала проходим путь прямого распространения и
сохраняем в actual predict полученные значения. Далее идёт подсчет ошиб-
ку error layer 3) - разница между полученным и ожидаемым значением, под-
счет градиента и разницы весов. И на основе этих показателей вычисляем из-
менение для весов от скрытого слоя к последнему. Далее делаем то же самое
для предыдущих слоёв. Функция reshape() изменяет форму массива без изме-
нения его данных.
Для корректной работы будем тренировать сеть на реальных данных. Те-
стовые данные взяты с сайга: https://www.kaggle.com/spscientist/students-
performance-in-exams?select=StudentsPerforniance.csv
Поиск производился с помощью: https://datasetsearch.research.google.com/
a genoer A luncn a test preoarar on c... я main sco'e U reading score
fenraie 52X standard 65% none
ma:e 48% free'reduced 36% completed
female standard none 72 72
female standard completed 69 90
female standard none 90 95
male free/reduced none 47 57
»ale standard none 76 78
female standard none 71 S3
female standard completed 68 95
male free/reduced none 48 43
male frce/rcduced completed 64 64
female free/reduced none 38 60
ale standard none 58 54
male standard none 40 52
Рисунок 3 - Малая часть набора данных
Для того чтобы импортировать данные необходимо считать их в Data-
Frame с помощью библиотеки pandas, предварительно сохранив файл с расши-
рением csv в каталог с приложением.
data pd.read csv('./StudentsPerformance.csv')
Поскольку в dataset данные представлены в текстовом виде необходимо
предварительно их обработать:
gender map = {'female':O, 'male': I}
lunch map = {'frcc/rcduced'zO, 'standard' I J
test preparation course map = {'none':0, 'completed': 1}
dataflunch’] = data| lunch*].niap( lunch map)
data[’gcnder’] = data['gender'].map(gender map)
data['test preparation course'] = dataftest preparation course'].map(test preparation course map)
С помощью конструкции сШа[’название'] можно обратиться к столбцу
dataFrame и изменить его с помощью метода шар. Таким образом из текстовых
типов мы получаем числовое соответствие. На рис. 3 и 4 представлены данные
до и после преобразования
» 0 ООО
» 0 001
» 0 002
» 0 003
> 0 004
» 0 005
» 0 006
» 0 007
> 0 008
» 0 00$
» 0 01С
» 0 011
► 0 012
» 0 013
► 0 014
» 0 015
► 0 116
» 0 017
► 0 018
► 0 019
array((female' group В. 'bachelor's degree" standard none’, 12.
array([’female group C. some college ’standard’, completed. 69
anrayU female group 8’ "master's degree' standard none 90.95.
array([ mare, group A. ‘associates degree', free/reduced. none
arrayd maie. group C, some conege standard’, none 76.78.75],
arrayUfemale group 8. "assoc atesdegree" standard, none. 71.
arrayj’female group В some college.’standard. completed . 88.
arrayf' ma:e. group B. some college free/reduced. none 40, 43.
array(( male. 9'Oup D, high school. free/reduced. 'completed. 64.
array(('femaie’ group 8,’fogh schoo1 free/reduced . none 38.60.
array(!’maie. groupC. 'associatesdegree" standard, none,58.
arrayC’maie group D "assoc ate’s degree",’standard'‘none’40,
arrayK'femaie. gmup В. “high schoo» standard', ’none. 65.81,73].
72, 74] dtype-object)
90.88 dtype«object
93) dtype=object!
47.57 44]. dtype«object.1
otyoe-object)
83,78], dtype «object)
95.92]. dtyoe=objecu
39]. dtype «object)
64 67], dtype=object)
50]. dtype*objecl)
54. 52]. dtype=object)
52,43], dtype-object)
d type-object)
array((’ma!e . group A‘ some col lege’,’standard’, completed’ 78,72, 70], dtype-object)
arrayil'fema'e’ group A master's degree", standard’, none. 50 53. 58], dtype^oo.ecti
arrayfffemale' gmup C. some high school standard' none’. 69. 75 78], dtype=ob;ect)
array(('male group C. 'high school', 'standard', none' 88 89.86.. dtypetODjecti
arrayf] female' group B', some high school 'free/reouced', 'none'. 18. 32.28], dtype=opject)
arraytCmaie'. 'group C. "master’s degree", free/reduced’ completed’, 46.42.46]. dtype=objecti
arrayi; female дтир C. "associate's oegree" free/reouced' none 54 58,61]. dtype «object)
Рисунок 4 - Данные до преобразования
* 0 000 array, [0. group B. ‘bachelor's degree' 1 0.003357950000309541 72, 74], dtypewobject)
» 0 001 arrayi;0, ‘group C. 'some cohege'. 1.1.0.O3218O3541696331,90 88], dtype=object)
» 0 002 arrayt[O, group B. ‘master s degree", 1.0.0.04197437500386926.95.93]. dtype«object.
» 0 003 arraytf 1. group A‘, ‘associate's degree" 0,0.0 021919951390909503 57 44]. dtype=objecV
» 0 004 atrayfjl. group 0. 'some college'. 1.0 0.035445027781045156.78,75] dtype=oojecti
► 0 005 array\(G. group 8. “associate s degree". 1.0.0.03311311805860797.83 78]. dtype=oojecu
» 0 006 arrayi[0, ’group B.’scme college’, 1.1,004104161111489439 95.92]. dtype«object)
► 0 007 array((1, group B’, 'some college'. 0.0.001865527777949745,43.39], otype»ODject)
» 0 008 array((1, group D', high school'. 0,1,002934844444719592,64,67], d type=object j>
» 0 009 atraytlO. group B. 'tvgn scnooi. 0.0.0017722513890522578,60.50). dtype=objecu
► 0 010 array((1. group C, "assoc ate s degree". 1.0.0.027050152780271303.54. 52]. dtype=objectl
> 0 011 array((1. 'group O', “associate's degree", 1,0.0.01865527777949745,52 43]. dtype«object>
» 0 012 arraytlO. group B."h«gn scnooi. 1,0,0830314826391683355.81.73]. dtypeaobject)
» 0 013 array('1. group A some college 1,1.0 036377791670020025. 72. 70], dtypewobject)
» 0 014 arrayCO. group A', ‘masters degree" 1.0,0.023319097224371813,53. 58] dtype«object)
> 0 015 arraytlO. group C. 'some high school' 1.0 0.0321803541696331 75.78]. dtype=object)
» 0 016 arrayill. group C.'hign scnooi. 1.0.004104161111489439.89.86], dtype «object)
> 0 017 atray<[0, group8. somehignscnooi',C 0 0.008394875000’73853 32. 28], dtype=object)
» & П1А з-rrav/fl "лтипГ "mMter'c Налгм" Л 1 Л Л714Ч7ЧАОА4А477ЛАй 47
Рисунок 5 - Данные после преобразования
Кроме того, необходимо избавиться от «лишних» данных. Создадим от-
дельный DataFrame - х, который будет представлять только необходимые нам
входные признаки - пол (I - м/0 - ж), обед (1 - пообедал, 0 - не пообедал), курс
подготовки (1 - курс закончен, 0 - не закончен).
d = {'gender': pd.Serics(data['gender']),
'lunch' pd.Series(data[’lunch']),
'test preparation course': pd.Scrics(data['tcst preparation course']))
x= pd.DataFramc(d)
Так выглядиi массив входных данных:
[0:1000] [array([O, 1,0], dtype=mt64), a
> ** spec al variables
> * function variables
► Й 000 array([0,1,0], dtype=int64)
& 001 array([0,1,1], dtype=int64)
▻ e 002 array([0,1. 0], dtype=int64)
Й 003 array([1, 0, 0], dtype=int64)
t> Й 004 array([1,1,01, dtype=int64)
& 005 array([0,1, 0], dtype=int64)
► Й 006 array([0,1,1], dtype=int64)
Й 007 array([1, 0, 0], dtype='nt64)
> W 008 array([1, 0.1], dtype=int64)
й* 009 array([O, 0r 0]. dtype=int64)
* 010 array([1,1,0], dtype=int64)
> 011 array([1,1. 0], dtype=int64)
Й 012 array([0,1, 0], dtype=int64)
> & 013 array([1,1,1], dtype=tnt64)
* 014 array([0,1,0], dtype=int64)
й* 015 array([0,1, 0], dtype=rnt64)
W 016 arravffl 1 01 dtvne=int64)
Рисунок 6 - Входные данные
Выходными данными соответственно будут результаты экзамена. Возь-
мем математику. Данные по баллам сданного предмета необходимо нормализи-
ровать. О необходимости нормализации данных было упомянуто выше.
norm = preprocessing.normalize([data[’math score']]).transpose()
datafmath score'] = norm
Нормализация производится с помощью:
from sklearn import preprocessing
Для того чтобы не обучать и тестировать результаты обучения на одних
тех же данных, разделим данные на обучающую и тестовые выборки с помо-
щью функции train testsplit, которая принимает в себя следующие параметры:
входные данные, выходные данные, размер тренировочной выборки. Размер
тренировочного массива поставим 90 % от всего набора, соответственно тесто-
вая выборка будет 10 % от общего массива значений.
X tram. X test, у train, y test = tram test_split(x, data['math score'], train size-0.9)
Для того чтобы на каждом этапе понять насколько сеть близко подобра-
лась к выполнению задачи, мы введем метод который оценивает качество. Ка-
чество будет оцениваться среднеквадратическим отклонением. Метод прини-
мает на вход два значения, первое - то, что предсказала сеть, второе - ожидае-
мое значение из тестовой выборки.
defMSE(y, Y):
return np.mean((y-Y**2))
Зададим эпохи и скорость обучения сети:
epochs=1000
leamingrate = 0.9
Инициализируем объекта класса нашей сети
network = Nctwork(leaming_rate=leaming_rate)
Для обучения сети пройдёмся для каждой строки входных тренировоч-
ных данных для всех эпох и выведем на экран прогресс обучения и уровень
ошибки. Ошибка изменялась от 0.7 до 0.02. Эмпирическим способом подбора
эпох и скорости обучения - это наименьшее значение ошибки, которое удалось
достигнуть.
for е in ran e(epochs):
inputs_ = | ]
correct predictions = [J
i-0
while i < len(X_train.index):
network.backward! np.array(X train)[i], np.array(y train)[i])
inputs append! np.array(X train)[i])
correct jjredictions.appcnd(np.array(y train)[i])
i+= 1
train loss = MSE(network.forward(np.array(inputs_).T). np.arrayfcorrect jjredictions)),
sys.stdoul.write("M<)6y4eHne: p, Ошибка: {})".format(-.u(IOO * e/float(epochs))[:4], str(train loss)[:5]))
₽ C:\Program Files\Python39\python.exe
)6учение: 99.9, Ошибка: (0.02)e
Рисунок 7 - Обучение
Тестируем:
n - 0
while n < lcn(X test.index):
рппЦ"Тестовый данные: {} прогноз: {} ожидалось {}”. format! >tr(np. array (X test)[n]),
str(network.forward(np.array(X test)|n])).
np.array(y_tcst)|n]))
n+=l
0:
4:
8:
Резул ьтач ы:
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
данные:
данные:
данные:
данные:
данные:
данные:
данные:
данные:
данные:
данные:
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
Тестовые
[1
[1
[0
(0
[0
[0
[0
[0
[0
[0
О
1
0
1
1
1
1
0
1
0
данные: [0
данные: [0
данные: [0
данные: [0
данные: [1
данные: [0
данные: [1
данные: [1
данные: [0
данные: [О
данные: [0
данные: [1
данные: [1
данные: [0
0]
1]
0]
0]
0]
0]
0]
0]
0]
И
1
0
1
О
1
1
0
1
О
О
1
1
1
О
Прогноз:
Прогноз:
Прогноз:
Прогноз:
Прогноз:
Прогноз:
Прогноз:
Прогноз:
Прогноз:
Прогноз:
0]
0]
1]
0]
1]
0]
0]
0]
1]
1]
0]
0]
0]
1]
[0.01201276]
[0.00927586]
[0.04694263]
[0.03686967]
[0.03G86967]
[0.03686967]
[0.03686967]
[0.04694263]
[0.03686967]
[0.03764963]
Ожидалось
Ожидалось
Ожидалос ь
Ожидалось
Ожидалось
Ожидалось
Ожидалос ь
Ожидалос ь
Ожидалось
Ожидалос ь
Прогноз: [0.03686967]
Прогноз: [0.04694263]
Прогноз: [0.03114241]
Прогноз: [0.04694263]
Прогноз: [0.00927586]
Прогноз: [0.03686967]
Прогноз: [0.01201276]
Прогноз: [0.01010923]
Прогноз: [0.03764963]
Прогноз: [0.03764963]
Прогноз: [0.03686967]
Прогноз: [0.01010923]
Прогноз: [0.01010923]
Прогноз: [0.03764963]
[0.0256510]
[0.0340458]
[0.0205208]
[0.0377769]
[0.0233190]
[0.0405752]
[0.0377769]
[0.0195880]
[0.0135250]
[0.0359114]
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Ожидалось
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
[0.01363825]
[0.02477002]
[0.02642183]
[0.00090727]
[0.01355057]
[0.00370556]
[0.00090727]
[0.02735459]
[0.02334459]
[0.00173822]
[0.0251846]
[0.0228527]
[0.0368441]
[0.0242518]
[0.0345122]
[0.0237854]
[0.0303148]
[0.0242518]
[0.0429071]
[0.0293820]
[0.0265837]
[0.0284492]
[0.0298484]
[0.0317139]
Рисунок 8 - Результаты тестирования
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
Разница
[0.01168504]
[0.02408992]
[0.00570177]
[0.02269077]
[0.0252364]
[0.01308419]
[0.01830207]
[0.01414264]
[0.0052575]
[0.00826757]
[0.0102859]
[0.01834007]
[0.01973922]
[0.00593566]
Допустим, что предсказание «близкое», если разница между ожидаемым
и прогнозным значение по модулю меньше 0.009. Из ста наборов тестовых дан-
ных 73 предсказания оказались близки. Для сети из одного скрытого слоя, со-
стоящего из 2 нейронов - хороший результат. А более точные и сложные пред-
сказания достигаются более сложной архитектурой сети.
Рекуррентная нейронная сеть
Данный пример взят с сайга https://github.com/vzhoii842/nin-from-scratch
Данная рекуррентная нейронная сеть выполняет простой анализ настрое-
ния. В дальнейшем сеть определить - заданная строка несет позитивный или
негативный характер.
Текст Позитивный?
Я хороший Да
Я плохой Нет
Это очень хорошо Да
Это неплохо Да
Я плохой, а не хороший Нет
Я несчастен Нет
Это было хорошо Да
Я чувствую себя неплохо мне не грустно
файл data.ру - различает нас1 роение
train data
‘good’: True,
‘bad': False,
'happy': True,
'sad': False,
’not good': False.
'not bad': True,
'not happy’: False,
'not sad': True,
'very good': True,
'very bad': False,
'very happy': True,
'very sad': False,
'i am happy': T rue.
'this is good': True,
’i am bad': False,
'this is bad': False,
'i am sad': False.
'this is sad': False,
'i am not happy1: False,
'this is not good’: False,
'i am not bad'- True,
‘this is not sad’: True,
'i am very happy’: True,
'this is very good': True,
'i am very bad': False,
'this is very sad': False,
'this is very happy': True,
'i am good not bad’: True,
'this is good not bad': True,
'i am bad not good': False,
'i am good and happy': True.
'this is not good and not happy': False.
'i am not at all good': False.
'i am not at all bad': True,
'i am not at all happy': False,
'this is not at all sad’: True.
‘this is not at all happy’: False,
'i am good right now': True,
'i am bad right now': False.
‘this is bad right now': False,
'i am sad right now': False.
T was good earlier* True,
'i was happy earlier': True.
'i was bad earlier': False,
'i was sad earlier': False.
'i am very bad right now': False,
'this is very good right now': True,
'this is very sad right now': False,
'this was bad earlier*: False,
'this was very good earlier': True,
'this was very bad earlier': False,
'this was very happy earlier': True,
'this was very sad earlier*: False.
'i was good and not bad earlier1: True,
'i was not good and not happy earlier’. False,
'i am not at all bad or sad right now': True.
'i am not at all good or happy right now': False,
'this was not happy and not good earlier': False,
I
test data= {
'this is happy': True,
i am good': True.
'this is not happy’: False,
'i am not good’: False.
'this is not bad' True.
'i am not sad': True,
'i am very good': True,
'this is very bad': False,
'i am very sad': False,
'this is bad not good': False,
'this is good and happy': True,
'i am not good and not happy': False,
'i am not at all sad': Г rue,
'this is not at all good': False,
'this is not at all bad' True,
'this is good right now': True.
This is sad right now': False.
'this is very bad right now’: False,
'this was good earlier’: True,
'i was not happy and not good earlier': False,
}
Файл requirements.txt- задает век юр
пшпру= 1.16.3 |
Файл run.ру - обучает нейронную сеть, необходим для кешированный отдельных дан-
ных
import numpy as np
from numpy.random import randn
class RNN:
# Л many-to-one Vanilla Recurrent Neural Network.
def init (self, input size, output size, hidden size=64):
« Weights
self.Whh = ranJn(hidden size, hidden size) /1000
self.Wxh = randn(htdden size, input size) /1000
self.Why = randn(output size, hidden size) /1000
# Biases
self.bh - np.zeros((hidden size, 1))
self.by - np.zeros((output size, 1))
def forward(self, inputs):
•11
Perform a forward pass of the RNN using the given inputs.
Returns the final output and hidden state.
- inputs is an array of one hot vectors with shape (input size, 1).
HI
h = np.zeros((self.Whh.shape[0], 1))
self.last inputs = inputs
self.last hs = { 0; h }
# Perform each step of the RNN
for i, x in enumerate! inputs):
h = np.tanh(self.Wxh 'a x + self. Whh (aj h + self.bh)
self.last hs[i + 1] = h
# Compute the output
у = self.Why @ h + self.by
return y. h
def backpropt self, d y, learn rate=2e-2):
•11
Perform a backward pass of the RNN.
- d у (dL/dy) has shape (output size, 1).
- learn rate is a float.
M
n = len(sc1f.last inputs)
# Calculate dL/dWhy and dL'dby.
d Why = d у (oj self.last hs[n|.T
d by = d у
# Initialize dL/dWhh, dUdWxh. and dL/dbh to zero.
d Whh = np.zerosfsclf.Whh.shapc)
d Wxh = np.zeros(self.W'xh.shape)
d bh - np.zeros( self.bh,shape)
# Calculate dL-dh for the last h
# dL/dh = dL/dy * dy/dh
d h - self.Why .T (Й; d у
# Backprupagate through time.
for t in reversed(range(n)):
# An intermediate value. dL/dh * (1 - hA2)
temp = ((1 - self.last hs[t + 1] ** 2) • d h)
# dUdb = dL/dh *( 1 -hA2)
d bh += temp
# dL/dWhh = dL/dh * (1 - hA2) * h {t-1}
d Whh temp to, self.last hs[t].T
# dL/dWxh = dL 'dh • (1 - hA2) * x
d Wxh += temp (a, self.last inputs[t].T
# Next dL/dh - dL/dh * (I - hA2) * Whh
d h = self Whh @ temp
# Clip to prevent exploding gradients.
for d in [d Wxh, d Whh. d Why, d bh, d by]:
np.chpld, -1,1, out=d)
# Update weights and biases using gradient descent.
self.Whh — learn rate * d Whh
self.Wxh -= leant rate * d Wxh
self.Why -= learn rate * d W hy
self bh -= learn rate * d bh
self by -= learn rate * d by
Файл main.py
import numpy as np
import random
from mn import RNN
from data import train data, lest data
# Create the vocabulary.
vocab = list(set([w for text in tram data.keys() for w in text.splitf ’)]))
vocab size - len(\ocab)
pnnt('%d unique words found' % vocab size)
# Assign indices to each word.
word to idx = { w: i for i, w in enumerate( vocab) }
idx to word = { i: w for i, w in enumeratef vocab) }
#pnnt(word to idxfgood'])
#print(idx to word[0])
def crcatclnputs(tcxt):
m
Returns an array of one-hot vectors representing the words in the input text stnng.
- text is a string
- Each one-hot vector has shape (vocab size. 1)
m
inputs = U
for w in text.splitf'):
v = np.zeros((vocab size, 1))
v|word to idx[w]] = 1
inputs, appcnd(v)
return inputs
defsoftmax(xs):
# Applies the Softmax Function to the input array.
return np.exp(xs) / sum(np.exp(xs))
# Initialize our RNN!
mn = RNN(vocab size. 2)
def proccssData(data. backprop-Truc):
m
Returns the RNN's loss and accuracy for the given data.
- data is a dictionary mapping text to True or False.
- backprop determines if the backward phase should be run.
in
Hems = Iist( data.items(j)
random.shuffle(items)
loss = 0
num correct - 0
for x, у in items:
inputs = creatclnputs(x)
target = int(y)
# Forward
out, = mn.forward( inputs)
probs = softmaxlout)
# Calculate loss / accuracy
loss -= npJog(probs|target|)
num correct += int(np.argmax(probs) — target)
if backprop:
# Build dL-'dy
d L d у = probs
d L d v| target) -= 1
# Backward
mn backproptd L d y)
return loss / len(data), num correct / lemdata)
# Training loop
for epoch in ranget 1000):
train loss, train ace = processData(train data)
if epoch % 100 — 99:
printC— Epoch %d' % (epoch + 1))
printfTrain:\tLo$s %.3f j Accuracy: %.3f % (tram loss, train acc))
test loss, rest acc - processDaiaftest data. backprop^False)
print('Tesi:\tLoss %.3f | Accuracy: %.3f % (test loss, test acc))
Запуск данной рекуррентной нейронной сети
• Установка Pip
• Установка библиотеки numpy
• Запуск файла main.py
4 F*e Edit Selection View Go Run Terminal Help requrementsM ghbvth Vnuai Stutbo Code (AdriwaVaicr) -OX
© IapioHS ♦ mairipy I F requrements trt x ♦ Jalap, * mn.py ’ Ш •••
GH8VIH E requirements txt
p > _py«che_ > Indude > Ub 1 nunpy—1.16.3
3* > Sfnpti 3 OjrPUT IlFMlMi DEBUG CONSOLE QponenheT + * А X
♦ aau.py
fir* ♦ mairipy । а*кп_иост» написан» >мени, a raut налмчч и лрмгслы«ст. пути, после чего гиеторите погъгтку.
0 pyseriv.dg ♦ script
Bb° Г requircwicnts.txt
♦ mrtpy г * pu^ljsjuallfieotrrorid : comanofcru-ojWExceptlon PS C:\Users\>e<Konaii\Desktop>8hbvth> .\scripts\Activate.psl Ign&rtnj PS C:\users\HuKOJuA\Des>ctop\g^t>vtr» pip install You should consider upgraoing via the ‘c:\users\>»«onail\deslrtopXghbvth\scripts\python.exe -• pip install upgrade pip’ < UWWjnJ. (ghbvth) PS C:\Users\HHicanaA\Deslctap\87ibvth> pip Install пииру Collecting nuipy Duxnluadine пглру 1.22.2 cp39 cp39 win <«164.id>l (14.7 MB) Itllllllllllllllllimilllllllll M. - № Ь 4 Ht/s Installing collected packages: nurpy Successfully installed nunpy 1.22.2 WARMING: You are using pip version 20.2.3; however, version 22.9.3 is available. Ybu should consider upgrading via the ’c:V>s«rA\iMKOn.jH\di-sktop\ghbvth\$cripts\python.exe - pip install --upgrade pip"
(ghfrrth) PS C:\Users\HHKOnaM\Desktcp\ghbvth> python .Vaain.py Id unique words found — Epoch 100
Train: loss 0.497 | Accuracy: 9.586
> OUTUNt Test: Loss 0.699 j Accuracy: e.see
j Python3J5U?M txt ®0±3
Результаты функционирования алгоритма:
J Не I'd* уейчпюл View Go Run Twminal Help
requvements.txt - ghbvth - Vnual Studio Code (AdmmnhctrxJ
О X
©
p
3*
ЕГ*
e?
EXPlCfi»
C.HBVTH
> pycactw
> irdude
> lib
> scnpu
♦ datapy
♦ mun.py
О pyvemcfg
F reqiMemenKM
♦ mn.py
♦ m*n.py 1 1 retirements bf X ♦ datapy
E requirements.trt
1 IMWWW>>1 16 3
PROBLEMS 3 OUTPUT TtRMKAl DEBUG CONSOLE
♦' mnpy 2
0 powtnnrt -f- v г» X
> OUtllM
Python 392 мы ®UA3
— tpoch iw
Train; toss 0.687
Test: loss 0.699
— tpoch zw
Train loss 9.602
Test: loss 0.721
— Epoch 390
Train: loss 9.SSI
Test: loss 9.713
— tpoch 40!
Train: loss 0.403
Test: loss 9.546
— tpoch 590
Train LOSS 9.341
Test: LOSS 9.792
— Epoch oee
Train: loss 9.119
Test: loss 0.692
— tpoch TOO
Train: loss 0.018
Test: loss 9.557
---ipoch 800
Train. Loss 9.905
Test: LOSS 0.630
--- Epoch 900
Train' loss 9.093
Test: Loss 0.621
— Epoch 1909
Acciracy: 0.586
Accuracy: 9.590
Accuracy: 9.655
Accuracy: 0.450
Acciracy: 0.621
Accuracy: 9.590
Acciracy: 0.828
Accuracy: 0.200
Accuracy: 0.845
Accuracy: 0.550
Acciracy: 9.948
Accuracy: 0.858
Accuracy: 1.000
Accuracy: 9.950
Accuracy: 1.090
Acciracy: 0.950
Accvacy: 1.000
Acciracy: U.950
in I. UI 6 (5 selected) Spaces 4 ЦП 8 CRU рф eeqwremcnb 2? I?
'J File Edit Selection View
GO Run
lermwui Help
requrementstxt - ghbrth Visual Studio Code |AdmmnV«t<x)
LxAOMft
v GHBVTH
> .pycadie
> include
> Ub
> Soipls
♦ datapy
♦ mvripy
О pyvenvjrtg
t rtduweffientvbct
♦ tnttpy
♦ main.py 1
S reqjiren'ents.txt
S reqmremenn MX ♦ datapy
ливру--!.16.3
HioeiEMS
(ХРНЛ ПКШМЛ 0E9UG CONSOLE
— Epoch ЛЛ
Train* Loss 0.018 | Accuracy: 1.000
Test: loss 0.SS7 j Accuracy: 0.959
— Epoch 8W
Train; loss 0.005 | Accuracy: 1.860
Test: Loss 6.630 j Accuracy: 0.958
— Ipottl 900
Train: toss 0.983 | Accuracy: 1.090
Test: LOSS 9.671 j Accuracy: 0.950
— Epoch 1060
Train: Loss 6.602 | Accuracy: l.eeo
Test: toss 0.707 j Accuracy: 0.956
. PS < ; Ulwr-.'iHiw. ia»i\Drsktop\ghbvth |
♦ mn.py
> OUIVNI
О X
m
P
2
Pydinn 392 id 1Л ЙК1&1
Ln 1,Col01>MteOcd) Sp«.ev4 VII -8 СШ ppmjuurmentx IS
Программа выдала 10 результатов анализа настроения, а также потери ре-
куррентной нейронной сети и потери в точности данных.
Выходные данные представляют либо позитивное настроение, либо
негативное. В конечном счете выбор определяется между двумя этими пара-
метрами (позитивным и негативным).
В данном примере результирующая строка имеет положительный резуль-
тат (то есть, интерпретируя результат функционирования алгоритма можно ска-
зать, что ответ характеризуется позитивным настроением в конкретной ситуа-
ции).
Библио» рафический список
1. Wolpert, David Н. Stacked generalization // Neural networks 5.2 (1992): 241-
259
2. Breiman, Leo. Bagging predictors // Machine learning 24.2 (1996): 123-140.
3. Breiman, Leo. Random Forests // Machine Learning, 45(1), 5-32, 2001
4. Freund, Yoav, Robert Schapire, and N. Abe. A Short Introduction to
Boosting // Joumal-Japanese Society For Artificial Intelligence 14.771-780
(1999): 1612
5. Friedman, Jerome IL Stochastic gradient boosting // Computational Statis-
tics and Data Analysis, 2002
6. Журавлёв К). IL Об алгебраическом подходе к решению задач распозна-
вания или классификации // Проблемы кибернетики. 1978
7. Skurichina М., Duin R. Р. W. Limited bagging, boosting and the random sub-
space method for linear classifiers // Pattern Analysis & Applications. 2002.
Pp. 121-135.
8. Jahrer, Michael. Netflix Prize report 2009 // http://elf-project.sourceforge.
net/CombiningPredictionsFor AccurateRecommenderSystems.pdf
9. Toscher, Andreas and Jahrer, Michael. The BigChaos Solution to the Net-
flix Grand Prize // 2009, http://www.netflixprize.com/assets/GrandPrize2009
В PC BigChaos.pdf
10. Menahem, Eitan, Lior Rokach. and Yuval Elovici. Troika-An improved stack-
ing schema for classification tasks // Information Sciences 179.24 (2009):
4097-4122.
11. Seewald, A. How to Make Stacking Better and Faster While Also Taking Care
of an Unknown Weakness // Nineteenth International Conference on Ma-
chine Learning (pp. 554-561) (2002)
12. Jordan, Michael L, and Robert A. Jacobs. Hierarchical mixtures of experts
and the EM algorithm // Neural computation 6.2 (1994): 181-214.
13. Allen Downey, Jeffrey F.lkner, Chris Meyers. How to Think Like a Computer
Scientist - Green Tea Press. 2008. - 250 c.
14. Линейная регрессия. Википедия - открытая энциклопедия [Электронный
ресурс]. - URL: hltps://ru.wikipedia.org/wiki/Jlинeйнaя_pe]peccия
15. Основы линейной регрессии [Электронный ресурс]. - URL:
http://statistica.ru/theory/osnovy-lineynoy-regressii/
16. Полное руководство по линейной регрессии в Scikit Learn [Электронный
ресурс]. - URL: https://pythonru.com/uroki/lmear-regression-skleam
17. Библиотека Pandas - типы данных [Электронный ресурс]. - URL:
https://mipt-stats.gitlab.io/courses/python/08_pandas 1.1Пт1#5.-Интсрвалы-
времени
18. skleam.linear model.LinearRegression [Электронный ресурс]. - URL:
https://scikitleam.org/stable/modules/generated'skleam.linear modcl.LinearRegre
ssion.html
19. Andreas C. Miller, Sarah Guido. Introduction to Machine Learning with Python -
O’Reilly Media. 2017. - 367 c.
20. Уэс Маккинни. Python и анализ данных. - O'Reilly Media. 2015. -466 с.
21. Орельен Жерон. Прикладное машинное обучение с помощью Scikit-Learn и
TensorFlow - O'Reilly Media. 2018. - 662 с.
22. Дж. Клейнберг, Е. Тардос. Алгоритмы: Разработка и применение - СПб.:
Питер. 2016 - 800 с.
23. Педро Домингос. Верховный алгоритм - Манн, Иванов и Фербер. 2016 - 315 с.
24. Wiley Brand. Python for Data Science for Dummies - John Willey & Sone. 2015.
-407 c.
25. The Python Manual - Black Dog i-Tech Series. 2018. - 160 c.
26. Brett Slatkin. Effective Python - Addison Wesley. 2015. - 650 c.
27. Yeradis P. Barbosa Marrero. The Python Tutorial 2.7. - Leanpub. 2014. - 127 c.
28. Arun Tigeraniya. Python Unlocked - Packt Publishing. 2015. - 147 c.
29. Fabrizio Romano. Learning Python - Packt Publishing. 2015.-405 c.
30. Майкл Солтис. Введение в анализ алгоритмов - СПб.: ДМК. 2019. - 269 с.
31. David Julian. Designing Machine Learning Systems with Python - Packt Publish-
ing. 2016.-209 c.
32. Rick van Hattem. Mastering Python - Packt publishing. 2016. - 451 c.
33. Obi Ike-Nwosu. Intermediate Python - Leanpub. 2016 - 169 c.
34. B.J. Korites. Python Graphics - Apress. 2018 - 359 c.
35. Дэвид Колец. Классические задачи Computer Science на языке Python -
СПб.: Питер. 2020 - 256 с.
36. Danish Haroon. Python Machine Learning Case Studies - Apress. 2017 - 201 c.
37. H.A. Прохоренок, B.A. Дронов. Python 3: Самое необходимое - СПб.: БХВ-
Петсрбург. 2019 - 608 с.
38. Mark Lutz. Python Pocket Reference - O'Reilly Media. 2014. - 243 c.
39. Мэтт Харрисон. Как устроен Python - СПб.: Питер. 2019. - 272 с.
40. Python Уроки Второе издание.
41. Richard Moore. Python Machine Learning - O'Reilly Media. 2019. - 254 c.
42. Dmitry Zinovier. Complex Network Analysis in Python - The Pragmatic Book-
shelf. 2018.-219 c.
43. Марк Лутц. Изучаем Python - СПб.: ООО «Диалектика» 2019. - 832 с.
44. Томас Кормен, Чарльз Лейзерсон. Алгоритмы: построение и анализ, 3-е из-
дание - М.: ООО И.Д. Вильямс. 2013. - 1328 с.
45. Dimitrios Kouzis-Loukas. Learning Scrapy - Packt Publishing. 2016. - 243 c.
46. Ной Гифт. Программный ИИ - СПб.: Питер. 2019. - 304 с.
47. Доля П. Г. Введение в научный Python - Харьковский Национальный Уни-
верситет. 2016. - 265 с.
48. Sergio Rojas. Prealgebra VIA Python Programming - Caracas. 2018. - 257 c.
49. Andrew N. Harrington. Hands-on Python Tutorial - Loyola eCommons. 2015. -
170 c
50. Daniel Arbuckle. Learning Python Testing - Packt Publishing. 2014. - 314 c.
51. Джон Пол Мюллер, Лука Массарон. Искусственный интеллект для чайни-
ков - СПб.: Диалектика. 2017. - 354 с
52. Samir Madhavan. Mastering Python for Data Science - Packt Publishing. 2018. -
276 c.
53. Joe Thompson. Python’s Companion - Packt Publishing. 2015. - 211 c.
54. Mark J. Johnson. A Concise Introduction to Programming in Python Second Edi-
tion. - CRC Press. 2018. - 197 c.
55. Освальдо Мариш. Байесовский анализ на Python. - М.: ДМК Пресс. 2020. -
340 с.
56. Coding for Python - Black Dog i-Tech Series. 2019. - 160 c.
57. Sunil Kapil. Clean Python - Apress. 2019.-261 c.
58. Изучение LVQ | Электронный ресурс]. - Режим доступа:
https://coderlessons.com/tutorials/akademicheskii/izuchite-iskusstvennuiuneiron-
nuiu-set/izuchenie-vektora-kvantovaniia
59. Learning Vector Quantization [Электронный ресурс]. - Режим доступа:
https://towardsdatascience.com/learning-vector-quantization-ed825f8c807d
60. Learning Vector Quantization [Электронный ресурс]. - Режим доступа:
https://www.geeksforgeeks.org/leaming-vector-quantization/
61. Реализация Learning Vector Quantization [Электронный ресурс]. -
Режим доступа: https://machineleamingmastery.com/implernent-learning-vector-
quanti-zation-scratch-python/
62. Джульен Данжу. Путь Python. - СПб.: 11итер. 2020. - 256 с.
63. Wiley Brand. Python all-in-one. - Dummies. 2019 - 647 c.
64. Кэмерон Дэвидсон - Пайлон. Вероятное программирование на Python. Бай-
есовский вывод и алгоритмы. - СПб.: Питер. 2019. - 256 с.
65. David Корес. Classic Computer Science Problems in Python. - Manning Shelter
Island. 2019.-201 c.
66. Steven L. Gordon and Brian Guilfoos. Introduction to Modeling and simulation
with MATLAB and Python. - CRC Press. 2017. - 183 c.
67. Дэвид Бизли, Брайан К. Джонс. Python Книга рецептов. - М.: ДМК Пресс,
2019. 648 с.
68. Naomi Ceder. The Quick Python Book. - Manning Press. 2018. - 431 c.
69. Bastiaan Sjardin, Luca Massaron. Large Scale Machine with Python. - Packt pub-
lishing. 2018. - 358 c.
70. Robert Johansson. Numerical Python. - Apress. 2018. - 358 c.
71. Moshe Zadza. DevOps in Python. - Apress. 2019 - 165 c.
72. Yinyan Zhang. Deep Reinforcement Learning with Guaranteed Performance. -
Springer Press. 2020. - 265 c.
73. Брайан Макмахан, Делии Pao. Знакомство c PyTorch. - СПб.: Питер. 2020 -
256 с.
74. Amit Nandi. Spark for Python Developers. - Packt Publishing. 2018. - 219 c.
75. Ivan Idris. Python Data Analysis. - Packt Publishing. 2014. -319 c.
76. Serge Kruk. Practical Python Al Projects. - Apress. 2018.- 271 c.
77. Fabio Nelli. Python Data Analytics. - Apress. 2015. - 331 c.
78. Richard L. Halterman. Fundamentals of Python Programming. - Packt Publish-
ing. 2014. - 269 c.
79. Luke Sneeringer. Professional Python. - Manning Press. 2016. - 321 c.
80. Gabriele Lanaro. Python High Performance Programming. - Packt Publishing.
2013.-93 c.
81. Framcisco J. Blanco-Silva. Mastering SciPy. - Packt Publishing. 2015. - 375 c.
82. Donald J. Norris. Beginning Artificial Intelligence with the Raspberry Pi. -
Apress. 2017. - 363 c.
83. Sam Abrahams, Danijar Hafner. Tensorflow For Machine Intelligence. - Bleed-
ing Edge Press. 2016. - 245 c.
84. Pratap Dangeti, Allen Yu, Claire Chung. Learning Path Numerical Computing
with Python. - Packt Publishing. 2018. - 419 c.
85. J.T.Wolohan. Mastering Large Datasets with Python. - Mannig Press. 2019. -
365 c.
86. Yves Hilpisch. Derivatives Analytics with Python. - Willey Press. 2015. - 347 c.
87. Cay Horstmann, Rance Necaise. Python for Everyone. - Willey Press. 2012. -
311 c.
88. Massimiliano Pippi. Python for Google App Engine. - Packt Publishing. 2015. -
175 c.
Приложение А. Варианты задании для самостоятельной реализации
моделей машинною и глубокого обучения
В данном блоке задач представлены ссылки на исходные наборы данных.
При использовании этих отобранных данных вы сможете решить поставленную
задачу (сформулированную в описании каждой URL ссылки).
Задачи, представленные в Приложении 1, отобраны таким образом, что
они не требуют от вас дополнительных усилий по аудиту исходного датасета,
включения в него непрофильных сведений и прочего. Датасет является един-
ственным источником данных, что существенно упрощает задачу, позволяя
сконцентрировать всё своё внимание на реализации алгоритма машинного обу-
чения (алгоритм определяется по полученному от преподавателя варианту).
1. Задача из медицинской сферы по определению бокового амиотрофиче-
ского склероза.
URL: https://www.kaggle.com/alsgroup/end-als?select=end-als
2. Задача детекции цветка одуванчика и обособление его от других видов
цветов (растений)
URL: https://www .kaggle.com/coloradokb/dandelioniinages
3. Определение наличия сердечного заболевания
URL: https://www.kaggle.com/ronitf/heart-disease-uci
4. Набор данных по определению элементов одежды
URL: https://www.kaggle.com/zalando-research/fashionmnist
5. Анализ текстов отзывов покупателей от крупной коммерческой торговой
площадки
URL: https://www.kaggle.com/olistbr1jrazilian-ecommeree
6. Задача предсказания дождя на следующий день в Австралии
URL: https://wwrw.kaggle.com/jsphyg/weather-dataset-rattle-package
7. Набор данных, содержащий более 90.000 изображений фруктов. Задача
определения его названия
URL: https://wrwrw.kagglc.com/moltcan/fruits
8. Задача определения вида (класса) птицы. Набор содержит 315 видов птиц
URL: https://wwAV.kaggle.eom/gpiosenka/lOO-bird-species
9. Мультиклассовый тест на классификацию одного изображения
URL: https://WAvw.kaggle.com/meowTneowmeowmeowmeow/gtsrb-german-traiTic-
sign
10. Определение знаменитостей по фотографии лица
URL: https://www.kaggle.com/jessicali9530/celeba-dataset
11/Задача отдела кадров в машинном обучении: спрогнозировать вероят-
ность того, что кандидат будет искать новую работу или останется рабо-
тать в компании
URL: https://www.kaggle.com/arashnic/'hr-analytics-job-change-of-data-scicntists
12. Определение дермоскопических поражений кожи
URL: https://www.kaggle.com/kmader/skin-cancer-mnist-ham 10000
13. Набор данных реальных и поддельных объявлений о вакансиях на тру-
доустройство
URL: https://w'ww.kaggle.com/shivamb/real-or-fake-fake-jobposting-prediction
14. Определение аритмии или инфаркта по данным сердцебиения
URL: https://www.kaggle.com/shayanfazeli/heartbeat
15. Обучение модели на заголовках новостей
URL: https ://www .kaggl e. com/ rmi sra/news-caiegory-daiaset
16. Определение стоимости жилья в пригородах Бостона
URL: https://www.kaggle.com/arslanali4343/real-estaic-dataset
17. Диагностика заболеваний крови по ее образцам
URL: https://www.kaggle.com/paullimothymooney/blood-cells
18. Набор данных заголовков новостей для обнаружения в них сарказма
URL: https://www.kaggle.corrvnnisra/news-headlines-datasel-for-sarcasm-detection
19. Набор данных по определению Стэнфордских собак
URL: https://www.kaggle.com/jessicali9530/stanford-dogs-dataset
20. Задача определения типа еды (от яблока до вафель)
URL: https://www.kaggle.com/kmader/food41
21. Изображения всех покемонов от поколения 1 до поколения 7, а также их
типы (первичный и вторичный) в виде csv
URL: https://w4vw.kaggle.com/vishalsubbiah/pokemon-images-and-types
22. Крупномасштабный набор данных для сегментации и классификации
рыб
URL: https://w4vw.kaggle.com/crow4vw/a-large-scale-fish-datasel
23. Набор данных музыки. В задачи входит определения ноты / инструмента /
композитора
URL: https://www.kaggle.com/imsparsh/musicnet-dataset
24. Набор автомобилей Стэнфорда, в задачи входит определение марки
URL: https://www.kaggle.corn/jcssicali9530/stanford-cars-datasct
25. Естественные изображения. Скомпилированный набор данных из 6899
изображений из 8 различных классов.
URL: https://www.kagglc.com/prasunroy/natural-images
Книги почтой
Заказ можно сделать на сайте издательства
жи»./nfra-e.ru
№ п/п Наименование книги
1 API в разработке приложений Autodesk Inventor. Практическое руководство
2 Алгоритмы Data Science и их практическая реализация на Python
3 Анализ и моделирование типовых систем массовою обслуживания
4 Высокопроизводительные системы обнаружения вторжений
5 Интернет вещей для начинающих. Визуальное программирование микроконтроллеров семейства ESP8266
6 Информатика. Курс лекций
7 Микропроцессорные системы. Применение микроконтроллеров семейства AVR для управления внешними устройствами
8 Микропроцессорные системы. Разработка программного обеспечения для микроконтроллеров семейства AVR
9 Основы визуального программирования в среде VISUAL STUDIO на базе C#
10 Основы информационной безопасности
11 Основы работы с моделями машинного и глубокого обучения
12 Спецэффекты в компьютерной графике
13 Справочник 1Т-тсрминов
14 Теория информации. Лабораторный практикум в MATLAB
15 Техническое и программное обеспечение вычислительных машин и систем
Учебное издание
Пылов Пётр Андреевич
Мангак Роман Вячеславович
Дя1 плева Анна Владимировна
ОСНОВЫ РАБОТЫ С МОДЕЛЯМИ МАШИННОГО
И ГЛУБОКОГО ОБУ ЧЕН ИЯ
Учебное пособие
ISBN 978-5-9729-1547-7
Подписано в печать 28.04.2023
Формат 60x84/16. Бумага офсетная.
Гарнитура «Таймс».
Издательство «Инфра-Инженерия»
160011, г. Вологда, ул. Козленская. д. 63
Тел.: 8 (800) 250-66-01
E-mail: booking@infra-e.ru
https://infra-e.ru
Издательство приглашает
к сотрудничеству авторов
научно-технической литерату ры