Как использовать log_loss в GridSearchCV с метками нескольких классов в Scikit-Learn (sklearn)?

Я пытаюсь использовать аргумент log_loss в параметре scoring GridSearchCV, чтобы настроить этот мультиклассовый (6 классов) классификатор. Я не понимаю, как задать параметр label. Даже если бы я дал ему sklearn.metrics.log_loss, он бы изменился для каждой итерации перекрестной проверки, поэтому я не понимаю, как дать ему параметр labels?

Я использую Python v3.6 и Scikit-Learn v0.18.1

Как можно использовать GridSearchCV с log_loss с настройкой мультиклассовой модели?

Мое представление класса:

1    31
2    18
3    28
4    19
5    17
6    22
Name: encoding, dtype: int64

Мой код:

param_test = {"criterion": ["friedman_mse", "mse", "mae"]}
gsearch_gbc = GridSearchCV(estimator = GradientBoostingClassifier(n_estimators=10), 
                        param_grid = param_test, scoring="log_loss", n_jobs=1, iid=False, cv=cv_indices)
gsearch_gbc.fit(df_attr, Se_targets)

Вот конец ошибки, а полная - здесь https://pastebin.com/1CshpEBN:

ValueError: y_true contains only one label (1). Please provide the true labels explicitly through the labels argument.

ОБНОВЛЕНИЕ: просто используйте это, чтобы сделать счетчика на основе @Grr

log_loss_build = lambda y: metrics.make_scorer(metrics.log_loss, greater_is_better=False, needs_proba=True, labels=sorted(np.unique(y)))

person O.rka    schedule 12.04.2017    source источник
comment
Распечатайте здесь свой Se_targets. А также взгляните на scikit-learn.org/stable/ модули /   -  person Vivek Kumar    schedule 13.04.2017
comment
@ O.rka: labels = sorted (np.unique (y)). Здесь y содержит метки для записей в наборе поездов, верно? Или он содержит метки для всех записей в наборе данных?   -  person Debbie    schedule 11.10.2018


Ответы (2)


Я предполагаю, что каким-то образом у вашего разделения данных есть только одна метка класса в y_true. хотя это кажется маловероятным, исходя из опубликованного вами дистрибутива, я думаю, что это возможно. Хотя я не сталкивался с этим раньше, кажется, что в _1 _] (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html) аргумент метки ожидается, если все метки одинаковы. Формулировка этого раздела документации также создает впечатление, будто метод применяет двоичную классификацию, если labels не передан.

Теперь, как вы правильно предполагаете, вы должны передать log_loss как scorer=sklearn.metrics.log_loss(labels=your_labels)

person Grr    schedule 13.04.2017
comment
будут ли мои ярлыки такими же, как y_true? - person O.rka; 13.04.2017
comment
Я считаю, что вы передадите свой список классов, то есть [1,2,3,4,5,6]. Похоже, что labels= kwarg использует LabelBinarizer для создания классов меток, а затем бинаризует значения y_true. Проверьте это в источнике здесь - person Grr; 13.04.2017
comment
TypeError: log_loss() missing 2 required positional arguments: 'y_true' and 'y_pred' Метод принимает 2 аргумента по умолчанию, которые изменятся во время перекрестной проверки. - person O.rka; 13.04.2017
comment
возможно, вам придется использовать make_scorer - person Grr; 13.04.2017

Вы можете просто указать "neg_log_loss_scorer" (или "log_loss_scorer") в более старых версиях, которые будут использовать отрицательную потерю журнала.

person Andreas Mueller    schedule 18.04.2017