1

我有一个二进制分类任务,我使用 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

我使用以下代码来训练模型并计算 roc 值:

  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],它给了我另一个价值作为 auc 价值。我的第一个问题是如何直接获得 auc 的加权平均值?我的第二个问题是如何选择正确的切点来构建具有不平衡数据的混淆矩阵?这是因为默认情况下分类器使用 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!任何想法来处理这些问题?

4

1 回答 1

1

要回答您的第一个问题,您可以简单地使用 roc_auc_score 函数的参数weighted

例如 -

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

要回答您问题的后半部分,请您详细说明一下。我可以帮你。

于 2020-03-04T14:08:48.423 回答