Как обработать средневзвешенное значение для AU C и выбрать правильный порог для построения матрицы путаницы? - PullRequest
1 голос
/ 04 марта 2020

У меня есть задача двоичной классификации, где я подгоняю модель с помощью классификатора 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 ! Любая идея для решения этих проблем?

1 Ответ

1 голос
/ 04 марта 2020

Чтобы ответить на ваш первый вопрос, вы можете просто использовать параметр weighted функции roc_auc_score.

Например -

roc_auc_score(y_test, pred, average = 'weighted')

Чтобы ответить на вторую половину вашего вопроса, пожалуйста, уточните немного. Я могу помочь вам с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...