У меня есть задача двоичной классификации, где я подгоняю модель с помощью классификатора XGBClassifier и пытаюсь предсказать «1» и «0», используя набор тестов. В этой задаче у меня есть очень несбалансированное большинство данных «0» и меньшинство «1» в данных обучения (грубых то же самое в тестовом наборе). Мои данные выглядят так:
F1 F2 F3 …. Target
S1 2 4 5 …. 0
S2 2.3 4.3 6.4 1
… … … …. ..
S4000 3 6 7 0
Я использовал следующий код для обучения модели и вычисления значения ro c:
my_cls=XGBClassifier()
X=mydata_train.drop(['target'])
y= mydata_train['target']
x_tst=mydata_test.drop['target']
y_tst= mydata_test['target']
my_cls.fit(X, y)
pred= my_cls.predict_proba(x_tst)[:,1]
auc_score=roc_auc_score(y_tst,pred)
Приведенный выше код дает мне значение как auc_score, но, похоже, это значение для одного класса, использующего my_cls.predict_proba (x_tst) [:, 1] , если я изменю его на my_cls.predict_proba (x_tst) [:, 0] , это дает мне другое значение как значение c. Мой первый вопрос: как я могу напрямую получить средневзвешенное значение для au c? Мой второй вопрос: как выбрать правильную точку отсечения для построения матрицы путаницы с несбалансированными данными? Это связано с тем, что по умолчанию классификатор использует 50% в качестве порога для построения матрицы, но поскольку мои данные очень несбалансированы, кажется, что нам нужно выбрать правильный порог. Мне нужно сосчитать TP и FP, поэтому мне нужна эта точка отсечения.
Если я использую весовой класс для обучения модели, справится ли она с проблемой (я имею в виду, могу ли я использовать точку отсечения 50% по умолчанию)? Например, что-то вроде этого:
My_clss_weight=len(X) / (2 * np.bincount(y))
Затем попробуйте подобрать модель к этому:
my_cls.fit(X, y, class_weight= My_clss_weight)
Однако приведенный выше код my_cls.fit (X, y, class_weight = My_clss_weight) не работает с XGBClassifier и выдает ошибку. Это работает с LogessticRegression , но я хочу применить с XGBClassifier ! Любая идея для решения этих проблем?