如何处理 AUC 的加权平均值并选择正确的阈值来构建混淆矩阵?
How to handle weighted average for AUC and selecting the right threshold for building the confusion matrix?
我有一个二进制 classification 任务,我使用 XGBClassifier classifier 拟合模型并尝试使用测试集预测“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 的值,但这个值似乎是一个 class 使用 my_cls.predict_proba(x_tst )[:,1],如果我把它改成my_cls.predict_proba(x_tst)[:,0],它给了我另一个值作为 auc 值。我的第一个问题是如何直接获得 auc 的加权平均值?我的第二个问题是如何 select 正确的切点来构建具有不平衡数据的混淆矩阵?这是因为默认情况下,classifier 使用 50% 作为构建矩阵的阈值,但由于我的数据非常不平衡,因此我们似乎需要 select 一个正确的阈值。我需要计算 TP 和 FP,这就是为什么我需要这个切点。
如果我使用权重 class 来训练模型,它能解决问题吗(我的意思是我可以默认使用 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')
为了回答你问题的后半部分,能否请你详细说明一下。我可以帮你。
我有一个二进制 classification 任务,我使用 XGBClassifier classifier 拟合模型并尝试使用测试集预测“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 的值,但这个值似乎是一个 class 使用 my_cls.predict_proba(x_tst )[:,1],如果我把它改成my_cls.predict_proba(x_tst)[:,0],它给了我另一个值作为 auc 值。我的第一个问题是如何直接获得 auc 的加权平均值?我的第二个问题是如何 select 正确的切点来构建具有不平衡数据的混淆矩阵?这是因为默认情况下,classifier 使用 50% 作为构建矩阵的阈值,但由于我的数据非常不平衡,因此我们似乎需要 select 一个正确的阈值。我需要计算 TP 和 FP,这就是为什么我需要这个切点。
如果我使用权重 class 来训练模型,它能解决问题吗(我的意思是我可以默认使用 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')
为了回答你问题的后半部分,能否请你详细说明一下。我可以帮你。