首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Sklearn中,多数班是否被视为阳性?将假阳性率计算为假阴性率

在Sklearn中,多数班是否被视为阳性?将假阳性率计算为假阴性率
EN

Stack Overflow用户
提问于 2019-06-05 11:32:32
回答 1查看 478关注 0票数 0

我正在使用Sklearn处理不平衡数据集的分类。Sklearn计算错了false_positive_ratetrue_positive_rate;当我想计算AUC分数时,结果与我从混淆矩阵中得到的结果不同。

从Sklearn中,我得到了以下混淆矩阵:

代码语言:javascript
复制
confusion = confusion_matrix(y_test, y_pred)
array([[  9100,   4320],
       [109007, 320068]], dtype=int64)

当然,我的理解是:

代码语言:javascript
复制
+-----------------------------------+------------------------+
|        |       Predicted          |        Predicted       |
+-----------------------------------+------------------------+
| Actual | True positive = 9100     |  False-negative = 4320 |                       
| Actual | False-positive = 109007  |  True negative = 320068|
+--------+--------------------------+------------------------+

然而,对于FPR和TPR,我得到了以下结果:

代码语言:javascript
复制
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_pred)
(false_positive_rate, true_positive_rate)
(array([0.        , 0.3219076, 1.        ]),
 array([0.        , 0.7459488, 1.        ]))

结果与confusion_matrix不同。根据我的表格,FPR实际上是FNR,TPR实际上是TNR。然后我检查了混淆矩阵文档,我发现:

因此,在二进制分类中,真负数为C0,0,假负数为C1,真正数为C1,假负数为C0,1。

这意味着,根据Sklearn的说法,confusion_matrix看起来如下所示:

代码语言:javascript
复制
+-----------------------------------+---------------------------+
|        |       Predicted          |        Predicted          |
+-----------------------------------+---------------------------+
| Actual | True-Positive  = 320068  | False-Negative = 109007   |                       
| Actual | False-Positive = 4320    | True-Negative  = 9100     |
+--------+--------------------------+---------------------------+

根据这一理论,对于二进制分类,稀有类被表示为正类。

为什么斯凯夫特认为大多数班级都是积极的?

EN

回答 1

Stack Overflow用户

发布于 2021-06-05 12:37:37

经过一些实验,我发现当使用来自IsolationForestsklearn处理不平衡的数据时,如果检查confusion_matrix,可以看出IsolationForest将大多数(正常)类视为一个正类,而次要类应该是欺诈/异常/异常检测任务中的正类

为了克服这一挑战,有两种解决办法:

  1. 解释混淆矩阵,反之亦然。FP代替了FNTP代替了TN
  2. 如果由于对不平衡数据的错误处理而希望正确传递结果,则可以使用以下技巧:

通常情况下,如果返回值为1,异常值为1,inliers为1,那么如果在IsolationForest的输出中将1替换为-1,然后用1替换-1,那么在这种情况下,您可以正确地使用标准的度量计算。

代码语言:javascript
复制
IF_model = IsolationForest(max_samples="auto",
                           random_state=11,
                           contamination = 0.1,
                           n_estimators=100,
                           n_jobs=-1)



IF_model.fit(X_train_sf, y_train_sf)
y_pred_test = IF_model.predict(X_test_sf)

counts = np.unique(y_pred_test, return_counts=True)
#(array([-1,  1]), array([44914,  4154]))

#replace 1 with -1 and then -1 with 1
if (counts[1][0] < counts[1][1] and counts[0][0] == -1) or (counts[1][0] > counts[1][1] and counts[0][0] == 1): y_pred_test = -y_pred_test

考虑到混淆矩阵文档和问题定义这里,对于欺诈/离群/异常检测或基于文学性Ref.1Ref.2Ref.3的二进制分类器,上述技巧应该有效并正确地形成混淆矩阵如下:

代码语言:javascript
复制
+----------------------------+---------------+--------------+
|                            |  Predicted    |  Predicted   |
+----------------------------+---------------+--------------+
| Actual (Positive class)[1] |      TP       |      FN      |                       
| Actual (Negative class)[-1]|      FP       |      TN      |
+----------------------------+---------------+--------------+
代码语言:javascript
复制
tn, fp, fn, tp = confusion_matrix(y_test_sf, y_pred_test).ravel()
print("TN: ",tn,"\nFP: ", fp,"\nFN: " ,fn,"\nTP: ", tp)
print("Number of positive class instances: ",tp+fn,"\nNumber of negative class instances: ", tn+fp)

检查评估结果:

代码语言:javascript
复制
print(classification_report(y_test_sf, y_pred_test, target_names=["Anomaly", "Normal"]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56459660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档