FLAML расшифровывается как Быстрая библиотека для автоматизированного машинного обучения и настройки. Это легкая библиотека Python, которая автоматически, эффективно и экономично находит точные модели машинного обучения. Это освобождает пользователей от выбора моделей и гиперпараметров для каждой модели. Его также можно использовать для настройки общих гиперпараметров для больших языковых моделей (LLM), рабочих процессов MLOps/LMOps, конвейеров, математических/статистических моделей, алгоритмов и т. д.
Это помогает в решении следующих вопросов:
- Поиск модели качества. Поиск правильной модели для задачи может быть утомительным. Для обычных задач машинного обучения или ИИ, таких как классификация, регрессия и генерация, он быстро находит качественные модели для пользовательских данных с небольшими вычислительными ресурсами. Он поддерживает как классические модели машинного обучения, так и глубокие нейронные сети, включая большие языковые модели, такие как модели OpenAI GPT-3.
- Легко настроить или расширить — легко настроить или расширить. Пользователи могут найти желаемую настройку из плавного диапазона: минимальная настройка (данные для обучения и тип задачи как только ввод), средняя настройка (например, учащийся в стиле scikit, пространство поиска и метрика) или полная настройка (настройка определяемой пользователем функции). ).
- Настраивайте быстро, настраивайте как хотите. Когда у нас есть правильная модель, ее точная настройка также может занять много времени. Он предлагает быстрый инструмент автонастройки, основанный на новом экономичном подходе к настройке. Он способен обрабатывать большие пространства поиска с разнородными затратами на оценку и сложными ограничениями/руководством/ранней остановкой.
Монтаж
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}}
Компромиссы
Сильные стороны
- Это легко использовать. Его можно использовать в качестве оценки стиля scikit-learn для общих задач машинного обучения, таких как классификация, регрессия и генерация.
- Это настраиваемый. Его можно использовать для непосредственной настройки пользовательской функции (UDF), которая не ограничивается обучением модели машинного обучения.
- Он имеет огромную и активную поддержку сообщества с обширной документацией, что делает его очень удобным для пользователя.
Ограничения
- В настоящее время требуется, чтобы данные загружались в фрейм данных pandas или numpy. Поддержка Spark для обработки больших наборов данных все еще находится в стадии разработки.
- Текущее решение подходит для нескольких моделей с одним выходом. Это медленно, когда количество задач велико. Та же проблема относится к прогнозированию временных рядов, когда в данных содержится несколько временных рядов.
Заключение
В заключение, FLAML действительно делает машинное обучение и настройку быстрыми и автоматизированными. Я продемонстрировал базовую демонстрацию использования этого для целей классификации. Он имеет гораздо больше функций и настроек — последней из них является поддержка GPT-4. Я призываю вас попробовать и изучить себя. Не стесняйтесь просматривать этот репозиторий для кода, который я использовал в приведенной выше демонстрации. Спасибо, что прочитали эту статью. Я надеюсь, что это облегчит ваше путешествие в ML!