为什么用纯 python 计算 ROC-AUC 分数需要太长时间?

问题描述

我试图在不使用 sklearn 而是使用纯 python 的情况下计算接收器操作特性曲线 (ROC AUC),虽然我可以获得正确的分数,但需要 10-15 分钟(对于大约 10k 行数据集)打印输出。 在使用 sklearn 内置函数时,它的计算速度很快,只需几秒钟。 如果有人可以帮助我理解它。

这是一个示例代码片段。

Data =    y     pro
      0  1  0.123456
      1  1  0.035056
      2  0  0.226222
      3  0  0.412454
      4  1  0.121123

uniq = list(data.pro.unique())
actual =data.y
  
  tpr_list = []
  fpr_list = []
  for thr in uniq:
    y_pred = []
    for v in data.proba:
      if v <thr:
        y_pred.append(0)
      else:
        y_pred_auc.append(1)
    TP,FP,TN,FN=0,0
    
    for i in range(len(uniq)):
      if y_pred[i] ==1 and actual[i] ==1:
        TP+=1
      elif y_pred[i] == 0 and actual[i] ==0:
        TN+=1
      elif y_pred_auc[i]==1 and actual[i] ==0:
        FP+=1
      else:
        FN+=1
    

使用TP、FP、TN、FN;我已经计算了 AUC,我认为这部分不是理解问题所必需的,所以我删除了它。

谢谢

解决方法

除了效率方面,关于代码复杂性,scikit-learn 使用 Numpy 进行各种操作,并在 C 代码中进行了优化。我强烈怀疑,即使您尽可能高效地编写代码,您也可以通过纯 Python 击败或接近它。