У меня есть простой тест класса, который я использовал для инкапсуляции модели XGBoost. Чтобы протестировать этот класс, я обучил модель XGBoost и сохранил ее в файл, и я хочу использовать эту обученную модель, которую я прочитаю из файла, чтобы протестировать код обучения моей модели. Я не уверен, как мне лучше всего сравнить 1010 * модель XGBoost, которую я буду обучать с известными параметрами / данными, с той, которую я сохранил в файл. Например, я обучил и сохранил модель XGBoost следующим образом:
# specify parameters to use for training the XGBoost model
params = {
'max_depth': 6, # the maximum depth of each tree
'eta': 0.25, # the training step for each iteration
'silent': 1, # logging mode - quiet
'objective': 'reg:tweedie',
'booster': 'gbtree',
'subsample': 0.7,
'gamma': 0.3, # regularization parameter
'colsample_bytree': 0.2,
'rate_drop': 0.3,
'skip_drop': 0.2,
'early_stopping_rounds': 10,
'eval_metric': ['rmse', 'mae'], # error evaluation for multiclass training
}
# split X and y into train and test sets
features_train, features_test, target_train, target_test = \
train_test_split(features, target, test_size=test_percentage, random_state=31)
# package the dataset splits as input for XGBoost
dtrain = xgb.DMatrix(features_train, label=target_train)
dtest = xgb.DMatrix(features_test, label=target_test)
evallist = [(dtest, 'eval'), (dtrain, 'train')]
# train the XGBoost model
xgbooster = xgb.train(params, dtrain, training_iterations, evallist, verbose_eval=0)
pickle.dump(xgbooster, open("/path/to/fitted_model.dat", "wb"))
В модульном тесте (pytest) для моего модельного класса я хочу проверить, что я тренирую модель, как и ожидалось, поэтому я чтение этой сохраненной модели из файла для сравнения с той, которая должна соответствовать:
def test_xgboost_fit():
features_train_df = pd.read_csv("/path/to/features_train.csv"))
labels_train_df = pd.read_csv("/path/to/labels_train.csv"))
fixture_xgbooster = pickle.load(open("/path/to/fitted_model.dat", "rb"))
# train/fit the model
xgbooster = mymodelclass.XGBoostModel()
xgbooster.fit(features_train_df, labels_train_df)
# compare the trained model against the expected model read from file
assert xgbooster.model == fixture_xgbooster
Использование двойных равных здесь кажется недостаточным для сравнения (в противном случае у меня есть что-то еще не так, поскольку он показывает, что две модели с одинаковыми параметрами и оснащены одинаковыми данными обучения не равны).
Как мне go сделать это сравнение в моем тесте? Или есть лучший подход для тестирования этого кода?