Реализуйте пользовательскую функцию потерь в Tensorflow BoostedTreesEstimator - PullRequest
2 голосов
/ 16 апреля 2020

Я пытаюсь реализовать модель повышения, используя Tensorflow "BoostedTreesRegressor".

Для этого мне нужно реализовать пользовательскую функцию потерь, при которой во время обучения потери будут рассчитываться в соответствии с logi c, определенным в моей пользовательской функции, а не с использованием обычного mean_squared_error.

В статьях я читал, что это можно реализовать с помощью интерфейса BoostedTreesEstimator, указав заголовок. Итак, я попытался реализовать мою модель следующим образом:

#define custom loss function to calculate smape
def custom_loss_fn(labels, logits):
    return (np.abs(logits - labels) / (np.abs(logits) + np.abs(labels))) * 2


#create input functions
def make_input_fn(X, y, n_epochs=None, shuffle=True):
    def input_fn():
        dataset = tf.data.Dataset.from_tensor_slices((dict(X), y))
        if shuffle:
            dataset = dataset.shuffle(NUM_EXAMPLES)
        dataset = dataset.repeat(n_epochs)  
        dataset = dataset.batch(NUM_EXAMPLES)  
        return dataset
    return input_fn


train_input_fn = make_input_fn(dftrain, y_train)
eval_input_fn = make_input_fn(dfeval, y_eval, n_epochs=1, shuffle=False)

my_head = tf.estimator.RegressionHead(loss_fn=custom_loss_fn)

#Training a boosted trees model
est = tf.estimator.BoostedTreesEstimator(feature_columns,
                                         head=my_head,
                                         n_batches_per_layer=1,  
                                         n_trees=90,
                                         max_depth=2)

est.train(train_input_fn, max_steps=100)
predictions = list(est.predict(eval_input_fn))

Этот код выдал ошибку следующим образом: «Подклассы Head должны реализовать create_estimator_spec() или« NotImplementedError: Подклассы Head должны реализовывать create_estimator_spec() или _create_tpu_estimator_spe c ().

Как я читал в статьях, create_estimator_spe c () используется, когда мы определяем model_fn () при создании нового Оценщика. Здесь я не хочу создавать какие-либо новые модели или оценщики, я только хочу использовать пользовательскую функцию потерь (вместо среднеквадратичной ошибки по умолчанию) при обучении, где модель обучения должна быть равна BoostedTreesRegressor / BoostingTreesEstimator.

Будет очень полезно, если кто-нибудь подскажет, как реализовать эту модель.

...