对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、F1值、KS曲线、ROC曲线、AUC面积等。
也可以自己定义函数,把模型结果分割成n(100)份,计算top1的准确率、覆盖率。
之前阐述了混淆矩阵、F1值、KS曲线和ROC曲线AUC面积,本文是该系列的完结篇,介绍自定义函数count_table。
一、详细介绍count_table
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:该组样本的最高得分,如果是概率的话即为最高概率。
二、用Python如何计算count_table
接下来就来看下count_table的具体代码和调用语句:
def count_table(predict, y, num=100):
'''
predict为预测值
y为真实值
num为分组的数量
'''
num=num
check_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_table
count_table=count_table(train_date['predict'], train_date['y'], 30)
count_table
train_date['predict']:模型预测值或预测分数。
train_date['y']:真实值。
30:分的组数,可以自己随意定义。
得到结果如下:
可以发现,当概率大于0.954时,该组坏样本数为39,总计样本数为40,该组坏样本率为0.975,坏样本覆盖率为0.13。
至此,count_table介绍和Python实现实例已讲解完毕,感兴趣的同学可以自己尝试实现一下。