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

Учитывая все, что мы делали, логично, что должен существовать какой-то автоматизированный способ сделать это. Если мы хотим, мы можем использовать комбинацию конвейеров и GridSearch, чтобы сделать это для разных моделей, но это требует от нас создания их вручную и требует много времени. К счастью, другие увидели, насколько повторяющейся и ресурсоемкой может быть задача, и разработали оболочки для scikit-learn, которые это делают. Таким образом, мы можем больше сосредоточиться на сборе данных, очистке данных и настройке окончательных моделей, а не на поиске лучшей модели.

TPOT

Считайте TPOT своим помощником по науке о данных. TPOT - это инструмент автоматизированного машинного обучения Python, который оптимизирует конвейеры машинного обучения с использованием генетического программирования. -TPOT Домашняя страница

Первая найденная мною оболочка называется TPOT (Tree-based Pipeline Optimization Tool) и была разработана Рэндалом С. Олсоном и другими из Пенсильванского университета.

TPOT использует генетическое программирование для оптимизации своих древовидных конвейеров. Это лучше, чем GridSearch с перебором, поскольку было показано, что оценка случайных параметров в сетке часто обнаруживает оптимальный конвейер более эффективно [1]. Таким образом, TPOT с его обширным списком моделей и препроцессоров может дать эффективный конвейер.

Чтобы объяснить это, мы должны взглянуть на параметры TPOT:

  • Generations: это количество итераций в процессе оптимизации конвейера выполнения.
  • размер популяции: количество особей, сохраняемых в популяции для генетического программирования в каждом поколении.
  • размер потомства: количество потомства, которое будет производиться в каждом поколении генетического программирования.
  • cv: Генератор перекрестной проверки для оценки конвейера
  • config_dict: словарь Python для настройки операторов и параметров, которые ищутся в процессе оптимизации.
  • и многие другие, но это самые актуальные для быстрого старта.

Как видно из параметров, TPOT не только выполняет поиск по заданному словарю Python (полный моделей scikit-learn и препроцессоров), но также выполняет перекрестную проверку по нему. Стандартный словарь TPOT для классификации имеет следующие модели:

# Classifiers    
'sklearn.naive_bayes.GaussianNB': {    
},     
'sklearn.naive_bayes.BernoulliNB': {        
    'alpha': [1e-3, 1e-2, 1e-1, 1., 10., 100.],        
    'fit_prior': [True, False]    
},     
    'sklearn.naive_bayes.MultinomialNB': {        
    'alpha': [1e-3, 1e-2, 1e-1, 1., 10., 100.],        
    'fit_prior': [True, False]    
},     
'sklearn.tree.DecisionTreeClassifier': {        
    'criterion': ["gini", "entropy"],        
    'max_depth': range(1, 11),        
    'min_samples_split': range(2, 21),        
    'min_samples_leaf': range(1, 21)   
 },     
'sklearn.ensemble.ExtraTreesClassifier': {        
    'n_estimators': [100],        
    'criterion': ["gini", "entropy"],       
    'max_features': np.arange(0.05, 1.01, 0.05),       
    'min_samples_split': range(2, 21),
    'min_samples_leaf': range(1, 21),        
    'bootstrap': [True, False]    
},     
'sklearn.ensemble.RandomForestClassifier': {        
    'n_estimators': [100],        
    'criterion': ["gini", "entropy"],        
    'max_features': np.arange(0.05, 1.01, 0.05),        
    'min_samples_split': range(2, 21),        
    'min_samples_leaf':  range(1, 21),        
    'bootstrap': [True, False]    
},     
'sklearn.ensemble.GradientBoostingClassifier': {   
    'n_estimators': [100],        
    'learning_rate': [1e-3, 1e-2, 1e-1, 0.5, 1.],       
    'max_depth': range(1, 11),        
    'min_samples_split': range(2, 21),        
    'min_samples_leaf': range(1, 21),        
    'subsample': np.arange(0.05, 1.01, 0.05),        
    'max_features': np.arange(0.05, 1.01, 0.05)    
},     
'sklearn.neighbors.KNeighborsClassifier': {        
    'n_neighbors': range(1, 101),        
    'weights': ["uniform", "distance"],        
    'p': [1, 2]   
},     
'sklearn.svm.LinearSVC': {        
    'penalty': ["l1", "l2"],        
    'loss': ["hinge", "squared_hinge"],        
    'dual': [True, False],        
    'tol': [1e-5, 1e-4, 1e-3, 1e-2, 1e-1],        
    'C': [1e-4, 1e-3, 1e-2, 1e-1, 0.5, 1., 5., 10., 15., 20., 25.]    },     
'sklearn.linear_model.LogisticRegression': {        
    'penalty': ["l1", "l2"],        
    'C': [1e-4, 1e-3, 1e-2, 1e-1, 0.5, 1., 5., 10., 15., 20., 25.],
    'dual': [True, False]    
},     
'xgboost.XGBClassifier': {        
     'n_estimators': [100],        
     'max_depth': range(1, 11),        
     'learning_rate': [1e-3, 1e-2, 1e-1, 0.5, 1.],
     'subsample': np.arange(0.05, 1.01, 0.05),   
     'min_child_weight': range(1, 21),        
     'nthread': [1]
}

За этими словарями следуют 14 препроцессоров и 5 селекторов. Всего 30 операторов, которые потенциально будут воздействовать на данные, которые вы передаете в конвейер.

В целом, TPOT будет выполнять конвейеры «размер популяции + поколения * размер потомства» для оценки. Не изменяя эти параметры, TPOT перед завершением оценивает 10 000 конфигураций трубопроводов с перекрестной проверкой. После завершения работы TPOT он позволяет вам экспортировать файл .py с лучшим конвейером, который он мог найти, и содержащим всю информацию, необходимую для его запуска.

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

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

Использование TPOT

А теперь самое интересное! Как пользоваться TPOT. После того, как вы его установили, использовать TPOT довольно просто. Вот краткий обзор того, что необходимо настроить в вашей среде для запуска TPOT: NumPy, SciPy, scikit-learn, DEAP, update_checker, tqdm, stopit и pandas. Для получения более подробных инструкций по его установке внизу есть ссылка на домашнюю страницу TPOT.

Теперь, когда TPOT доступен, вот краткий обзор того, как его использовать:

# First import the relevant TPOT pipeline
import TPOTClassifier, TPOTRegressor 
from sklearn.preprocessing import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y)
tpot = TPOTClassifier()
# Fits the training data on the 
tpot.fit(X_train, y_train)
# Exports best pipeline to a python file so it can be used
tpot.export('my pipeline.py')

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

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
# NOTE: Make sure that the class is labeled 'target' in the data file
tpot_data = pd.read_csv('PATH/TO/DATA/FILE', sep='COLUMN_SEPARATOR', dtype=np.float64)
features = tpot_data.drop('target', axis=1).values
training_features, testing_features, training_target, testing_target = \
            train_test_split(features, tpot_data['target'].values, random_state=None)
# Average CV score on the training set was:0.7581776952324782
exported_pipeline = LinearSVC(C=0.5, dual=True, loss="squared_hinge", penalty="l2", tol=0.001)
exported_pipeline.fit(training_features, training_target)
results = exported_pipeline.predict(testing_features)

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

Насколько хорошо это преформируется?

Использование наборов данных из scikit-learn без каких-либо изменений:

  • Набор данных диафрагмы: точность ~ 97%
  • Распознавание цифр MNIST: точность ~ 98%
  • Цены на жилье в Бостоне: 10 MSE

Что это значит?

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

Ресурсы

[1] Дж. Бергстра и Ю. Бенжио. Случайный поиск для оптимизации гиперпараметров. Журнал исследований в области машинного обучения, 13: 281–305, 2012 г.



Если вы обнаружите какие-либо ошибки или просто захотите поговорить, напишите мне.