python - 为什么用纯 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, 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 击败或接近它,即使你尽可能高效地编写代码。
推荐阅读
- php - Laravel 中的动态滑块
- vue.js - 异步函数返回未定义(Vuejs)
- php - Laravel:将具有javascript的子视图注入多个页面的最佳实践是什么
- batch-file - 如何使用 .bat 文件读取文件中的特殊字符
- python - 如何将一列除以另一列,其中一个数据框的列值对应于 Python Pandas 中另一个数据框的列值?
- php - puzzling behavior using dropzone
- python - Running multiple functions concurrently
- python - TypeError:列表索引必须是整数或切片,而不是标签
- python - os.rename 从编辑器终端工作,但从 Windows 资源管理器启动时失败
- django-rest-framework - 将文档添加到 generics.RetrieveAPIView 'retrieve' 方法的查询参数