我有一个二元分类任务,我使用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中应用!有什么办法来处理这些问题吗?
回答:
回答你的第一个问题,你可以简单地使用roc_auc_score函数的weighted参数。
例如 –
roc_auc_score(y_test, pred, average = 'weighted')
回答你问题的第二部分,你能详细说明一下吗?我可以帮你解决这个问题。