Пользовательская функция в make_scorer в sklearn

Я пытаюсь создать пользовательскую функцию оценки для реализации в GridSearchCV для проблемы классификации и не думаю, что вполне понимаю, как она работает (я прочитал документацию). Моя цель состоит в том, чтобы придать различный вес типам ошибочных классификаций. Мой код выглядит следующим образом. good и excellent — это два класса, к которым относятся мои образцы. Я думаю, проблема в том, что GridSearchCV передает истинные и предсказанные значения в score_func, но я не знаю, как это исправить.

def score_func(y, y_pred):
    '''score function for grid search'''
    error = 0
    for i in range(len(y)):
        if y[i] == 'excellent':
            if y_pred[i] == 'excellent':
                error += 10
            elif y_pred[i] == 'good':
                error += 5
    return error

score_f = make_scorer(score_func, needs_proba=False ,needs_threshold=False)

RF = make_pipeline(
        StandardScaler(),
        RandomForestClassifier(random_state=101, criterion = 'gini')
        )

gs_rf = GridSearchCV(estimator=RF, param_grid=param_grid, scoring=score_f, 
                     cv=KFold(5, True, random_state=1234)).fit(X_data,y_data)

Заранее спасибо!


person J.Menton    schedule 13.04.2020    source источник
comment
где определяется make_scorer()?   -  person Peter Prescott    schedule 13.04.2020
comment
make_scorer — это не функция, это метрика, импортированная из sklearn. Проверьте это здесь.   -  person Henrique Branco    schedule 13.04.2020
comment
Правильно, это метрика в sklearn.metrics, в которой я должен определить и реализовать свою собственную функцию оценки здесь   -  person J.Menton    schedule 13.04.2020


Ответы (1)


Если ваша цель — связать веса для ваших меток, вам не нужно создавать функцию.

Просто используйте параметр class_weight из RandomForestClassifier.

weight_dict = {'excellent':10, 'good':5}
RandomForestClassifier(random_state=101, criterion='gini', class_weight=weight_dict)
person Henrique Branco    schedule 13.04.2020
comment
Спасибо! Хотя, допустим, у меня 3 класса: «отлично», «хорошо» и «плохо». И я хочу сказать, что ошибочная классификация образца excellent как good не так серьезна, как ошибочная классификация образца excellent как poor. Могу ли я сделать это, используя class_weight? Я думаю, что если бы я определил функцию оценки, как указано выше, я мог бы сказать, что error += 0 модель ошибочно классифицировала образец как poor. Таким образом, я мог количественно оценить разницу в ошибочных классификациях. - person J.Menton; 13.04.2020
comment
Я просто сделаю небольшое исследование об этом и дам отзыв для вас здесь. - person Henrique Branco; 13.04.2020
comment
Всем привет. Я только что нашел эту ссылку. Это говорит о том, что вы можете определить порог для вероятности каждого класса вместо весов для классов. Просто прочитайте его и попробуйте определить порог принятия решения. Пожалуйста, вернитесь сюда, чтобы сказать, сработало это или нет. - person Henrique Branco; 14.04.2020
comment
Этот другой квест в SO также может помочь ты. - person Henrique Branco; 14.04.2020
comment
Отлично, сейчас посмотрю! Спасибо за вашу помощь! - person J.Menton; 14.04.2020