Neo4J图数据库反欺诈分析实战(四) - 风险评分¶
Info
作者:Vincent,发布于2022-04-09,阅读时间:约2分钟,微信公众号文章链接:
1 前言¶
Neo4J图数据库反欺诈系列文章到此将识别出危险用户,本期内容将讲解对每个客户进行风险评分。如需要复习前文,可以直接跳转链接:
2 寻找相似节点¶
上回通过弱连接分量(Weakly Connected Components)算法对数据进行了聚类。接下来可以在每个簇中寻找彼此相似的客户。
该步骤使用节点相似度(Jaccard值)进行判断,节点相似度算法需要图结构中有两种节点,因此创建Similarity
图,里面包含客户和实体信息两种节点,以及对应的关系。
CALL gds.graph.project.cypher('Similarity',
'MATCH(c:Client)
WHERE exists(c.firstPartyFraudGroup)
RETURN id(c) AS id,labels(c) AS labels
UNION
MATCH(n)
WHERE n:Email OR n:Phone OR n:SSN
RETURN id(n) AS id,labels(n) AS labels',
'MATCH(c:Client)
-[:HAS_EMAIL|:HAS_PHONE|:HAS_SSN]->(ids)
WHERE exists(c.firstPartyFraudGroup)
RETURN id(c) AS source,id(ids) AS target')
YIELD graphName,nodeCount,relationshipCount;
创建图之后就可以运行节点相似度算法(注意:该算法支持加权,详见文档):
CALL gds.nodeSimilarity.stream('Similarity',{topK:15})
YIELD node1,node2,similarity
RETURN gds.util.asNode(node1).id AS client1,
gds.util.asNode(node2).id AS client2,similarity
ORDER BY similarity;
使用Mutate
模式将结果写入内存中的图中,创建了一个新的关系SIMILAR_TO
。至此,相似的节点对之间将可以用jaccardScore衡量相似性:
CALL gds.nodeSimilarity.mutate('Similarity',{topK:15,
mutateProperty:'jaccardScore', mutateRelationshipType:'SIMILAR_TO'});
-- 将结果从内存中的图写入数据库
CALL gds.graph.writeRelationship('Similarity','SIMILAR_TO','jaccardScore');
3 创建风险评分¶
接下来使用节点中心度算法结合上述生成的相似度指标生成一个firstPartyFraudScore
,firstPartyFraudScore
分越高,代表其在一个簇里和越多的客户有更多相似的实体信息,即越危险。
CALL gds.degree.write('Similarity',{nodeLabels:['Client'],
relationshipTypes:['SIMILAR_TO'],
relationshipWeightProperty:'jaccardScore',
writeProperty:'firstPartyFraudScore'});
最后选用80分位数为阈值标记危险的客户,在实际应用中,也可以直接使用firstPartyFraudScore
作为一个单独的特征融合进反欺诈策略或者模型。
MATCH(c:Client)
WHERE exists(c.firstPartyFraudScore)
WITH percentileCont(c.firstPartyFraudScore, 0.8)
AS firstPartyFraudThreshold
MATCH(c:Client)
WHERE c.firstPartyFraudScore>firstPartyFraudThreshold
SET c:FirstPartyFraudster;
4 总结¶
至此,识别关系网络中的欺诈罪犯实战系列就告一段落了,通过这一系列的文章,认识和巩固了如下知识点:
- 图的基本结构
- Neo4J图数据库查询语句Cypher常用命令
- 反欺诈应用中常见的算法
希望这次实战系列的分享对你有帮助,欢迎在评论区留言讨论!
Viewed times