Добрый день, уважаемые читатели! Темой нашей сегодняшней статьи стал пошаговый классификатор, реализованный на чистом Python, использующий в качестве основы модель sklearn, а для вычислений NumPy.
Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.
А на моем YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!
Как работает классификатор на Python
Суть работы алгоритма довольно проста. Мы берём первую метку класса из всех, и преобразовываем набор данных следующим образом:
- все образцы, принадлежащие к выбранному классу, отныне относятся к классу 1
- все образцы, которые не принадлежат к выбранному классу будут относится к классу 0
Каждый раз мы будем проделывать такую операцию с разными метками классов, кроме «последней».
Интерфейс
В нашем классе мы реализуем программный интерфейс sklearn, а именно методы:
- fit — обучение (досл. адаптация) модели под обучающие данные
- prediсt — предсказание по определённому образцу
- score — вычислить долю верных предсказаний на определённом наборе образцов
Начало работы
Ниже приведён список всех модулей, которые нам необходимы:

Примечание. Не беспокойтесь по поводу копирования кода, в конце статьи будет ссылка на .ipynb-документ, который вы сможете изменить по своему усмотрению.
Разберёмся по порядку:
- copy.copy — т. к. наш классификатор основан на слабом ученике, то нам необходимо копировать модель, чтобы обучить новую.
- numpy — нам понадобится несколько функций из этой библиотеки. Также основой наших вычислений станет np.array.
- sklearn.datasets — отсюда мы возьмём наборы данных, на которых будем испытывать реализуемый алгоритм.
- sklearn.train_test_split — функция «разбора» набора данных на обучающую и проверочную выборки.
- sklearn.LogisticRegression — первый слабый ученик, который станет основой нашего алгоритм (название может сбить Вас с толку. Логистическая регрессия — алгоритм классификации :) ).
- sklearn.neural_network — второй слабый ученик для классификатора.
Реализация классификатора
Обучение
Конструктор классификатора будет принимать лишь один аргумент — класс, в котором реализован алгоритм классификации, который мы будем обучать несколько раз:

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

- classes — хранит метки классов
Далее мы перебором по всем меткам обучаем алгоритм. С помощью выбора по маске (true_X = X[y == cl]), мы выбираем «положительные» и «отрицательные» образцы и обучаем новую модель на них. Здесь могут смутить только функции из модуля numpy.
- np.vstack — просто соединяет массивы вертикально, т. е. просто добавляет строки из второго массива в первый.
- np.concatenate — объединяет два одномерных массива в один (только здесь, подробнее про эту функцию вы можете почитать здесь).
В конце выставляем булевое поле True и возвращаем сам классификатор для возможности создания цепного интерфейса.
Предсказание классификатора
Здесь всё просто. Мы проходим циклом по всем моделям алгоритма: если она предсказывает 1, то мы возвращаем нужную метку; в противном случае продолжаем.

В конце возвращаем последнюю метку: она вернется, только если все модели «забраковали» текущий образец.
Точность алгоритма
Метод score работает так: он принимает набор образцов и меток к ним, а затем вычисляет соотношение правильно предсказанных меток к их общему кол-ву.

Да-да, метод score также принимает параметр измерения: в процентах или как обычная точность модели (от 0 до 1).
Тестирование классификатора
Мы протестируем наш алгоритм на двух наборах данных: всем известном Iris, а также на наборе Breast Cancer. Схема общая: инициализируем класс, предварительно передав в конструктор модель sklearn, разбиваем набор на обучающие и проверочные выборки и узнаём точность модели.
Iris

Как мы можем заметить, наш алгоритм с логистической регрессией без гиперпараметризации в виде слабого ученика показывает точность 93%. Довольно неплохо, но можно лучше.
Breast Cancer

Здесь мы использовали обычную нейросеть. Наш алгоритм показал точность даже выше, чем сама модель sklearn.
Заключение
Сегодня мы реализовали пошаговый классификатор, используя за основу модели sklearn, и добились неплохих результатов. Однако работа над алгоритмом не закончена, так что подкидываю Вам несколько идей:
- мы так и не реализовали булевое поле fitted. Подумайте, где бы оно могло пригодиться.
- нашу модель нельзя сохранить в какой-то файл. Реализуйте метод сохранения классификатора.
Весь код из статьи можно найти здесь.
Также рекомендую прочитать статью Нейросеть за пять минут! Is it real?! Подпишитесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для разработчиков.