Как запустить GridSearchCV на основе своей метрики оценки?

Двухклассовая классификация, y- цели, x - признаки, weights - веса.
Собственная метрика - сумма положительных значений весов при совпадении прогноза с реальностью.

Библиотеки:

import numpy as np
import pandas as pd
import talib as ta
import xgboost
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV

Данные:

x = np.random.randint(0,2,size=(1000, 5))
y = np.random.randint(0,2,size=(1000, 1))
weights = np.random.randint(-100,100,size=(1000, 1))

Своя Метрика:

def my_score_func(y_true, y_pred):
    global weights
    return  weights[(y_pred==1) & (y_true==1) & (weights>=0)].sum()

my_scorer = make_scorer(my_score_func, greater_is_better=True)  

Поиск по сетке:

XGB = xgboost.XGBClassifier()
param_grid = {'n_estimators': [20,30,50,80,100]}
XGBgs = GridSearchCV(XGB, param_grid, scoring = my_scorer, cv = 2) 
XGBgs.fit(x,  y)

Не получается настроить поиск по сетке на основе своей метрики.
Ошибка:

ValueError: operands could not be broadcast together with shapes (501,501) (1000,1)


Ответы (1 шт):

Автор решения: MaxU
weights = res

def my_score_func(y_true, y_pred):
    global weights
    return weights[(y_pred==1) & (y_true==1) & (weights>=0)].sum()

my_scorer = make_scorer(my_score_func, greater_is_better=True)

P.S. пример использования созданного scorer


или так (более предпочтительный вариант):

def my_score_func(y_true, y_pred, weights):
    return weights[(y_pred==1) & (y_true==1) & (weights>=0)].sum()

my_scorer = make_scorer(my_score_func, greater_is_better=True, weights=res)
→ Ссылка