Python 熊猫相当于计算假阳性率
我有一个来自ML分类器的数据帧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()
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,谢谢你指出错误,我只是做了编辑。