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)