【风控策略开发】反欺诈Louvain算法的Python代码

Louvain算法

Louvain算法是一种基于无向图(在社交网络中,将边没有方向的图称为无向图,边有方向的图称为有向图)的“社区”发现算法,其基本思想是先将每一个节点作为一个独立的社区,再分别计算各个节点加入其他社区后的模块度(Modularity)增量,从中选出模块度最高的一个邻居节点,合并为一个社区,待所有节点所属的社区不再变化后,将合并后的社区看成一个新的节点,重复上述过程,直到模块度不再增大。Louvain算法最终生成的社区是非重叠社区,即同一节点最终只会存在于一个社区,不会存在于多个社区。

在上面讲述Louvain算法的运算过程时,引入了社区和模块度的概念,那么,什么是社区和模块度呢?社区可以被看作由社交网络中的一组相互强关联的节点组成的集合,这个集合中连通的边很多,但是这个集合与社交网络中其他节点的连通性很弱,即这个集合与社交网络中其他节点之间的边非常稀疏。模块度常用来衡量一个社区的划分是否优良,模块度越高,说明所检测到的社区越符合“内紧外松”的特征,即社区内部节点相似度较高,社区内部节点与外部节点相似度较低。模块度的计算公式:

式中,∑in表示社区c内部的边的权重,∑tot表示与社区c内部的节点连接的边的权重,包括社区内部的边与社区外部的边,m是社交网络中的所有边的权重的总和。关于模块度计算公式的详细推导过程,有兴趣的读者可借助互联网自行研究。

Louvain算法具有以下3个优点。

1)该算法是无监督学习算法,拟合速度比较快,可以在较短时间内实现大规模社交网络的社区划分。

2)在算法运行时,无须指定划分社区的数量,当模块度不再增加的时候,迭代会自动停止。

3)基于算法运行过程中计算的模块度指标能够评估社区划分的好坏。

Louvain算法的缺点是在基于模块度指标自动进行社区划分时,只有等模块度结果不再变化时算法才会停止,这样容易导致过拟合,会将一些外围的节点加入紧凑的社区中,从而造成在局部视角下最优,但在全局视角下较差的情况。

案例实践:基于Louvain算法构建欺诈团伙识别模型

假如某金融机构要基于客户ID、设备“指纹”ID、电话号码三个节点以及三个节点对应的欺诈标签构建欺诈团伙识别模型,并用它来识别欺诈团伙,如何实现呢?具体实现步骤如下。

(1)社交网络结构梳理

在基于客户ID、设备“指纹”ID、电话号码构建社交网络前,需要先确定节点之间是如何进行连接的,即要确定节点的边,因为这决定了我们要如何构建网络以及构建的网络是否合理。

基于业务逻辑,我们可以认为节点之间存在以下关系:①客户持有设备,即客户ID和设备“指纹”ID之间存在一条边;②客户通过电话联系,这里的客户与电话号码的对应关系有多种情况,可以在客户与申请电话号码、联系人电话号码、工作单位电话号码、快递预留电话号码等之间建立对应关系,即客户ID和上述电话号码之间存在一条边;③设备绑定电话号码,即设备“指纹”ID和电话号码之间存在一条边。

在构建社交网络时,节点之间边的设计一定要符合业务逻辑,不能随意将不相干的节点强行关联在一起。选取的节点及确定的节点之间的关系决定了要构建的网络结构,若构建的网络不合理,则最终构建的模型效果也不会很好。

(2)数据整合

在确定了网络结构后,需要对所需数据进行整合。金融机构的风控数据往往是存储在如Hive等数据库中的结构化的数据,整合起来比较简单。在对数据整合过程中,需要对“脏”数据进行清洗,剔除无效的节点,确保各个节点是有效的。假设节点存储数据的表名为X_table(X_table往往对应了多张表,因为这些数据通常不会存在于一张表里),表中涉及的3个节点对应的字段名分别为cust_id(客户ID)、device_id(设备“指纹”ID)、phone_number(电话号码),获取数据的SQL代码如下。

在获取构建社交网络的数据时,为了便于区分各个节点,我们在客户节会很好。

(2)数据整合

在确定了网络结构后,需要对所需数据进行整合。金融机构的风控数据往往是存储在如Hive等数据库中的结构化的数据,整合起来比较简单。在对数据整合过程中,需要对“脏”数据进行清洗,剔除无效的节点,确保各个节点是有效的。假设节点存储数据的表名为X_table(X_table往往对应了多张表,因为这些数据通常不会存在于一张表里),表中涉及的3个节点对应的字段名分别为cust_id(客户ID)、device_id(设备“指纹”ID)、phone_number(电话号码),获取数据的SQL代码如下。

在获取构建社交网络的数据时,为了便于区分各个节点,我们在客户节点前拼接了字母C,在设备“指纹”节点前拼接了字母D,在电话号码节点前拼接了字母P,同时将数据转换为了基于Python构建社交网络所需的节点对节点的格式,即source、target的格式。在实操时,数据可能存在于多张不同的表里,需要通过union all的形式将数据取全,不要遗漏,另外,也可基于实际情况限制获取的数据的时间范围,如只取近一年的数据等,可自行灵活调整。在基于上述SQL语句取数后,假设我们将数据拉取到了线下,数据文件名称:network_data.csv。

另外,在建模时,我们想基于已有的欺诈节点(若欺诈样本不足,则可考虑用其他方法为样本打上好坏标签)预测其他非欺诈节点存在欺诈的概率,需要获取客户、设备“指纹”、电话节点对应的欺诈标签,这些数据的获取相对简单,直接从黑名单库对应的表中拉取即可。假设最终获取的数据有两个字段,分别为node(节点,存储的是客户、设备“指纹”、电话号码节点信息)和fraud_flag(表示节点是否为欺诈节点,1代表是,0代表否),将数据下载到线下,数据文件名:fraud_flag_data.csv。

(3)基于获取的数据构建全局社交网络

在数据获取完成后,接下来基于获取的所有节点数据构建全局社交网络,相关Python代码如下。

在上述代码中,构建的全局社交网络为G,在构建完成后,分别计算了社交网络中每个节点的度中心性、接近中心性和中介中心性。

(4)基于Louvain算法对全局社交网络进行社区划分

在构建完成全局社交网络后,基于Louvain算法对社交网络进行社区划分,将联系紧密的节点划分到同一个社区里,相应的Python代码如下。

在基于Louvain算法完成社区划分后,虽然将一个全局社交网络拆分成了一个个社区,但是这些社区可能有成千上万个,不可能每个社区都是由欺诈团伙构成的。现在我们面临一个新的难题,即如何从划分的社区中找出欺诈团伙。其实这不难,可以简单认为节点数适中且欺诈节点占比比较大的社区为欺诈团伙。

其实,在对全局社交网络完成社区划分后,对于欺诈节点占比较高的社区,我们有理由相信它为欺诈团伙的概率较高,但是,为了有更多的抓手来识别欺诈团伙,接下来会引入节点协同分类算法(CollectiveClassification)并用它来预测每个非欺诈节点(未知节点)的欺诈概率。

(5)预测每个非欺诈节点的欺诈概率

在已知全局社交网络中的一些欺诈节点后,我们想基于这些欺诈节点预测其他未知节点为欺诈节点的概率,进而通过预测结果来辅助推测哪些社区为欺诈社区的概率比较高,如何进行预测呢?可基于节点协同分类算法进行。

节点协同分类算法是一种基于社交网络的半监督分类方法,暗含“近朱者赤,近墨者黑”的思想,具体执行步骤:①初始化网络中所有节点的欺诈概率,已确认欺诈的节点的欺诈概率为1,未知节点的欺诈概率为0;②设定迭代次数(基于六度分离理论,迭代次数一般设置为6就可以了。六度分离理论是一个数学领域的猜想,也称“小世界”理论,该理论指出:你和任何一个陌生人之间间隔的人不会超过六个,也就是说,通过最多五个中间人,你就能够认识任何一个陌生人),并基于设定的迭代次数随机计算每个未知节点为欺诈节点的概率,未知节点的欺诈概率为与它相连节点的欺诈概率的均值;③待迭代终止后,每个未知节点对应的概率即为其欺诈概率。

基于节点协同分类算法预测未知节点的欺诈概率的Python代码如下。

在上述代码中,基于节点协同分类算法预测了每个未知节点为欺诈节点的概率,在实际生产中,节点协同分类算法用途非常广泛,可基于“近朱者赤,近墨者黑”的思路寻找与高风险客户联系紧密的风险客户。

(6)找出疑似欺诈团伙

因本节所选的数据主要用来演示如何识别欺诈团伙,故与真实数据会有一定的差异。在实际生产中,要结合业务逻辑灵活筛选疑似欺诈社区。

在社区划分完成后,在接下来的代码示例中,选取节点数大于4且社区中预测的欺诈节点占比大于0的社区为疑似欺诈的社区,即欺诈团伙。

上述代码执行完成后,会输出疑似欺诈团伙的关联关系图,其中一张图如图所示。

在图中,选出来的疑似欺诈社区的编号为85624,这个社区包含1个客户节点、3个设备“指纹”节点和1个电话号码节点。在实际生产中,筛选出的疑似欺诈团伙中往往包含多个客户节点,本节主要是为了展示如何找出欺诈团伙,最终展示结果仅供参考。

需要说明的是,在本节的代码部分,因社交网络中节点索引顺序具有一定的随机性,用本节提供的数据和代码执行完成后,每次执行结果筛选出来的疑似欺诈社区的编号很可能是不同的,但是社区中的节点很可能是相同的。

(7)模型效果验证

在构建完成欺诈团伙识别模型后,往往需要对模型结果进行验证,然后才能放心使用模型。

如何对模型结果进行验证呢?常用的方法有两种:①若可用建模样本充足且样本时间跨度较长,则可在建模时取早期的样本数据,待基于早期的样本数据筛选出疑似欺诈团伙后,查看团伙中的客户在未来的首逾情况,首逾率越高,说明筛选欺诈团伙的效果越好;②若可用建模样本不是很充足或样本时间跨度不够长,则可将筛选的疑似欺诈团伙推送给反欺诈调查团队进行调查,看看最终的团伙中未确认欺诈的节点的欺诈确认率,通常欺诈确认率在50%以上才能证明模型是有效的。在实际生产中,在条件允许的情况下,往往同时使用上述两种方法验证模型效果,只有在两种方法下模型均有效,才认为模型是真正有效的。

另外,因为欺诈手段变化非常快,所以欺诈团伙识别模型需要保持高频率的更新和验证,确保持续有效。

(8)模型在策略中的应用

在证明模型有效后,通常在模型定期更新后将筛选的欺诈团伙中的节点加入黑名单(为了提高准确性,也可只将团伙中基于节点协同分类算法预测的欺诈概率高的节点加入黑名单),在授信审批和用信审批场景基于黑名单策略对疑似欺诈团伙进行拦截,降低团伙欺诈带来的风险。

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值