--- template: overrides/blogs.html tags: - knowledge graph --- # Neo4J图数据库反欺诈分析实战(四) - 风险评分 !!! info 作者:[Vincent](https://github.com/Realvincentyuan),发布于2021-06-06,阅读时间:约6分钟,微信公众号文章链接:[:fontawesome-solid-link:](https://mp.weixin.qq.com/s?__biz=MzI4Mjk3NzgxOQ==&mid=2247485268&idx=1&sn=2f32b4911dd64a5696f2ef287b9542a0&chksm=eb90f420dce77d36489cd350674af9c4523c05d884afae5a158c619faaabfca5e161b9443131&token=200682583&lang=zh_CN#rd) ## 1 前言 Neo4J图数据库反欺诈系列文章到此将识别出危险用户,本期内容将讲解对每个客户进行风险评分。如需要复习前文,可以直接跳转链接: - [初识图数据库](https://mp.weixin.qq.com/s?__biz=MzI4Mjk3NzgxOQ==&mid=2247485112&idx=1&sn=efd4f9b472a3d58378407bb6fad46a2f&chksm=eb90f5ccdce77cda0285d53331834a787364d4458a3588173c9fe8ef6953499362bd64f7c918&token=1650861834&lang=zh_CN#rd) - [Neo4J图数据库反欺诈分析实战(一) - 搭建分析环境](https://mp.weixin.qq.com/s?__biz=MzI4Mjk3NzgxOQ==&mid=2247485213&idx=1&sn=ed9051c887847bcf35ef6e21af6005f4&chksm=eb90f469dce77d7fa1325810d537e183c65eef7067f20219eee02d6f3667d14554832103986d&token=771475859&lang=zh_CN#rd) - [Neo4J图数据库反欺诈分析实战(二) - 准备数据](https://mp.weixin.qq.com/s?__biz=MzI4Mjk3NzgxOQ==&mid=2247485256&idx=1&sn=0d87a1d090f7282f85f3d2395372c8ed&chksm=eb90f43cdce77d2af75e6313e945a83f2309743e7e7e0855c99d9ecece6f3d24f3ad06ae80a4&token=771475859&lang=zh_CN#rd) - [Neo4J图数据库反欺诈分析实战(三) - 识别犯罪团伙](ttps://mp.weixin.qq.com/s?__biz=MzI4Mjk3NzgxOQ==&mid=2247485261&idx=1&sn=9bbe4e099d7e199d749540797e82e443&chksm=eb90f439dce77d2fb5a8f06707844f0eef22667821f97d9e509563a36cebb2ed1903994056dd&token=1481538225&lang=zh_CN#rd) ## 2 寻找相似节点 上回通过[弱连接分量(Weakly Connected Components)](https://neo4j.com/docs/graph-data-science/current/algorithms/wcc/ 'Weakly Connected Components')算法对数据进行了聚类。接下来可以在每个簇中寻找彼此相似的客户。
WCC聚类结果
该步骤使用节点相似度([Jaccard值](https://neo4j.com/docs/graph-data-science/current/algorithms/node-similarity/#algorithms-node-similarity '节点相似度'))进行判断,节点相似度算法需要图结构中有两种节点,因此创建`Similarity`图,里面包含客户和实体信息两种节点,以及对应的关系。 ```sql 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; ``` 创建图之后就可以运行节点相似度算法(注意:该算法支持加权,详见文档): ```sql 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衡量相似性: ```SQL CALL gds.nodeSimilarity.mutate('Similarity',{topK:15, mutateProperty:'jaccardScore', mutateRelationshipType:'SIMILAR_TO'}); -- 将结果从内存中的图写入数据库 CALL gds.graph.writeRelationship('Similarity','SIMILAR_TO','jaccardScore'); ``` ## 3 创建风险评分 接下来使用[节点中心度算法](https://neo4j.com/docs/graph-data-science/current/algorithms/degree-centrality/ 'Degree Centrality')结合上述生成的相似度指标生成一个`firstPartyFraudScore`,`firstPartyFraudScore`分越高,代表其在一个簇里和越多的客户有更多相似的实体信息,即越危险。 ```SQL CALL gds.degree.write('Similarity',{nodeLabels:['Client'], relationshipTypes:['SIMILAR_TO'], relationshipWeightProperty:'jaccardScore', writeProperty:'firstPartyFraudScore'}); ```
风险评分
最后选用80分位数为阈值标记危险的客户,在实际应用中,也可以直接使用`firstPartyFraudScore`作为一个单独的特征融合进反欺诈策略或者模型。 ```sql 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常用命令 - 反欺诈应用中常见的算法 希望这次实战系列的分享对你有帮助,欢迎在评论区留言讨论!