Перекрестная проверка SKLearn: как передать информацию о примерах сгиба в мою функцию подсчета очков?

Я пытаюсь создать собственную функцию оценки для перекрестной проверки моей модели (бинарной классификации) в scikit-learn (Python).

Некоторые примеры моих необработанных тестовых данных:

Source   Feature1   Feature2   Feature3
 123        0.1        0.2        0.3
 123        0.4        0.5        0.6
 456        0.7        0.8        0.9

Предполагая, что любая складка может содержать несколько тестовых примеров из одного и того же источника...

Затем для набора примеров с одним и тем же источником я хочу, чтобы мой пользовательский счетчик «решил», что «победитель» будет примером, для которого модель выдает более высокую вероятность. Другими словами, может быть только один правильный прогноз для каждого источника, но если моя модель утверждает, что более одного примера оценки были «правильными» (метка = 1), я хочу, чтобы пример с наибольшей вероятностью был сопоставлен с правдой с помощью мой бомбардир.

Моя проблема в том, что для функции бомбардира требуется подпись:

score_func(y_true, y_pred, **kwargs)

где y_true и y_pred содержат только вероятность/метку.

Однако то, что мне действительно нужно, это:

score_func(y_true_with_source, y_pred_with_source, **kwargs)

поэтому я могу сгруппировать y_pred_with_source примеров по их источнику и выбрать победителя, который будет соответствовать y_true_with_source истине. Затем я могу, например, продолжить расчет своей точности.

Можно ли каким-то образом передать эту информацию? Может быть, индексы примеров?


person Qululu    schedule 16.12.2015    source источник


Ответы (1)


Похоже, у вас здесь проблема с обучением рангу. Вы пытаетесь найти экземпляр с самым высоким рейтингом из каждой группы экземпляров. Learning-to-Rank прямо сейчас не поддерживается в scikit-learn — scikit-learn в значительной степени предполагает i.i.d. экземпляры - так что вам придется проделать дополнительную работу.

Я думаю, что мое первое предложение — опустить уровень в API и использовать итераторы перекрестной проверки. Это просто сгенерирует индексы для обучения и проверки. Вы можете подмножить свои данные с помощью этих индексов и вызвать fit и predict для подмножеств, удалив Источник, а затем оценить их, используя столбец Источник.

Вы, вероятно, можете взломать подход cross_val_score, но это сложнее. В scikit-learn существует различие между функцией оценки, которую вы показали выше, и оценочный объект (который может быть функцией), полученный cross_val_score. Объект оценки — это вызываемый объект или функция с сигнатурой scorer(estimator, X, y). Мне кажется, что вы можете определить объект оценки, который работает для вашей метрики. Вам просто нужно удалить столбец Источник перед отправкой данных в оценщик, а затем использовать этот столбец при расчете метрики. Если вы пойдете по этому пути, я думаю, вам также придется обернуть классификатор, чтобы его метод fit пропускал столбец Source.

Надеюсь, это поможет... Удачи!

person Dthal    schedule 20.12.2015
comment
Да! Я думал, что мне, возможно, придется реализовать свой собственный итератор свертывания и счетчик, но ваше четкое объяснение все упорядочило. Спасибо! - person Qululu; 27.12.2015