---
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')算法对数据进行了聚类。接下来可以在每个簇中寻找彼此相似的客户。
该步骤使用节点相似度([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常用命令
- 反欺诈应用中常见的算法
希望这次实战系列的分享对你有帮助,欢迎在评论区留言讨论!