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


Данная статья продемонстрирует, как на примере алгоритмов, взятых из библиотеки Scikit-Learn, можно расширить возможности обучения нейронных сетей, путём использования ускоренных вычислений библиотеки daal4py.


Введение


Scikit-Learn предоставляет серьёзный набор инструментов для решения Machine Learning задач. Классификация, Регрессия, Кластеризация… sklearn обладает алгоритмами для всего этого. С некоторыми из этих алгоритмов мы и поработаем.


В 2019 году на базе Intel Data Analytics Acceleration Library (DAAL) формируется библиотека daal4py. Intel презентовало решение, напрямую относящееся к predictive data analysis, имеющее существенное преимущество среди аналогов за счёт производительности и простоты использования.


Технология daal4py позволяет увеличить производительность
классических методов sklearn за счёт ускоренных вычислений(в частности матричных преобразований), базирующихся на Intel DAAL.


Реализация


Рассмотрим методы daal4py.sklearn на тестовой задаче.


Датасет, опубликованный на kaggle: Cardiovascular Disease dataset
Задачей поставлено создание модели, способной сделать предсказание относительно наличия или отсутствия сердечно-сосудистых заболеваний у человека.


Данная задача — задача классификации, поэтому было решено использовать ensamble из моделей LogisticRegression, RandonForestClassifier и KNeighborsClassifier, пропущенные через инструмент подгона параметров GridSearchCV, реализации Scikit-Learn.


Для начала обучим обе реализации алгоритмов на одинаковых параметрах и сравним их:


Функции обучения и вывода лучших классификаторов:


from sklearn.model_selection import GridSearchCV

# Best Logistic Regression
def get_best_clf_lr(name, clf, params):
    start = timer()
    grid_clf = GridSearchCV(estimator=clf, param_grid=params, n_jobs=-1)
    grid_clf.fit(X_train, y_train)
    end = timer()
    learning_time = end - start
    print(learning_time)

    return name, learning_time, grid_clf.best_estimator_

# Best Random Forest Classifier
def get_best_clf_rf(name, clf, params):
    start = timer()
    grid_clf = GridSearchCV(estimator=clf, param_grid=params, n_jobs=-1, cv=5)
    grid_clf.fit(X_train, y_train)
    end = timer()
    learning_time = end - start
    print(learning_time)

    return name, learning_time, grid_clf.best_estimator_

# Best K Neighbors Classifier
def get_best_clf_knn(name, clf, params):
    start = timer()
    grid_clf = GridSearchCV(estimator=clf, param_grid=params, n_jobs=-1)
    grid_clf.fit(X_train, y_train)
    end = timer()
    learning_time = end - start
    print(learning_time)

    return name, learning_time, grid_clf.best_estimator_

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


from sklearn.ensemble import RandomForestClassifier as RandomForestClassifier_skl
from daal4py.sklearn import ensemble

# Random Forest Classifier

params_RF = {
    'n_estimators': [1, 3, 5, 7, 10],
    'max_depth': [3, 5, 7, 9, 11, 13, 15],
    'min_samples_leaf': [2, 4, 6, 8],
    'min_samples_split': [2, 4, 6, 8, 10]
}

name, lrn_time, model = get_best_clf_lr("RF_sklearn", RandomForestClassifier_skl(random_state = 42), params_RF)
learn_data_skl.append([name, model, lrn_time])

name, lrn_time, model = get_best_clf_lr("RF_daal4py", ensemble.RandomForestClassifier(random_state = 42), params_RF)
learn_data_daal.append([name, model, lrn_time])

Очевидным является прирост скорости обучения моделей. Особенно ярко он выражен на модели KNeigborsClassifier, где скорость обучения модели увеличилась в 45раз. Это невероятный показатель, позволяющий нагружать алгоритм, увеличением количества итераций, перебираемых гиперпараметров или ещё чем-нибудь другим. На остальных алгоритмах ускорение составило 1.5 — 2 раза.


Полученный выигрыш во времени, был использован для увеличением количества перебираемых параметров RandomForestClassifier модели, а также увеличением выборки на 34% без временных потерь.


Последующее объединение моделей в ensamble и определяло финальный вид модели.
В качестве метрики качества использовали ROC_AUC score.


Учитывая тот факт, что обучение происходило без разного рода feature engineering, корреляции между данными практически не наблюдалось, то получившийся показатель roc_auc_score в 0.74 на результирующей модели можно считать закономерным.


Заключение


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


GitHub
Dataset
Daal4py