Во первых стоит скаазать про основную черту. Существует много различных библиотек для создания моделей машинного обучения. Хочется иметь один интерфейс работы с ними. Поэтому библиотека основана на абстрации Pipe, котороая позваоляет иметь одинаковых интерефейс для работы с различными моделямя: все они обучаются и делают предсказания. К примеру, у sklearn существуют свои пайплайны, но они позволяют работать в основном только со своей библиотекой.
Часто бывает, что мы хотим оценить целый спектр моделей на каких-то данных. Но делать это каждый раз с нуля не очень удобно. Поэтому, хорошо если будет возможность просто взять данные и получить лучшую модель. Именно эту проблему и решает эта библиотека.
Данная библиотека предназначена для подбора лучшей модели бинарной классификации. Так как структура напоминает зверинец, то в названиях используется слова zoo и animal. Пример использования:
Чтобы запустить паралельное обучение моделей, просто укажите parallel=True, и при желании n_jobs.
Под капотом в библиотеке хранится набор моделей (пайплайнов), которые обучаются и из которых мы выбираем.
- ABC
- core
- storage - отвечает за сохранения и загрузку, использует cloudpickle, так как не все объекты сохраняются с помощью встроенного pickle
- auto - отвечает за загрзку зверинца моделей и их обучение. На данный момент используются всего несколько моделей, логика которых написана в ABC.zoo.animals, далее все обучаются и выбирается лучшая. Но если моделей будет много, можно брать произвольно или делать модели второго уровня - библиотека это позволяет
- model, transform - два абстрактных класса, которые задают макет Моделей и Трансформаций над данными
- pipe - обертка на model и transform
- metric - отвечает за оценку модели (обертка)
- zoo
- model (optimize) - набор уже имплементированных моделей
- transform - набор преобразователей данных (к примеру различные скейлеры или какое то добавление фичей можно делать тут)
- animals - набор Моделей, а точнее пайплайнов, которые могу обучаться и предсказывать
AutoML из данной библиотеки (ABC.core.auto.AutoML) обучает и оцениваев пайплайны, заранее заготовленные и хранящиеся в ABC.zoo.animals. Пример такого пайплайна:
Далее нам нужно его обучить. Делается это просто:
Далее наш пайплайн обучен и мы можем сделать предсказание:
Чтобы удобнее было работать с оценкой модели, существует класс MetricEvaluator:
Как видно, каждый пайплайн состоит из кубиков, каждый такой кубик наследуюется от AbstractModel или AbstractTransform. Рассмотрим пример:
class ModelSVC(AbstractModel):
__name__ = 'ModelSVC'
def __init__(self,):
super().__init__()
self.params = dict(kernel='linear')
self.son = None
def fit(self, son: Pipe, X: Data, y: Data, params: dict):
params = params if params else {}
self.params.update(params)
clf = SVC(**self.params)
clf.fit(X.train, y.train)
self.model = clf
def predict(self, X):
prediction = self.model.predict(X)
return prediction
Для того, чтобы сделать такой кубик, нам нужно отнаследоваться от AbstractModel или AbstractTransform, и реализовать в простом случае два методы: fit и predict.
Далее мы можем сделать новый пайплайн, используя наш новый кубик.
Pipe работает таким образом, что каждый объект хранит указатель на своего потомка. Когда к нему применятеся fit, то данные проходят сквозь все объекты в нем, позволяя каждому объекту обучиться или преобразовать данные и отправить их дальше. Так же плюс в том, что мы можем сохранить его весь и после загрузки полность восстановим последовательность действий.
Чтобы все это сохранять есть Storage (ABC.core.storage.Storage). Этот класс, сстоящий толькоа изи classmethod'ов, позволяет рабоать с файлами, как с файловой системой:
Storage.set_root('../data') # где находиться корень нашего хранилища
obj = my_model_or_smth_else
Storage.save(obj, 'my_object', sub_storage='my_dataset_1/models', description="Мой очень важный объект")
# Сохранение:
# Текущая директория: /home/alice/Documents/auto_bin_classification/notebooks
# Корень базы данных: ../data/
# Хранилище/Подхранилище: my_dataset_1/models
loaded_obj = Storage.load('my_object', sub_storage='my_dataset1/models')
# Загрузка:
# Загрузка из: ../data/my_dataset_1/models/my_test_pipe.pickle
# Объект был сохранен: 2020-11-22 17:58:15.197026
# Описание: Мой очень важный объект
На самом деле мы можем сохранять сам объект AutoML
- Более консистетно использовать Модели, Трансформы и Оптимизаторы. К примеру, все они принимают в метод fit объекты Data, а метод predict уже пандосовский датафрейм
- Сделать сохранение данных в более комактный вид (numpy array, h5)
- Сохранять нативными средствами, такими как joblib (Scikit) и save_model (CatBoost) и т.д.
- ModelCrossValidation усредняет предсказания голосованием, что является не лучшей идеей и стоит усреднять веротности
- Скорее всего достатно багов, так что нужно тестировать
- Много еще всего
Чтобы лучше понять как все рабоатет и посмотреть на примеры, зайдите в папку notebooks.