Weight and Biases (wandb) — платформа, предназначенная для отслеживания и оптимизации экспериментов по машинному обучению с использованием общих метрик. Это также позволяет исследователям регистрировать информацию и данные для каждого эксперимента. Он имеет два основных объекта:

  • run: уникальная единица вычислений (обучение, извлечение/очистка данных)
  • артефакт: любой объект, который вы можете загрузить на платформу (csv, изображения, аудио, matplotlib/графические рисунки)

Основная цель прогонов — регистрировать (отслеживать) события, связанные с обучением вашей модели машинного обучения:

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

API Weight and Biases, по-видимому, построен на предположении, что каждый забег связан с одним тренировочным событием. Это означает, что если вы обучаете две разные модели в одном прогоне и записываете их производительность; только последняя модель будет суммирована на платформе.

Следующий код (сначала настроить W&B):

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split

X,Y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X,Y)

import wandb
run = wandb.init(project='learn-W&B',name = 'default-settings')

from sklearn.ensemble import HistGradientBoostingRegressor
from sklearn.linear_model import LinearRegression

reg01 = HistGradientBoostingRegressor().fit(X_train, y_train)
wandb.sklearn.plot_summary_metrics(reg01, X_train, y_train, X_test, y_test)

reg02 = LinearRegression().fit(X_train, y_train)
wandb.sklearn.plot_summary_metrics(reg02, X_train, y_train, X_test, y_test)

приведет к этому резюме:

как видите, метрика организована по запускам, а не по моделям. Таким образом, казалось бы, нам нужно запускать и останавливать W&B для каждой модели. Но есть лучшая альтернатива: запустить пустой запуск и использовать следующую опцию, чтобы разрешить несколько запусков в одном сеансе (по одному для каждой модели):

run = wandb.init(reinit=True)

Наш сейчас выглядит так:

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
import wandb
from sklearn.ensemble import HistGradientBoostingRegressor
from sklearn.linear_model import LinearRegression

#data
X,Y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X,Y)


# base run, this could be use for other purposes in the future
run = wandb.init(project='learn-W&B', reinit=True)

# Gradient Boosting
run = wandb.init(project='learn-W&B',name = 'HistGB', reinit=True)
reg01 = HistGradientBoostingRegressor().fit(X_train, y_train)
wandb.sklearn.plot_summary_metrics(reg01, X_train, y_train, X_test, y_test)

run = wandb.init(project='learn-W&B',name = 'LinearReg', reinit=True)
reg02 = LinearRegression().fit(X_train, y_train)
wandb.sklearn.plot_summary_metrics(reg02, X_train, y_train, X_test, y_test)


#ciao
wandb.finish()

что приводит к этому резюме:

Я проведу еще три эксперимента, создавая более полное резюме:

  • используя 200 iters для ГБ
  • Лассо
  • фиктивный регрессор
# Gradient Boosting
name = 'HistGB-200-iter'
reg01 = HistGradientBoostingRegressor(max_iter=200).fit(X_train, y_train)
run = wandb.init(project='learn-W&B',name = name, reinit=True)

wandb.sklearn.plot_regressor(reg01, X_train, X_test, y_train, 
                              y_test,  model_name=name)

# LASSO
from sklearn.linear_model import LassoCV
name = 'LassoCV-100'
run = wandb.init(project='learn-W&B',name = 'LinearReg', reinit=True)
reg02 = LassoCV(n_alphas=100).fit(X_train, y_train)
wandb.sklearn.plot_regressor(reg02, X_train, X_test, y_train, 
                             y_test,  model_name=name)

# Dummy
name = 'Dummy-Mean'
from sklearn.dummy import DummyRegressor
dummy_regr = DummyRegressor(strategy="mean").fit(X_train, y_train)
wandb.sklearn.plot_regressor(dummy_regr, X_train, X_test, y_train, 
                             y_test,  model_name=name)

наконец, вот надуманный пример, показывающий, что можно использовать цикл for:

for i in range(10):
    name =f'exp{i}'
    run = wandb.init(project='many-experiments',name = name, reinit=True)
    iters = np.random.choice([2,5,10,100,1000], 1)[0]
    maxd  = np.random.choice([1,10,5,100], 1)[0]
    REG = HistGradientBoostingRegressor(max_iter=iters
                               , max_depth=maxd).fit(X_train, y_train)
    wandb.sklearn.plot_regressor(REG, X_train, X_test, y_train, y_test
                                         ,  model_name=name)