问题描述
我试图在不使用 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 击败或接近它。