如何从积极的未标记学习中计算 roc auc 分数?

Posted

技术标签:

【中文标题】如何从积极的未标记学习中计算 roc auc 分数?【英文标题】:How to calculate roc auc score from positive unlabeled learning? 【发布时间】:2021-07-29 23:44:07 【问题描述】:

我正在尝试调整一些代码以用于来自 this example 的积极无标签学习,它与我的数据一起运行,但我还想计算我遇到的 ROC AUC 分数。

我的数据分为正样本 (data_P) 和未标记样本 (data_U),每个样本只有 2 个特征/列数据,例如:

#3 example rows:
data_P

[[-1.471,  5.766],
       [-1.672,  5.121],
       [-1.371,  4.619]]

#3 example rows:
data_U

[[1.23,  6.26],
       [-5.72,  4.1213],
       [-3.1,  7.129]]

我在链接的示例中运行积极的未标记学习:

known_labels_ratio = 0.5

NP = data_P.shape[0]
NU = data_U.shape[0]

T = 1000
K = NP
train_label = np.zeros(shape=(NP+K,))
train_label[:NP] = 1.0
n_oob = np.zeros(shape=(NU,))
f_oob = np.zeros(shape=(NU, 2))
for i in range(T):
    # Bootstrap resample
    bootstrap_sample = np.random.choice(np.arange(NU), replace=True, size=K)
    # Positive set + bootstrapped unlabeled set
    data_bootstrap = np.concatenate((data_P, data_U[bootstrap_sample, :]), axis=0)
    # Train model
      model = DecisionTreeClassifier(max_depth=None, max_features=None, 
                                   criterion='gini', class_weight='balanced')
    model.fit(data_bootstrap, train_label)
    # Index for the out of the bag (oob) samples
    idx_oob = sorted(set(range(NU)) - set(np.unique(bootstrap_sample)))
    # Transductive learning of oob samples
    f_oob[idx_oob] += model.predict_proba(data_U[idx_oob])
    n_oob[idx_oob] += 1
    
predict_proba = f_oob[:, 1]/n_oob

这一切都运行良好,但我想要的是运行 roc_auc_score(),我一直在坚持如何做到不出错。

目前我正在尝试:

y_pred = model.predict_proba(data_bootstrap)
roc_auc_score(train_label, y_pred)
ValueError: bad input shape (3, 2)

问题似乎是y_pred 给出的输出有 2 列,如下所示:

y_pred
array([[0.00554287, 0.9944571 ],
       [0.0732314 , 0.9267686 ],
       [0.16861796, 0.83138204]])

我不确定为什么y_pred 会这样结束,它是根据样本是否分为两组给出概率吗?正面还是其他本质?我可以过滤这些以每行选择得分最高的概率吗?或者有没有办法让我改变这个或其他方式来计算 AUCROC 分数?

【问题讨论】:

【参考方案1】:

y_pred必须是单个数字,给出正类p1的概率;目前您的y_pred 包含[p0, p1] 的两个概率(根据定义,p0+p1=1.0)。

假设你的正类是1类(即y_pred中每个数组的第二个元素),你应该做的是:

y_pred_pos = [y_pred[i, 1] for i in range(len(y_pred))]
y_pred_pos # inspect
# [0.9944571, 0.9267686, 0.83138204]

roc_auc_score(train_label, y_pred_pos)

如果您的 y_pred 是 Numpy 数组(而不是 Python 列表),您可以将上面第一个命令中的列表推导替换为:

y_pred_pos  = y_pred[:,1]

【讨论】:

以上是关于如何从积极的未标记学习中计算 roc auc 分数?的主要内容,如果未能解决你的问题,请参考以下文章

如何求CNN模型(keras)的ROC曲线和AUC分数

sklearn 多类 roc auc 分数

如何在 keras 中计算接收操作特征 (ROC) 和 AUC?

R语言使用timeROC包计算无竞争情况下的生存资料多个标记物在相同时间下的AUC值并可视化多个标记物在相同时间下的ROC值多指标的ROC曲线

AUC-ROC 用于无排名分类器,例如 OSVM

R语言使用timeROC包计算存在竞争情况下的生存资料多个标记物在相同时间下的AUC值并可视化多个标记物在相同时间下的ROC值多指标的ROC曲线