Разработка Proof of Concept всегда была важной частью карьеры Data Science. Когда мы разрабатываем модели машинного обучения для прогнозирования в потоке решений, мы обычно тестируем множество разных моделей для одной и той же цели прогнозирования. В процессе большая часть времени будет потрачена на тестирование каждой модели и настройку каждой модели, чтобы получить максимальную отдачу от алгоритм. Наконец, мы сравниваем каждый из полученных лучших результатов, чтобы выбрать окончательную модель. Затем начинается процесс углубления окончательной модели, чтобы максимально повысить точность.

Но последовательное обучение приводит к временным ограничениям для тестирования и настройки каждой отдельной модели, что может стать узким местом в процессе разработки. Поэтому я начал разрабатывать DIY AutoML, используя Dask и bayes_opt, который будет параллельно обучать разные модели и настраивать себя. Используемые компоненты: DASK и bayes_opt.

Dask — это гибкая библиотека параллельных вычислений для аналитических вычислений и Bayes_opt для использования байесовского метода оптимизации для автоматической настройки модели.

Цель состоит в том, чтобы использовать байесовскую оптимизацию для автоматической настройки гиперпараметров для каждой модели и распараллелить процесс автоматической настройки, чтобы разные модели тестировались и настраивались параллельно. Это помогло ускорить процесс проверки разработки концепции. Идея визуализируется следующим образом,

Шаг 1. Определим модели, которые будут использоваться, и их соответствующие гиперпараметры, которые необходимо настроить. Для простоты объяснения сюда включены только две модели (логистическая регрессия и дерево решений), но список может быть сколь угодно большим. Мы определили список словарей Python, где каждый словарь имеет параметры, которые необходимо оптимизировать, с соответствующим диапазоном и названием модели.

model1={} model1['params']={'C':(0.1,5)} 
model1['model_type']='logistic'
model2={}
model2['params']={'n_neighbors':(1,10),'leaf_size':(10,40)}
model2['model_type']='knn'
models_list=[model1,model2]

Шаг 2: Теперь давайте определим функцию, имеющую вызов байесовской оптимизации с соответствующими параметрами, и еще одну функцию, которая имеет этапы обучения модели для параметров, выбранных функцией байесовской оптимизации, следующим образом:

from bayes_opt import BayesianOptimization
import sklearn
def build_model(train_x,train_y,model_type,**modelparam):
   model=''
   if modeltype== 'logistict':
      model=sklearn.linear_model.LogisticRegression(**modelparam)
   elif modeltype=='knn':
      model= KNeighborsClassifier(**modelparam) model.fit(X, y)
return model.score(X,y)
def bayesOpt(data_dict):
    train_x=data_dict['train_x']
    train_y=data_dict['train_y']
    param_range=data_dict['params']
    model_type=data_dict['model_type']
    model_func=lambda **params: \\
         build_model(trainx,trainy,model_type,**params)
    bo = BayesianOptimization(model_func, param_range)                
    bo.maximize(init_points =10,n_iter =20,kappa =2,acq ="ei")             
    bestresult = bo.res['max']['max_val'] 
    bestparams=bo.res['max']['max_params']
    return bestresult,bestparams

В функции bayesOpt мы получаем данные об обучении и тип модели для построения, а также параметры, которые необходимо передать для модели обучения в словаре Python. Эти данные будут упакованы в виде лямбда-функции и переданы байесовскому вызову оптимизации, который будет строить модель, настраивая параметр на основе результата (здесь мы возвращаем показатель точности для оценки) на каждой итерации и максимизируя результат путем адаптации параметров обучения. Детали и аргументы байесовской оптимизации здесь не обсуждаются, но их можно прочитать на https://github.com/fmfn/BayesianOptimization.

Шаг 3. data_dict для bayesOpt будет передан от планировщика dask вместе с функцией bayestOpt каждому рабочему процессу dask. Код для распространения процесса построения модели приведен ниже,

from dask.distributed import Client
client=Client(n_workers=3)
each_model_best_result_futures=client2.map(bayesOpt,models_list) best_result_of_models=client2.gather(each_model_best_result_futures)

Теперь best_result_of_models – это список Python, содержащий лучший результат для каждой построенной модели и соответствующий параметр для достижения наилучшего результата. Все подробные сведения о платформе dask можно найти на странице http://dask.pydata.org/en/latest/.

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

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

Оставляйте свои комментарии или вопросы ниже :) !

Первоначально опубликовано на www.linkedin.com.

URL: https://www.linkedin.com/pulse/let-machine-tune-itself-diy-automl-using-dask-bayesianopt-m/