Как запустить 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)