Реализация пользовательской функции потерь в Scikit Learn
Я хочу реализовать пользовательскую функцию потерь в Scikit Learn. Я использую следующий фрагмент кода:
def my_custom_loss_func(y_true,y_pred):
diff3=max((abs(y_true-y_pred))*y_true)
return diff3
score=make_scorer(my_custom_loss_func,greater_ is_better=False)
clf=RandomForestRegressor()
mnn= GridSearchCV(clf,score)
knn = mnn.fit(feam,labm)
Какие аргументы должны быть переданы в my_custom_loss_func
? Моя матрица меток называется labm
, Я хочу рассчитать разницу между фактическим и прогнозируемым результатом (по модели), умноженным на истинный результат. Если я использую labm
на месте y_true
что я должен использовать вместо y_pred
?
2 ответа
Хорошо, здесь происходит 3 вещи:
1) есть функция потерь во время обучения, используемая для настройки параметров ваших моделей
2) есть функция оценки, которая используется для оценки качества вашей модели
3) есть настройка гиперпараметров, которая использует функцию оценки для оптимизации ваших гиперпараметров.
Итак... если вы пытаетесь настроить гиперпараметры, то вы на правильном пути, определяя для этой цели "потерю fxn". Если, однако, вы пытаетесь настроить всю свою модель так, чтобы она хорошо работала, скажем, на тесте отзыва, тогда вам понадобится оптимизатор отзыва, который будет частью процесса обучения. Это сложно, но ты справишься...
1) Откройте свой классификатор. Давайте воспользуемся RFC, например: https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
2) нажмите [источник]
3) Видите, как он наследуется от ForestClassifier? Прямо в определении класса. Щелкните это слово, чтобы перейти к его родительскому определению.
4) Посмотрите, как этот новый объект наследуется от ClassifierMixin? Щелкните это.
5) Видите, как это написано в нижней части класса ClassifierMixin?
from .metrics import accuracy_score
return accuracy_score(y, self.predict(X), sample_weight=sample_weight)
Это ваша модель обучается точности. На этом этапе вам нужно ввести инъекцию, если вы хотите научить свою модель быть "моделью отзыва", "прецизионной моделью" или какой-либо другой моделью. Этот показатель точности встроен в SKlearn. Когда-нибудь кто-нибудь получше меня сделает этот параметр приемлемым для моделей, однако пока что вам нужно войти в свою установку sklearn и настроить этот параметр precision_score так, чтобы он был любым.
Удачи!
Документация для make_scorer выглядит следующим образом:
sklearn.metrics.make_scorer(score_func, greater_is_better=True, needs_proba=False,
needs_threshold=False, **kwargs)
Таким образом, вам не нужно передавать аргументы при вызове функции. Это то, что вы спрашивали?
Аргументы вашего my_custom_func_loss не имеют никакого отношения к вашим истинным ярлыкам, что labm
, Вы можете сохранить путь, как сейчас.
Внутри GridSearchCV вызовет функцию оценки, поэтому ваши истинные метки не конфликтуют там. y_pred
будут предсказанные значения, сгенерированные из выходных данных модели. y_true
будет назначен со значениями labm
,