AutoGOAL — это новый фреймворк Python для автоматического машинного обучения, также известный как AutoML.

Что такое автомл

AutoML — это захватывающая новая область машинного обучения, которая пытается преодолеть разрыв между очень сложными методами машинного обучения и неспециалистами. Другими словами, снижение входного барьера в мир машинного обучения для тех из нас, у кого нет времени и/или ресурсов для изучения всех тонкостей каждого алгоритма, но кому нужно решать реальные проблемы.

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

В идеале заставить машинное обучение работать должно быть так же просто, как:

from machine_learning import BlackMagic

algorithm = BlackMagic()
algorithm.learn(my_data)    # freshly taken from your DB
algorithm.predict(new_data) # maybe even from the users?

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

На самом деле, в следующую субботу, 18 июля, наша команда представит первую версию AutoGOAL на AutoML Workshop, приуроченном к Международной конференции по машинному обучению (ICML), одной из ведущих академических конференций по машинному обучению.

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

Если вы уже слышали об AutoML в мире открытого исходного кода, скорее всего, вы слышали о AutoSklearn, AutoWeka или AutoKeras. Это замечательные инструменты, которые, как могут намекать их названия, действуют как оболочки поверх очень известных библиотек машинного обучения, чтобы дать вам что-то вроде этого идеального алгоритма черного ящика. Если вам нужны готовые решения для машинного обучения сегодня, непременно обратите внимание на эти инструменты.

Подход AutoGOAL к AutoML

AutoGOAL — это новая библиотека в этом мире, которая пытается привлечь как пользователей высокого уровня (неспециалистов), так и пользователей низкого уровня (экспертов).

Например, с AutoGOAL вы можете сделать что-то вроде этого (на самом деле):

from autogoal.ml import AutoML 
X, y = # load data

automl = AutoML()
automl.fit(X, y)

Круто, не правда ли? AutoGOAL автоматически просматривает обширную коллекцию различных алгоритмов (таких как логистическая регрессия, деревья решений, некоторые нейронные сети) и находит оптимальное (или, по крайней мере, достаточно хорошее) решение с заданными ограничениями по времени и памяти. Однако это не панацея, существует множество ограничений на то, какими должны быть X и y. Но это на шаг ближе к этому идеалу.

Это высокоуровневый API, класс черного ящика AutoML, который работает со многими различными типами задач, от классификации изображений до распознавания сущностей в тексте. Под капотом AutoGOAL фактически есть оболочки для сотен различных алгоритмов от sklearn, gensim, nlkt, pytorch, keras, spacy и других. И это первое отличие AutoGOAL от большинства других подобных инструментов. AutoGOAL на самом деле не знает ни о каком конкретном API или библиотеке, и при этом не реализовано какое-либо машинное обучение, это тонкая коллекция оболочек, совместимых практически со всем, что даже напоминает алгоритм машинного обучения.

Итак, если вы установите AutoGOAL сейчас ( pip install autogoal), вы получите только этот тонкий слой. На самом деле вам необходимо установить sklearn, и/или keras, и/или другие библиотеки, и тогда AutoGOAL обнаружит эти библиотеки и автоматически использует их. Мы постоянно добавляем новые обертки круглосуточно (например, скоро появится opencv).

Низкоуровневый API для точного управления

В AutoGOAL есть много деталей, но основные строительные блоки основаны на концепции определения классов или методов с аннотациями типов, которые указывают пространство значений параметров. Например, предположим, что вы хотите попробовать логистическую регрессию от sklearn к некоторому набору данных. Это базовый код для создания экземпляра и оценки его на некоторых случайных данных:

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)  # Fixed seed for reproducibility

from sklearn.linear_model import LogisticRegression

def evaluate(estimator, iters=30):
    scores = []

    for i in range(iters):
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
        estimator.fit(X_train, y_train)
        scores.append(estimator.score(X_test, y_test))

    return sum(scores) / len(scores)

lr = LogisticRegression()
score = evaluate(lr)  # around 0.83

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

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

from autogoal.grammar import Continuous, Categorical

class LR(LogisticRegression):
    def __init__(self, penalty: Categorical("l1", "l2"), C: Continuous(0.1, 10)):
        super().__init__(penalty=penalty, C=C, solver="liblinear")

Аннотация penalty: Categorical("l1", "l2") сообщает AutoGOAL, что для этого класса параметр штрафа может принимать значения из списка предопределенных значений. Аналогично, аннотация C: Continuous(0.1, 10) указывает, что параметр C может принимать значение с плавающей запятой в указанном диапазоне.

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

from autogoal.grammar import  generate_cfg

grammar =  generate_cfg(LR)
print(grammar)

Это вывод для print(grammar):

<LR>         := LR (penalty=<LR_penalty>, C=<LR_C>)
<LR_penalty> := categorical (options=['l1', 'l2'])
<LR_C>       := continuous (min=0.1, max=10)

По сути, AutoGOAL анализирует аннотации типов и строит грамматику, описывающую пространство всех возможных экземпляров класса LR. Теперь мы можем использовать AutoGOAL для поиска наилучшего экземпляра, который автоматически будет разумно пробовать множество различных комбинаций параметров (технически это использует вероятностный вариант эволюционного алгоритма под названием Грамматическая эволюция).

from autogoal.search import PESearch

optimizer = PESearch(grammar, evaluate)
best, fn = optimizer.run(1000)

После нескольких итераций best станет лучшим экземпляром LR, а fn станет фактическим значением evaluate для этого экземпляра.

Что дальше

Теперь это может пойти намного глубже. Вы можете определить полную иерархию классов с параметрами, которые являются экземплярами других классов (даже рекурсивно экземплярами самого себя), и AutoGOAL выведет правильную грамматику для этого пространства и оптимизирует его.

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

AutoGOAL все еще находится на стадии альфа-тестирования и находится в активной разработке. Если вам нужна готовая к работе среда AutoML, есть альтернативы готовым решениям. Но если вы хотите повозиться, AutoGOAL обеспечивает отличный уровень выразительности и требует очень мало кода. Вы можете найти его в Github и в Docker Hub с предустановленной кучей библиотек машинного обучения и поддержкой GPU.

Первоначально опубликовано на https://dev.to 16 июля 2020 г.