FLAML расшифровывается как Быстрая библиотека для автоматизированного машинного обучения и настройки. Это легкая библиотека Python, которая автоматически, эффективно и экономично находит точные модели машинного обучения. Это освобождает пользователей от выбора моделей и гиперпараметров для каждой модели. Его также можно использовать для настройки общих гиперпараметров для больших языковых моделей (LLM), рабочих процессов MLOps/LMOps, конвейеров, математических/статистических моделей, алгоритмов и т. д.

Это помогает в решении следующих вопросов:

  1. Поиск модели качества. Поиск правильной модели для задачи может быть утомительным. Для обычных задач машинного обучения или ИИ, таких как классификация, регрессия и генерация, он быстро находит качественные модели для пользовательских данных с небольшими вычислительными ресурсами. Он поддерживает как классические модели машинного обучения, так и глубокие нейронные сети, включая большие языковые модели, такие как модели OpenAI GPT-3.
  2. Легко настроить или расширить — легко настроить или расширить. Пользователи могут найти желаемую настройку из плавного диапазона: минимальная настройка (данные для обучения и тип задачи как только ввод), средняя настройка (например, учащийся в стиле scikit, пространство поиска и метрика) или полная настройка (настройка определяемой пользователем функции). ).
  3. Настраивайте быстро, настраивайте как хотите. Когда у нас есть правильная модель, ее точная настройка также может занять много времени. Он предлагает быстрый инструмент автонастройки, основанный на новом экономичном подходе к настройке. Он способен обрабатывать большие пространства поиска с разнородными затратами на оценку и сложными ограничениями/руководством/ранней остановкой.

Монтаж

FLAML требует версии Python ›= 3.7. Его можно установить из pip:

pip install flaml

или конда:

conda install flaml -c conda-forge

Сценарий: Классификация популярности фильмов

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

Здесь мы хотим обучить модель классифицировать фильм как HIT или NOT_HIT, учитывая некоторые атрибуты фильма, например. продолжительность, имя режиссера, лайки режиссера в Facebook, имя актера, жанры, количество пользователей, просмотревших обзоры, оценки IMDB и т. д. Эти данные взяты с Kaggle и могут быть загружены здесь. Давайте сначала загрузим данные и посмотрим, как они выглядят. Затем мы классифицируем целевую переменную, чтобы сделать ее задачей классификации.

# load dataset
data=pd.read_csv('movie_metadata.csv')

#Categorising the target variable 
bins = [ 1, 6, 10]
labels = ['NOT_HIT', 'HIT']
data['imdb_binned'] = pd.cut(data['imdb_score'], bins=bins, labels=labels)


data.groupby(['imdb_binned']).size().plot(kind="bar",fontsize=14)
plt.xlabel('Categories')
plt.ylabel('Number of Movies')
plt.title('Categorization of Movies')

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

#Spliting the data into train and test
from sklearn.model_selection import train_test_split

X = data.iloc[:, 0:23].values  #Independent Variables
y = data.iloc[:, 23].values    #Dependent/Target Variable
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, 
                                            random_state = 0,stratify = y)
y_train = np.array(y_train)
y_test = np.array(y_test)

Масштабирование: немногие переменные будут находиться в диапазоне миллионов, а некоторые — в десятках, поэтому мы приводим их все к одной шкале.

#Scaling the dependent variables
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Выбор лучшей модели с помощью FLAML

После подготовки данных нам нужно найти лучший классификатор для нашей задачи, а затем настроить его, чтобы получить максимальную точность. Давайте посмотрим, как FLAML может упростить и ускорить этот процесс. В конфигурации автоматического запуска FLAML мы можем указать тип задачи, бюджет времени, метрику ошибок, список учащихся, необходимость подвыборки, тип стратегии повторной выборки и т. д. Все эти аргументы имеют значения по умолчанию, которые будут использоваться, если мы их не укажем. Например, классификаторы по умолчанию: [‘lgbm’, ‘xgboost’, ‘xgb_limitdepth’, ‘catboost’, ‘rf’, ‘extra_tree’, ‘lrl1’].

''' import AutoML class from flaml package '''
from flaml import AutoML
automl = AutoML()

settings = {
    "time_budget": 5,  # total running time in seconds
    "metric": 'accuracy', 
                        # check the documentation for options of metrics 
    "task": 'classification',  # task type
    "log_file_name": 'movies_experiment.log',  # flaml log file
    "seed": 7654321,    # random seed
}
'''The main flaml automl API'''
automl.fit(X_train=X_train, y_train=y_train, **settings)

Сохранение лучшей модели и метрики

'''retrieve best config and best learner'''
print('Best ML leaner:', automl.best_estimator)
print('Best accuracy on validation data: {0:.4g}'.format(1-automl.best_loss))
print('Training duration of best run: {0:.4g} s'.format(automl.best_config_train_time))

automl.model.estimator
Best ML leaner: lgbm
Best accuracy on validation data: 0.8226
Training duration of best run: 1.837 s

Вычисление метрик

Мы можем вычислить различные значения метрик при тестировании набора данных.

from flaml.ml import sklearn_metric_loss_score
print('accuracy', '=', 1 - sklearn_metric_loss_score('accuracy', y_pred, y_test))
print('roc_auc', '=', 1 - sklearn_metric_loss_score('roc_auc', y_pred_proba, y_test))
print('log_loss', '=', sklearn_metric_loss_score('log_loss', y_pred_proba, y_test))
accuracy = 0.8287488908606921
roc_auc = 0.8800751433068996
log_loss = 0.45056693112794577

Просмотр журналов

Мы также можем проверить журнал, чтобы увидеть улучшение показателей.

from flaml.data import get_output_from_log
import matplotlib.pyplot as plt
import numpy as np

time_history, best_valid_loss_history, valid_loss_history, config_history, metric_history = \
    get_output_from_log(filename=settings['log_file_name'], time_budget=240)
for config in config_history:
    print(config)

plt.title('Learning Curve')
plt.xlabel('Wall Clock Time (s)')
plt.ylabel('Validation Accuracy')
plt.scatter(time_history, 1 - np.array(valid_loss_history))
plt.step(time_history, 1 - np.array(best_valid_loss_history), where='post')
plt.show()
{'Current Learner': 'lgbm', 'Current Sample': 2366, 'Current Hyper-parameters': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 4, 'num_leaves': 4, 'min_child_samples': 20, 'learning_rate': 0.09999999999999995, 'log_max_bin': 8, 'colsample_bytree': 1.0, 'reg_alpha': 0.0009765625, 'reg_lambda': 1.0}}
{'Current Learner': 'lgbm', 'Current Sample': 2366, 'Current Hyper-parameters': {'n_estimators': 15, 'num_leaves': 4, 'min_child_samples': 18, 'learning_rate': 0.2293009676418639, 'log_max_bin': 9, 'colsample_bytree': 0.9086551727646448, 'reg_alpha': 0.0015561782752413472, 'reg_lambda': 0.33127416269768944}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 15, 'num_leaves': 4, 'min_child_samples': 18, 'learning_rate': 0.2293009676418639, 'log_max_bin': 9, 'colsample_bytree': 0.9086551727646448, 'reg_alpha': 0.0015561782752413472, 'reg_lambda': 0.33127416269768944}}
{'Current Learner': 'lgbm', 'Current Sample': 2366, 'Current Hyper-parameters': {'n_estimators': 18, 'num_leaves': 14, 'min_child_samples': 17, 'learning_rate': 0.32352862101602586, 'log_max_bin': 10, 'colsample_bytree': 0.8801327898366843, 'reg_alpha': 0.004475520554844502, 'reg_lambda': 0.033081571878574946}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 18, 'num_leaves': 14, 'min_child_samples': 17, 'learning_rate': 0.32352862101602586, 'log_max_bin': 10, 'colsample_bytree': 0.8801327898366843, 'reg_alpha': 0.004475520554844502, 'reg_lambda': 0.033081571878574946}}
{'Current Learner': 'lgbm', 'Current Sample': 2366, 'Current Hyper-parameters': {'n_estimators': 27, 'num_leaves': 46, 'min_child_samples': 12, 'learning_rate': 0.4090419554311288, 'log_max_bin': 10, 'colsample_bytree': 1.0, 'reg_alpha': 0.001238046501594789, 'reg_lambda': 0.0496268711513292}, 'Best Learner': 'lgbm', 'Best Hyper-parameters': {'n_estimators': 27, 'num_leaves': 46, 'min_child_samples': 12, 'learning_rate': 0.4090419554311288, 'log_max_bin': 10, 'colsample_bytree': 1.0, 'reg_alpha': 0.001238046501594789, 'reg_lambda': 0.0496268711513292}}

Компромиссы

Сильные стороны

  1. Это легко использовать. Его можно использовать в качестве оценки стиля scikit-learn для общих задач машинного обучения, таких как классификация, регрессия и генерация.
  2. Это настраиваемый. Его можно использовать для непосредственной настройки пользовательской функции (UDF), которая не ограничивается обучением модели машинного обучения.
  3. Он имеет огромную и активную поддержку сообщества с обширной документацией, что делает его очень удобным для пользователя.

Ограничения

  1. В настоящее время требуется, чтобы данные загружались в фрейм данных pandas или numpy. Поддержка Spark для обработки больших наборов данных все еще находится в стадии разработки.
  2. Текущее решение подходит для нескольких моделей с одним выходом. Это медленно, когда количество задач велико. Та же проблема относится к прогнозированию временных рядов, когда в данных содержится несколько временных рядов.

Заключение

В заключение, FLAML действительно делает машинное обучение и настройку быстрыми и автоматизированными. Я продемонстрировал базовую демонстрацию использования этого для целей классификации. Он имеет гораздо больше функций и настроек — последней из них является поддержка GPT-4. Я призываю вас попробовать и изучить себя. Не стесняйтесь просматривать этот репозиторий для кода, который я использовал в приведенной выше демонстрации. Спасибо, что прочитали эту статью. Я надеюсь, что это облегчит ваше путешествие в ML!

Рекомендации

  1. https://github.com/microsoft/FLAML
  2. https://microsoft.github.io/FLAML/docs/Use-Cases/Task-Oriented-AutoML
  3. https://www.kaggle.com/code/harshadeepvattikunta/predicting-movie-success/input