3 min read

Черный ящик (Black Box)

Черный ящик (Black Box)

Черный ящик – метафорическое название системы, где пользователь лишь подает данные на входе и, не понимая принципов функционирования ее компонентов, получает данные на выходе.

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

Эксперимент Скиннера

В качестве простого примера рассмотрим мысленный эксперимент Скиннера: вам предоставляется панель управления автомобилем с переключателями и кнопками и результатами нажатия (запуск двигателя, стабилизация автомобиля, резкий старт). Нажимая кнопки, Вы можете наблюдать за соответствующей "реакцией" автомобиля, но не можете заглянуть внутрь, чтобы увидеть, как эта система работает. Очевидно, кнопка "Запустить / остановить двигатель" включает и выключает его. Однако в случае, если система достаточно сложна, определить простым перебором, как работает коробка, станет крайне затруднительно.

Фото: @gohrhyyan

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

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

XGBoost

Ниже Вы увидите классический пример Черного ящика – XGBoost. Направленная на лаконичность, библиотека позволяет обучить модель всего за несколько строк кода. Мы располагаем входными данными (train / test) и получаем конечные (xqboost_start2) так быстро, что новички принимают эту краткость за простоту:

import pandas as pd
import numpy as np
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error

df_train = pd.read_csv('../input/train.csv')
df_test = pd.read_csv('../input/test.csv')

for feature in df_train.columns:
    if 'cat' in feature:
        gr_feature = df_train.groupby(df_train[feature])['loss'].mean()
        df_train[feature] = df_train[feature].map(gr_feature)
        df_test[feature] = df_test[feature].map(gr_feature)

       
y_train = np.log(df_train['loss'] + 200)
x_train = df_train.drop(['loss', 'id'], axis = 1)
x_test = df_test.drop(['id'], axis = 1)

x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, 
                                                      test_size = 0.15, 
                                                      random_state = 345)

d_train = xgb.DMatrix(x_train, y_train)
d_valid = xgb.DMatrix(x_valid, y_valid)
d_test = xgb.DMatrix(x_test)

xgb_params = {
    'learning_rate'   : 0.02,
    'max_depth'       : 7,
    'min_child_weight': 1,
    'subsample'       : 0.7,
    'colsample_bytree': 0.7,

    'objective': 'reg:linear',
    'silent'   : 1,
    'seed'     : 120
}

def xg_eval_mae(yhat, dtrain):
    y = dtrain.get_label()
    return 'mae', mean_absolute_error(np.exp(y), np.exp(yhat))
    
watchlist = [(d_train, 'train'), (d_valid, 'valid')]

clf = xgb.train(xgb_params, d_train, 2500, watchlist, early_stopping_rounds=30, 
                verbose_eval=20, feval=xg_eval_mae, maximize=False)

p_test = np.exp(clf.predict(d_test)) - 200

sub = pd.DataFrame()
sub['id'] = df_test['id']
sub['loss'] = p_test
sub.to_csv('xqboost_start2.csv', index=False)

Даже если каждые отдельные класс, переменная, функция изучены с помощью документации, простое объяснение принципу работы XGBoost откроется новоиспеченному дата-сайентисту весьма нескоро.

Здесь самое место ленинским фразам в духе "Учиться, учиться и еще раз учиться!", однако обойдемся без очевидных назиданий. Разучить 200 базисных терминов Машинного обучения – вполне подъемная задача, обучиться построению сложных мыслительных конструкций из них – тоже, и Вы это, уверена, сделаете рано или поздно. Что важно и часто игнорируется, так это внимательное отношение к себе. Оптимизация темпа освоения материала, правильный отдых, комьюнити – вот что подарит весьма устойчивый рост компетенции, и Черные ящики пооткрываются один за одним.

Фото: @iyamiphotography