Python 熊猫相当于计算假阳性率

Python 熊猫相当于计算假阳性率,python,pandas,Python,Pandas,我有一个来自ML分类器的数据帧df,该分类器具有以下字段userid,classifier\u score,truth。我想计算阈值为0.62时每个用户ID的误报率分类器评分数据范围从0.1999到0.89。现在,我使用了一系列条件并创建了一个新的列col,说明真值和分类器得分之间的关系是假阳性、假阴性、真阳性还是真阴性 df['col']=df.apply(条件,轴=1) 然后我将唯一的用户ID存储在一个列表中 unique\u users=df.user.unique().tolist()

我有一个来自ML分类器的数据帧
df
,该分类器具有以下字段
userid
classifier\u score
truth
。我想计算阈值为0.62时每个用户ID的误报率<代码>分类器评分数据范围从0.1999到0.89。现在,我使用了一系列条件并创建了一个新的列
col
,说明真值和分类器得分之间的关系是假阳性、假阴性、真阳性还是真阴性

df['col']=df.apply(条件,轴=1)

然后我将唯一的用户ID存储在一个列表中

unique\u users=df.user.unique().tolist()
然后我循环通过每一个来计算假阳性分数

fpr_dict = {}
for id in user_ids:
   fn, tn, fp, tp = 0, 0, 0, 0 
   elems = df[df.userid==id].tolist()
   for elem in col:
       if elem == 'fn': fn += 1
       elif elem == 'fp': fp += 1
       elif elem == 'tp': tp += 1
       elif elem == 'tn': tn += 1
   try:
      fpr = fp / (fp + tn) 
   except ZeroDivisionError:
      fpr = 0.0
   fpr_dict[id] = fpr
有没有更好的方法只使用函数来实现这一点? 注意:我将fn、tn、fp、tp初始化为0,因为某些用户ID可能没有全部4个,它们将有4个的一些组合

编辑:数据帧

userid | classifier_score | truth  | col 
0001      0.6721            1        TP
0001      0.2918            1        FP
0001      0.1236            0        TN
.
.
.
0064      0.7168            0        FN

我没有用实际的数据帧测试它,也许试试这个

th = 0.62
predicted_pos = df['classifier_score'] > th

userid_group = df.groupby('userid', sort=False)

userid_count = userid_group.size()

df['fp'] = predicted_pos & (df['truth'] == 0)
fpr = userid_group['fp'].sum() / userid_count
如果你想要一本字典,你可以把
dict(fpr)
放在最后


编辑:正如OP指出的,fpr=fp/(fp+tn),计算应为:

th = 0.62
predicted_pos = df['classifier_score'] > th

userid_group = df.groupby('userid', sort=False)

df['fp'] = predicted_pos & (df['truth'] == 0)
df['tn'] = df['truth'] == 0

fp = userid_group['fp'].sum()
tn = userid_group['tn'].sum()
fpr =  fp / (fp + tn)

您能添加一个您正在使用的数据帧的示例吗?请查看并更新带有您的输入和预期数据帧示例的tour问题。@alec_djinn editedThank,这是正确的,但除数在结尾是错误的。对于完全阳性率,您需要将误报数除以总阴性数或误报与真阴性之和。不过,修改了您的代码使其适用于我。谢谢@Samnp,谢谢你指出错误,我只是做了编辑。