之前阐述了混淆矩阵、F1值、KS曲线和ROC曲线AUC面积,本文是该系列的完结篇,介绍自定义函数count_table。
详细介绍count_table
用Python如何计算count_table

由于当时所在的公司需要建立模型,从商户交易流水中获取有用的信息,判断该商户是否有赌博、欺诈、伪卡、盗刷、洗钱等风险。
而公司的运营人员是有限的,这时需要模型从海量商户中捞出有以上风险特征的商户,推送给运营人员进行排查。
这时更关注的是模型评分top部分的准确率,基于这个需要,就自己写了count_table函数来衡量模型的优秀程度。
count_table的表结构如下:

每一列代表的含义详解:
group:组别,代表该行是第几组。
group_num:该组含的样本数。一般是均分的,比如10个样本,分5组,那每组含的样本数为2。
group_cumsum:该组累计样本数。从第一组累积到该组,总计的样本数。
y_sum:该组标签为1的样本数,在风险领域一般定义有风险的样本标签为1。
y_cumsum:该组累计标签为1的样本数。
group_bad_rate:该组坏样本率,即该组标签为1的样本数除以该组含的样本数。
coverage_rate:累计到该组的坏样本覆盖率,即该组累计标签为1的样本数除以该组累计样本数。
min_score:该组样本的最低得分,如果是概率的话即为最低概率。
max_score:该组样本的最高得分,如果是概率的话即为最高概率。

接下来就来看下count_table的具体代码和调用语句:
def count_table(predict, y, num=100):'''predict为预测值y为真实值num为分组的数量'''num=numcheck_table=pd.concat([predict, y], axis=1)check_table_1=check_table.sort_values(by="predict",ascending=False).reset_index(drop=True)check_table_1['rank']=np.floor((check_table_1.index / len(check_table_1) * num) + 1)check_table_1=check_table_1.astype(float)group=pd.DataFrame(check_table_1['rank'].drop_duplicates().reset_index(drop=True))group=group.astype(int)group_num=pd.DataFrame(check_table_1['rank'].value_counts().reset_index(drop=True))count_table=pd.concat([group,group_num], axis=1)count_table.columns=['group', 'group_num']count_table['group_cumsum']=count_table['group_num'].cumsum()count_table['y_sum']=pd.DataFrame(check_table_1.groupby(by=['rank'])['y'].sum().reset_index(drop=True))count_table['y_cumsum']=count_table['y_sum'].cumsum()count_table['group_bad_rate']=count_table['y_sum']/count_table['group_num']count_table['coverage_rate']=count_table['y_cumsum']/sum(count_table['y_sum'])count_table['min_score'] = pd.DataFrame(check_table_1.groupby(by=['rank'])['predict'].min().reset_index(drop=True))count_table['max_score'] = pd.DataFrame(check_table_1.groupby(by=['rank'])['predict'].max().reset_index(drop=True))return count_tablecount_table=count_table(train_date['predict'], train_date['y'], 30)count_table

可以发现,当概率大于0.954时,该组坏样本数为39,总计样本数为40,该组坏样本率为0.975,坏样本覆盖率为0.13。
至此,count_table介绍和Python实现实例已讲解完毕,感兴趣的同学可以自己尝试实现一下。
往期回顾:


扫一扫关注我
13162366985
投稿微信号、手机