Пользовательские функции потерь

Машинное обучение для финансов на Python

Nathan George

Data Science Professor

несовпадение направлений

Машинное обучение для финансов на Python

MSE со штрафом за направление

Если направления предсказания и цели совпадают:

  • $ \sum(y - \hat{y})^2$

Если нет:

  • $\sum (y - \hat{y})^2 * \text{penalty} $
Машинное обучение для финансов на Python

Реализация пользовательских функций потерь

import tensorflow as tf
Машинное обучение для финансов на Python

Создание функции

import tensorflow as tf

# create loss function def mean_squared_error(y_true, y_pred):
Машинное обучение для финансов на Python

Функция потерь «среднеквадратичная ошибка»

import tensorflow as tf

# create loss function
def mean_squared_error(y_true, y_pred):

loss = tf.square(y_true - y_pred) return tf.reduce_mean(loss, axis=-1)
Машинное обучение для финансов на Python

Добавление пользовательской функции потерь в Keras

import tensorflow as tf

# create loss function
def mean_squared_error(y_true, y_pred):
    loss = tf.square(y_true - y_pred)
    return tf.reduce_mean(loss, axis=-1)

# enable use of loss with keras import keras.losses keras.losses.mean_squared_error = mean_squared_error
# fit the model with our mse loss function
model.compile(optimizer='adam', loss=mean_squared_error)
history = model.fit(scaled_train_features, train_targets, epochs=50)
Машинное обучение для финансов на Python

Проверка правильности направления

tf.less(y_true * y_pred, 0)

Правильное направление:

  • отриц. * отриц. = полож.
  • полож. * полож. = полож.

Неправильное направление:

  • отриц. * полож. = отриц.
  • полож. * отриц. = отриц.
Машинное обучение для финансов на Python

Использование tf.where()

# create loss function
def sign_penalty(y_true, y_pred):
    penalty = 10.
    loss = tf.where(tf.less(y_true * y_pred, 0), 
                    penalty * tf.square(y_true - y_pred), 
                    tf.square(y_true - y_pred))
Машинное обучение для финансов на Python

Собираем всё вместе

# create loss function
def sign_penalty(y_true, y_pred):
    penalty = 100.
    loss = tf.where(tf.less(y_true * y_pred, 0),
                    penalty * tf.square(y_true - y_pred), 
                    tf.square(y_true - y_pred))

    return tf.reduce_mean(loss, axis=-1)

# enable use of loss with keras keras.losses.sign_penalty = sign_penalty
Машинное обучение для финансов на Python

Применение пользовательской функции потерь

# create the model
model = Sequential()
model.add(Dense(50,
                input_dim=scaled_train_features.shape[1],
                activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='linear'))
# fit the model with our custom 'sign_penalty' loss function
model.compile(optimizer='adam', loss=sign_penalty)
history = model.fit(scaled_train_features, train_targets, epochs=50)
Машинное обучение для финансов на Python

Форма «галстука-бабочки»

train_preds = model.predict(scaled_train_features)
# scatter the predictions vs actual
plt.scatter(train_preds, train_targets)
plt.xlabel('predictions')
plt.ylabel('actual')
plt.show()

график «галстук-бабочка»

Машинное обучение для финансов на Python

Создайте собственную функцию потерь!

Машинное обучение для финансов на Python

Preparing Video For Download...