社交网络分析与金融反欺诈
设备指纹
一般是基于某些设备信息,通过一些设备指纹算法将这些信息组合,通过特定hsah算法得到一个ID值,作为该设备唯一标识符
常见元素有:
- sim卡信息
- wifi信息
- 硬盘信息
- 内存信息
- 屏幕信息
- 设备的传感器特征,比如麦克风、加速传感器、摄像头等信息
- 浏览器本身的特征,包括UA,版本,操作系统信息等
- 浏览器中插件的配置,主要是插件的类型与版本号等
- 设备操作系统的特征,比如是否越狱等
- 浏览器的Canvas特征,影响该特征的因素有GPU特性造成的渲染差异,屏幕的分辨率以及系统不同字体的设置等
知识图谱
知识图谱(Knowledge Graph/Vault)又称为科学知识图谱,2012年由谷歌提出,如今已经成为人工智能领域的热门问题之一,吸引了来自学术界和工业界的广泛关注,在一系列实际应用中取得了较好的落地效果,产生了巨大的社会与经济效益,其中包括金融领域。
知识图谱基于二元关系的知识库,构成网状结构。基于图的数据结构,以图的方式存储知识并向用户返回经过加工和推理的知识。它由“节点”和“边”组成,节点表示现实世界中存在的“实体”,边表示实体与实体之间的“关系”,其基本组成单位是“实体-关系-实体”的三元组,实体之间通过关系相互联结。
主要应用场景:
- 反欺诈
- 风险预测
- 催收
- 精准营销
- 智能搜索
构建知识图谱的流程,此处我们采用个人信息(也可以是设备指纹,总之有可能是虚假的数据)进行一个场景构建。
1)通过对数据进行清理,抽取,构建知识图谱的节点,比如工作地址,姓名,身份证,GPS,工作地点,单位,IP,联系人手机号,等等。
2)比较好的方式是建立基础信息表,然后不断更新,这种方式比较好的原因是可以防止异常,可以保证数据最终一致性。这个就会根据不同情况,构建不同基础数据表,少则十几个,二十几个,多的可以成百上千。
3)基于清洗后的信息,进入图数据库,构建出整个知识图谱。
4)基于图算法进行相关的特征抽取或者通过网络结构进行负样本挖掘
import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt
edge_list=pd.read_csv('./data/stack_network_links.csv')
edge_list.head()
G=nx.from_pandas_edgelist(edge_list,edge_attr='value' )
plt.figure(figsize=(30,15))
nx.draw(G,with_labels=True,
edge_color='blue',
node_color='grey',
node_size=10,
pos=nx.spring_layout(G,k=0.1,iterations=40))
染色
染色本质就是一种基于关联图谱的半监督学习方法,我们知道在反欺诈的场景下,一个典型的困境就是欺诈标注非常少,获得的代价非常高,而我们要做一些监督式的机器学习,却又非常依赖于标注。因此如果能用少量的欺诈标注样本产生出更多的标注,就能最大程度利用欺诈样本。这就是染色的初衷,欺诈标注会沿着网络里的边从一个节点传播到另一个节点。
染色从直觉上比较容易理解,我们经常说近朱者赤,近墨者黑。一个用户和坏用户有关联,其实很有可能他本身就是有问题的。这里放一个数据,根据分析得到,一个客户一旦出现在某个坏客户的通讯录中,就有70%的概率会变坏。
#基于sklearn标签传播算法示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.semi_supervised import label_propagation
from sklearn.datasets import make_circles
# generate ring with inner box
n_samples = 200
X, y = make_circles(n_samples=n_samples, shuffle=False)
outer, inner = 0, 1
labels = np.full(n_samples, -1.)
labels[0] = outer
labels[-1] = inner
# Learn with LabelSpreading
label_spread = label_propagation.LabelSpreading(kernel='rbf', alpha=0.8)
label_spread.fit(X, labels)
# Plot output labels
output_labels = label_spread.transduction_
plt.figure(figsize=(8.5, 4))
plt.subplot(1, 2, 1)
plt.scatter(X[labels == outer, 0], X[labels == outer, 1], color='navy',
marker='s', lw=0, label="outer labeled", s=10)
plt.scatter(X[labels == inner, 0], X[labels == inner, 1], color='c',
marker='s', lw=0, label='inner labeled', s=10)
plt.scatter(X[labels == -1, 0], X[labels == -1, 1], color='darkorange',
marker='.', label='unlabeled')
plt.legend(scatterpoints=1, shadow=False, loc='upper right')
plt.title("Raw data (2 classes=outer and inner)")
plt.subplot(1, 2, 2)
output_label_array = np.asarray(output_labels)
outer_numbers = np.where(output_label_array == outer)[0]
inner_numbers = np.where(output_label_array == inner)[0]
plt.scatter(X[outer_numbers, 0], X[outer_numbers, 1], color='navy',
marker='s', lw=0, s=10, label="outer learned")
plt.scatter(X[inner_numbers, 0], X[inner_numbers, 1], color='c',
marker='s', lw=0, s=10, label="inner learned")
plt.legend(scatterpoints=1, shadow=False, loc='upper right')
plt.title("Labels learned with Label Spreading (KNN)")
plt.subplots_adjust(left=0.07, bottom=0.07, right=0.93, top=0.92)
plt.show()