规则要全部过,成本挺高的。
过漏斗排序,就要需要知道怎么排序。
举个栗子:以下为用户全部规则都进行判断的时候。(0是未命中规则,1是命中规则)
user_id | rule_1 | rule_2 | rule_3 | rule_4 | rule_5 | rule_6 | rule_7 | rule_8 | rule_9 | rule_10 |
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |
2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
13 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
14 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
15 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
16 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
17 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
18 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
19 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
如果需要更改风控流程为只要命中一个规则则输出结果,不进行后续规则判断,则需要对这些规则进行排序。每个规则调用都可能互相干涉且成本可能不一。
按照上面栗子的数据使用穷举的话,会有3628800种排序方式。如果这样的话,生活就不美好了。所以需要一个算法来进行处理从而降低筛选耗时提高效率。
设:A、B、C规则分别命中情况:307、611、173 规则可能存在多重命中的情况。其中全集U为2575。Pa、Pb、Pc规则调用金额分别为:0.15、0.5、0.15。
求A、B、C规则排序。
解:对于3个规则只需要对比每个规则的优先级,再根据每个规则的优先级进行排序即可。
1、Pa*U+Pb*(U- A)比Pb*U+Pa*(U-b) 化简一下可得:Pa*U+Pb*U-Pb*A 比 Pb*U+Pa*U-Pa*B => 可得:-Pb*A : -Pa*B , -Pb*A=-153.5,-Pa*B=-91.65, -Pb*A<-Pa*B 故A排序在B前。
2、Pa*U+Pc*(U- A)比Pc*U+Pa*(U-C) 化简一下可得:Pa*U+Pc*U-Pc*A 比 Pc*U+Pa*U-Pa*C => 可得:-Pc*A : -Pa*C , -Pc*A=-46.05,-Pa*C=-25.95, -Pc*A<-Pa*C 故A排序在C前。
3、Pb*U+Pc*(U- B)比Pc*U+Pb*(U-C) 化简一下可得:Pb*U+Pc*U-Pc*B 比 Pc*U+Pb*U-Pb*C => 可得:-Pc*B : -Pb*C , -Pc*B=-91.65,-Pb*C=-86.5, -Pc*B<-Pb*C 故B排序在C前。
综上,A小于B、C,B小于C,可得排序 1,A、2,B、3,C
矩阵:
A | B | C | |
Pa | - | -91.65 | -25.95 |
Pb | -153.5 | - | -86.5 |
Pc | -46.05 | -91.65 | - |
从矩阵来看,需要对比的是斜对角的数的大小。
python代码:
首先构建数据:
import pandas as pd
import numpy as np
data=[[307,0.15],[611,0.5],[173,0.15]]
df_value = pd.DataFrame(data,columns=['hit_rule_cnt','pricing'],index=['A','B','C'])
其次生成矩阵:
data = pd.DataFrame(np.random.rand(df_value.shape[0],df_value.shape[0]))
for i in range(df_value.shape[0]):
for a in range(df_value.shape[0]):
data.iloc[i,a] = -1*df_value['pricing'][i]*df_value['hit_rule_cnt'][a]
data.index=df_value['pricing'].index
data.columns= list(df_value.index)
data.index = ['P'+x for x in list(data.index)]
最后进行计算:
data2 = data.copy(deep=True)
for i in range(data2.shape[0]):
for a in range(data2.shape[0]):
if data.iloc[a,i] > data.iloc[i,a]:
data2.iloc[a,i]=1
else:
data2.iloc[a,i]=0
输出计算结果:
data2.sum().sort_values()
以上,如有错误请大家指出,请多多指点。谢谢。