суббота, 14 января 2023 г.

Машинное обучение с библиотеками PyCaret и TROT : классификация, часть вторая

 Продолжаем знакомиться с автоматизированным машинным обучением на примере работы с библиотекой PyCaret и рассмотрим с сайта библиотеки учебник по мультиклассовая классификация MCLF101  — уровень для начинающих.


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

  • Модуль классификации PyCaret (pycaret.classification) — это контролируемый модуль машинного обучения, который используется для классификации элементов в бинарные или полиномиальные группы на основе различных методов и алгоритмов.

Модуль классификации PyCaret можно использовать для задач двоичной или многоклассовой классификации. Он имеет более 18 алгоритмов и 14 графиков для анализа производительности моделей. В модуле есть настройка гиперпараметров, объединенные или расширенные методы, такие как наложение.

Для примера будем использовать набор данных Iris из UCI. Это, пожалуй, самая известная база данных, которую можно найти в литературе по распознаванию образов. Набор данных содержит 3 класса по 50 экземпляров в каждом, где каждый класс относится к типу ириса. Ниже приведены краткие описания каждого столбца:

  • sepal_length: длина чашелистика
  • sepal_width: ширина чашелистика
  • petal_length: длина лепестка
  • petal_width: ширина лепестка
  • species: один из трех классов (Setosa, Versicolor, Virginica), целевая колонка

Загружаем данные из репозитория данных PyCaret с помощью функции get_data()

from pycaret.datasets import get_data
dataset = get_data('iris')
sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa

Размерность данных

dataset.shape

(150, 5)


Сделаем случайную выборку из 15 записей и исключим ее из исходного набора. Используем ее для завершающего тестирования модели. 

Оставляем для дальнейшей работы 90% записей
data = dataset.sample(frac=0.9, random_state=786)
data_unseen = dataset.drop(data.index)
data.reset_index(drop=True, inplace=True)
data_unseen.reset_index(drop=True, inplace=True)
print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))

Data for Modeling: (135, 5)
Unseen Data For Predictions: (15, 5)

Настройка среды в PyCaret

Функция setup() инициализирует среду в pycaret и создает конвейер преобразования
для подготовки данных для моделирования и развертывания. setup() необходимо
вызывать перед выполнением любой другой функции в pycaret. Он принимает два
обязательных параметра: dataframe pandas и имя целевого столбца. Все остальные
параметры являются необязательными и используются для настройки конвейера
предварительной обработки

При выполнении setup() алгоритм вывода PyCaret автоматически определяет типы
данных для всех функций на основе определенных свойств. Тип данных должен быть
выведен правильно, но это не всегда так. Чтобы учесть это, PyCaret отображает
таблицу, предполагаемые типы данных после выполнения setup().
Если все типы данных идентифицированы правильно, можно нажать Enter,
чтобы продолжить, или выйти, чтобы завершить эксперимент. Обеспечение
правильности типов данных имеет фундаментальное значение в PyCaret, поскольку
он автоматически выполняет несколько задач предварительной обработки, которые
необходимы для любого эксперимента по машинному обучению. Эти задачи выполняются по-разному для каждого типа данных, поэтому очень важно правильно их настроить.

from pycaret.classification import * exp_mclf101 = setup(data = data, target = 'species', session_id=123,fold_shuffle=True)

После успешного выполнения установки распечатывается информационная сетка,
содержащая несколько важных фрагментов информации. Большая часть информации
относится к конвейеру предварительной обработки, который создается при выполнении
setup(). Большинство этих функций выходит за рамки данного руководства, однако на
этом этапе следует отметить несколько важных моментов: - **session_id : псевдослучайное число, распространяемое как начальное значение во
всех функциях для последующего воспроизведения. Если session_id не передан,
автоматически генерируется случайное число, которое распространяется на все
функции. В этом эксперименте для идентификатора session_id установлено значение
123 для последующей воспроизводимости. - **Target Type :** Бинарный или мультиклассовый. Тип цели автоматически
определяется и отображается. Нет никакой разницы в том, как проводится эксперимент для бинарных или мультиклассовых задач. Все функции идентичны. - **Label Encoded:** Если целевая переменная имеет строковый тип (например, «Да»
или «Нет») вместо 1 или 0, она автоматически кодирует метку в 1 и 0 и отображает
сопоставление (0 : Нет, 1 : Да) для справки. В этом эксперименте кодировка метки
применяется следующим образом: Iris-setosa: 0, Iris-versicolor: 1, Iris-virginica: 2. - **Original Data : ** Отображает исходную форму набора данных. В этом эксперименте (135, 5) означает 135 образцов и 5 признаков, включая целевой столбец. - **Missing Values :** Если в исходных данных отсутствуют значения, это будет
отображаться как «Истина». Для этого эксперимента в наборе данных нет пропущенных значений. - **Numeric Features :** Количество признаков, выведенных как числовые. В этом
наборе данных 4 из 5 функций выводятся как числовые. - **Categorical Features :** Количество признаков, определяемых как категориальные.
В этом наборе данных нет категориальных признаков. - **Transformed Train Set :** Отображает форму обучающего набора. Обратите
внимание, что исходная форма (135, 5) преобразуется в (94, 4) для обучающей части - **Transformed Test Set :** Отображает форму тестового набора.
В наборе для испытаний/выдержки 41 образец. Это разделение
основано на значении по умолчанию 70/30, которое можно изменить с помощью
параметра «train_size» в настройках.

Сравнение всех моделей

Сравнение всех моделей для оценки производительности является рекомендуемой
отправной точкой для моделирования после завершения настройки (если вы точно
не знаете, какая модель вам нужна, что часто бывает не так). Эта функция обучает все модели в библиотеке моделей и оценивает их, используя стратифицированную
перекрестную проверку для оценки метрик. На выходе выводится сетка оценок, 
в которой показаны средние значения AUC, Recall, Prce, F1, Kappa и MCC по
фолдам (по умолчанию 10), а также время обучения.

best = compare_models()


ModelAccuracyAUCRecallPrec.F1KappaMCCTT (Sec)
knnK Neighbors Classifier0.95780.99630.95560.96580.95530.93640.94100.0140
qdaQuadratic Discriminant Analysis0.95670.99630.95000.96750.95470.93390.94010.0120
ldaLinear Discriminant Analysis0.95670.99630.95000.96750.95470.93390.94010.0090
nbNaive Bayes0.94780.99430.93890.96080.94550.92020.92750.0110
lrLogistic Regression0.94670.99630.93890.95440.94500.91870.92310.7990
gbcGradient Boosting Classifier0.93670.98750.93330.94990.93360.90450.91210.1160
lightgbmLight Gradient Boosting Machine0.93670.99630.92780.95550.93220.90360.91440.1840
dtDecision Tree Classifier0.92560.94520.91670.94160.92140.88690.89620.0100
etExtra Trees Classifier0.92560.99340.91670.94160.92140.88690.89620.1230
xgboostExtreme Gradient Boosting0.92560.97300.91670.94160.92140.88690.89620.0440
catboostCatBoost Classifier0.92560.99630.91670.94160.92140.88690.89620.3760
rfRandom Forest Classifier0.91560.98930.90560.93410.91110.87170.88230.1430
adaAda Boost Classifier0.90440.98770.89440.92580.89970.85510.86730.0500
ridgeRidge Classifier0.86220.00000.85000.88350.85820.79150.80380.0120
svmSVM - Linear Kernel0.81890.00000.80000.73890.76300.72220.76900.0100


Таким образом обучили и оценили 15 моделей с использованием перекрестной проверки. Напечатанная выше сетка оценок выделяет самые эффективные показатели только для целей сравнения. Сетка по умолчанию сортируется с использованием «Accuracy» (от большего к меньшему), которую можно изменить, передав параметр сортировки. Например, compare_models(sort = 'Recall') отсортирует сетку по полноте, а не по точности.  Если вы хотите изменить значение количеств групп со значения по умолчанию, равного 10, на другое значение, вы можете использовать этот параметр. Например, compare_models(fold = 5) будет сравнивать все модели с 5-кратной перекрестной проверкой. Сокращение количества групп улучшит время тренировки. По умолчанию compare_models возвращает наиболее эффективную модель на основе порядка сортировки по умолчанию, но может использоваться для возврата списка лучших N моделей с помощью параметра n_select.

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


Создание модели

create_model —  эта функция обучает и оценивает модель с использованием перекрестной проверки, которую можно установить с помощью параметра fold. Выходные данные распечатывают сетку оценок, которая показывает Accuracy, Recall, Precision, F1 по каждому фолду.

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

Классификатор дерева решений ('dt')
Классификатор соседей ('knn')
Логистическая регрессия ('lr')

В библиотеке моделей PyCaret доступно 18 классификаторов. Пожалуйста, просмотрите строку документации create_model() для получения списка всех доступных моделей.

Классификатор дерева решений

AccuracyAUCRecallPrec.F1KappaMCC
01.00001.00001.00001.00001.00001.00001.0000
10.90000.92860.88890.92500.89710.84850.8616
20.80000.85710.77780.88000.77500.69700.7435
31.00001.00001.00001.00001.00001.00001.0000
41.00001.00001.00001.00001.00001.00001.0000
50.88890.91670.88890.91670.88570.83330.8492
61.00001.00001.00001.00001.00001.00001.0000
70.77780.83330.77780.77780.77780.66670.6667
81.00001.00001.00001.00001.00001.00001.0000
90.88890.91670.83330.91670.87830.82350.8407
Mean0.92560.94520.91670.94160.92140.88690.8962
SD0.08290.06100.09040.07010.08760.12530.1168

Объект обученной модели хранится в переменной 'dt'.

print(dt)


DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',
                       max_depth=None, max_features=None, max_leaf_nodes=None,
                       min_impurity_decrease=0.0, min_samples_leaf=1,
                       min_samples_split=2, min_weight_fraction_leaf=0.0,
                       random_state=123, splitter='best')

Классификатор ближайших соседей

knn = create_model('knn')


 AccuracyAUCRecallPrec.F1KappaMCC
01.00001.00001.00001.00001.00001.00001.0000
11.00001.00001.00001.00001.00001.00001.0000
20.80001.00000.77780.88000.77500.69700.7435
31.00001.00001.00001.00001.00001.00001.0000
41.00001.00001.00001.00001.00001.00001.0000
51.00001.00001.00001.00001.00001.00001.0000
61.00001.00001.00001.00001.00001.00001.0000
70.77780.96300.77780.77780.77780.66670.6667
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.95780.99630.95560.96580.95530.93640.9410
SD0.08460.01110.08890.07220.08940.12750.1192

Классификатор логистической регрессии

lr = create_model('lr')


AccuracyAUCRecallPrec.F1KappaMCC
01.00001.00001.00001.00001.00001.00001.0000
10.90001.00000.88890.92500.89710.84850.8616
20.90001.00000.88890.92500.89710.84850.8616
31.00001.00001.00001.00001.00001.00001.0000
41.00001.00001.00001.00001.00001.00001.0000
51.00001.00001.00001.00001.00001.00001.0000
61.00001.00001.00001.00001.00001.00001.0000
70.77780.96300.77780.77780.77780.66670.6667
81.00001.00001.00001.00001.00001.00001.0000
90.88891.00000.83330.91670.87830.82350.8407
Mean0.94670.99630.93890.95440.94500.91870.9231
SD0.07300.01110.08030.06840.07430.11050.1075

Обратите внимание, что средняя оценка всех моделей совпадает с оценкой, напечатанной в compare_models(). Это связано с тем, что метрики, напечатанные в таблице результатов compare_models(), представляют собой средние баллы по всем группам CV. Как и в случае с compare_models(), если вы хотите изменить значение параметра fold со значения по умолчанию, равного 10, на другое значение, вы можете использовать параметр fold. Например: create_model('dt', fold = 5) создаст классификатор дерева решений с использованием 5-кратного стратифицированного CV.


Настройка модели

Когда модель создается с помощью функции create_model(), она использует гиперпараметры по умолчанию для обучения модели. Для настройки гиперпараметров используется функция tune_model(). Эта функция автоматически настраивает гиперпараметры модели с помощью случайного поиска по сетке в предварительно определенном пространстве поиска. На выходе распечатывается сетка оценок, в которой показаны AUC, Recall, Prce, F1, Kappa и MCC в кратном порядке для лучшей модели. Чтобы использовать пользовательскую сетку поиска, вы можете передать параметр custom_grid в функцию tune_model .

Классификатор решающих деревьев


 AccuracyAUCRecallPrec.F1KappaMCC
01.00001.00001.00001.00001.00001.00001.0000
10.90000.95710.88890.92500.89710.84850.8616
20.90000.95710.88890.92500.89710.84850.8616
30.90000.95710.88890.92500.89710.84850.8616
41.00001.00001.00001.00001.00001.00001.0000
50.88890.91670.88890.91670.88570.83330.8492
61.00001.00001.00001.00001.00001.00001.0000
71.00001.00001.00001.00001.00001.00001.0000
81.00001.00001.00001.00001.00001.00001.0000
90.88890.94840.83330.91670.87830.82350.8407
Mean0.94780.97370.93890.96080.94550.92020.9275
SD0.05240.02860.06310.03930.05470.08010.0728


Объект модели uned хранится в переменной 'tuned_dt'.

print(tuned_dt)


 AccuracyAUCRecallPrec.F1KappaMCC
01.00001.00001.00001.00001.00001.00001.0000
10.90000.94290.88890.92500.89710.84850.8616
20.90001.00000.88890.92500.89710.84850.8616
31.00001.00001.00001.00001.00001.00001.0000
40.88891.00000.88890.91670.88570.83330.8492
50.88890.98150.88890.91670.88570.83330.8492
61.00001.00001.00001.00001.00001.00001.0000
70.88890.96300.88890.91670.88570.83330.8492
81.00001.00001.00001.00001.00001.00001.0000
91.00001.00001.00001.00001.00001.00001.0000
Mean0.94670.98870.94440.96000.94510.91970.9271
SD0.05350.01930.05560.04010.05500.08050.0730

Логистическая регрессия

tuned_lr = tune_model(lr)


 AccuracyAUCRecallPrec.F1KappaMCC
01.00001.00001.00001.00001.00001.00001.0000
11.00001.00001.00001.00001.00001.00001.0000
20.80000.97860.77780.88000.77500.69700.7435
31.00001.00001.00001.00001.00001.00001.0000
41.00001.00001.00001.00001.00001.00001.0000
51.00001.00001.00001.00001.00001.00001.0000
61.00001.00001.00001.00001.00001.00001.0000
70.88890.94440.88890.91670.88570.83330.8492
81.00001.00001.00001.00001.00001.00001.0000
90.88890.97220.83330.91670.87830.82350.8407
Mean0.95780.98950.95000.97130.95390.93540.9433
SD0.06850.01790.08030.04480.07570.10440.0905


Функция tune_model() представляет собой случайный поиск по сетке гиперпараметров в заранее определенном пространстве поиска. По умолчанию он настроен на оптимизацию точности, но это можно изменить с помощью параметра оптимизации. Например: tune_model(dt, optimise = 'Recall') будет искать гиперпараметры классификатора дерева решений, которые приводят к максимальному значению Recall. Для целей этого примера мы использовали метрику Accuracy по умолчанию только для простоты. 

Метрики сами по себе — не единственные критерии, которые вы должны учитывать при окончательной доработке лучшей модели для производства. Другие факторы, которые следует учитывать, включают время обучения, стандартное отклонение kfolds и т. д. По мере прохождения серии руководств мы подробно обсудим эти факторы на среднем и экспертном уровнях. А пока давайте продолжим рассмотрение классификатора 
Tuned K Neighbours в качестве нашей лучшей модели для оставшейся части этого руководства.

Перед завершением модели функцию plot_model() можно использовать для анализа производительности по различным аспектам, таким как AUC, матрица путаницы, граница решения и т. д. Эта функция берет объект обученной модели и возвращает график на основе набора тестов.

Доступно 15 различных графиков, список доступных графиков см. в строке документации plot_model().

Матрица ошибок

plot_model(tuned_knn, plot = 'confusion_matrix')



Отчет о классификации

plot_model(tuned_knn, plot = 'class_report')



Граничный график решения

plot_model(tuned_knn, plot='boundary')

График ошибки прогноза

plot_model(tuned_knn, plot = 'error')

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


evaluate_model(tuned_knn)

Перед окончательной доработкой модели рекомендуется выполнить последнюю проверку, предсказав тестовый набор  и просмотрев метрики оценки.  Все показатели оценки, которые мы видели выше, являются результатами перекрестной проверки, основанными только на обучающем наборе (70%). Теперь, используя нашу окончательную обученную модель, хранящуюся в переменной tuningd_knn, мы будем делать прогнозы по тестовой выборке с задержкой , чтобы увидеть, существенно ли они отличаются от результатов CV.

predict_model(tuned_knn);

ModelAccuracyAUCRecallPrec.F1KappaMCC
0K Neighbors Classifier0.92680.97610.93330.93840.92590.88790.8953

Точность на тестовом наборе составляет 0,9268 по сравнению с 0.9467 достигнутой по результатам tuning_knn CV. Это не существенная разница. Если существует большая разница между результатами теста и CV, то это, как правило, указывает на переобучение, но также может быть связано с несколькими другими факторами и требует дальнейшего изучения. 

Завершение модели для развертывания

Завершение модели является последним шагом в эксперименте. Обычный рабочий процесс машинного обучения в PyCaret начинается с setup(), за которым следует сравнение всех моделей с помощью compare_models() и составление списка нескольких моделей-кандидатов (на основе интересующей метрики) для выполнения нескольких методов моделирования, таких как настройка гиперпараметров, сборка, наложение и
т. д. Этот рабочий процесс в конечном итоге приведет вас к наилучшей модели для прогнозирования новых и неизвестных данных. Функция finalize_model() подгоняет модель к полному набору данных. Цель этой функции — обучить модель на полном наборе данных, прежде чем она будет развернута в рабочей среде.
final_knn = finalize_model(tuned_knn)
print(final_knn)

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
                     metric_params=None, n_jobs=-1, n_neighbors=33, p=2,
                     weights='uniform')

Функция predict_model() также используется для прогнозирования невидимого набора данных. На этот раз мы передадим параметр data_unseen. data_unseen — это переменная, созданная в самом начале  и содержащая 10 % (15 образцов) исходного набора данных, который никогда не подвергался воздействию PyCaret. 

unseen_predictions = predict_model(final_knn, data=data_unseen)
unseen_predictions.head()

sepal_lengthsepal_widthpetal_lengthpetal_widthspeciesLabelScore
05.43.91.70.4Iris-setosaIris-setosa1.0000
15.43.41.70.2Iris-setosaIris-setosa1.0000
25.13.31.70.5Iris-setosaIris-setosa1.0000
34.83.11.60.2Iris-setosaIris-setosa1.0000
46.93.14.91.5Iris-versicolorIris-versicolor0.5455

Столбцы Label и Score добавляются в набор data_unseen. Label — это прогноз, а Score — это вероятность прогноза. Обратите внимание, что спрогнозированные результаты присоединяются к исходному набору данных, а все преобразования выполняются автоматически в фоновом режиме.




Комментариев нет:

Отправить комментарий