Как использовать пользовательскую функцию потерь в нейронной сети с MLPClassifier Sklearn? - PullRequest
0 голосов
/ 29 ноября 2018

Я хотел бы использовать пользовательскую функцию потерь для обучения нейронной сети в обучении scikit;используя MLPClassifier.Я хотел бы придать большее значение большим значениям.Поэтому я хотел бы использовать что-то вроде среднеквадратичной ошибки, но умножить числитель на y.Таким образом, это будет выглядеть так:

1 / n∑y (yi-y (hat) i) ^ 2

Вот код моей модели:

mlp10 = MLPClassifier(hidden_layer_sizes=(150,100,50,25,10), max_iter=1000, 
random_state=42)
mlp10.fit(X_train, y_train)

Как я могу изменить функцию потерь?

1 Ответ

0 голосов
/ 29 ноября 2018

Я не верю, что вы можете изменить функцию потерь напрямую, поскольку для нее нет параметра в конструкции классификатора, а в документации явно указано, что она оптимизируется с использованием функции потери журнала.Если вы хотите быть немного гибкими, вы можете получить искомый эффект просто путем преобразования значений y перед тренировкой, а затем использовать обратное преобразование для восстановления предсказанных y s.после тестирования.

Например, отображение y_prime = transform(y) и y = inverse_transform(y_prime) на каждое значение, где вы определяете transform и inverse_transform как:

def transform(y):
    return y ** 2

def inverse_transform(y_prime):
    return math.sqrt(y_prime)

, приведет к большим значениям y чтобы иметь больше влияния в обученииОчевидно, вы можете поэкспериментировать с различными преобразованиями, чтобы увидеть, что лучше всего подходит для вашего варианта использования.Ключ просто в том, чтобы убедиться, что transform является суперлинейным.

Перед тренировкой вам необходимо выполнить:

y_train = map(transform, y_train)

И после вызова predict:

y_predict = model.predict(x)
y_predict = map(inverse_transform, y_predict)
...