图机器学习(20)——欺诈交易检测算法
0. 前言
随着电子商务平台的兴起,在线支付系统的普及,欺诈案件也在增加。例如,使用被盗信用卡进行的交易就是一种典型的欺诈行为——这类交易模式必然与信用卡原持有人的正常消费存在显著差异。然而,构建自动检测欺诈交易的程序可能是一个复杂的问题,因为涉及的变量数量庞大。
我们已经学习了如何将信用卡交易数据转化为图结构,在本节中,我们将运用机器学习算法实现欺诈交易的自动识别。逐步处理数据集,最终构建一套完整的欺诈检测算法。
1. 欺诈检测
在本节中,我们将阐述如何利用二分图与三分图,通过图机器学习算法构建基于监督式与非监督式方法的欺诈自动检测流程。交易行为在图中以边表示,因此我们的核心任务是对每条边进行正确分类:欺诈性交易或真实交易。执行分类任务的流程如下:
- 针对数据不平衡任务的采样方案
- 采用无监督嵌入算法为每条边生成特征向量
- 在已定义的特征空间上应用监督式与无监督式机器学习算法
2. 基于监督学习的欺诈交易识别
由于数据集存在严重不平衡问题(欺诈交易仅占全部交易的 2.83%
),我们需要采用技术手段处理数据失衡。本节将使用简单的随机欠采样策略:从多数类(真实交易)中抽取与少数类(欺诈交易)数量匹配的子样本,此外,我们也可以使用孤立森林等离群点检测算法将欺诈交易识别为数据异常点。
(1) 实现随机欠采样:
from sklearn.utils import resample
df_majority = df[df.is_fraud==0]
df_minority = df[df.is_fraud==1]
df_maj_dowsampled = resample(df_majority,
n_samples=len(df_minority),
random_state=42)
df_downsampled = pd.concat([df_minority, df_maj_dowsampled])
print(df_downsampled.is_fraud.value_counts())
G_down = build_graph_bipartite(df_downsampled)
(2) 应用 sklearn
包的 resample
函数过滤原始数据框的负采样函数。然后,函数构建一个创建三部图,使用 build_graph_tripartite
函数集:
from sklearn.model_selection import train_test_split
train_edges, test_edges, train_labels, test_labels = train_test_split(list(range(len(G_down.edges))),
list(nx.get_edge_attributes(G_down, "label").values()),
test_size=0.20)
(3) 使用 Node2Vec
算法构建特征空间:
from node2vec import Node2Vec
from node2vec.edges import HadamardEmbedder, AverageEmbedder, WeightedL1Embedder, WeightedL2Embedder
node2vec_train = Node2Vec(train_graph, weight_key='weight')
model_train = node2vec_train.fit(window=10)
Node2Vec
的结果用于构建边嵌入,生成用于分类器的最终特征空间。
(4) 对于每个 Edge2Vec
算法,使用先前计算的 Node2Vec
算法来生成特征空间;然后,使用 sklearn
库中的 RandomForestClassifier
对生成的特征集进行训练;最后,在验证测试上计算不同的性能指标,即精准度、召回率和F1分数:
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
classes = [HadamardEmbedder, AverageEmbedder, WeightedL1Embedder, WeightedL2Embedder]
for cl in classes:
embeddings_train = cl(keyed_vectors=model_train.wv)
train_embeddings = [embeddings_train[str(edgs[x][0]), str(edgs[x][1])] for x in train_edges]
test_embeddings = [embeddings_train[str(edgs[x][0]), str(edgs[x][1])] for x in test_edges]
rf = RandomForestClassifier(n_estimators=1000, random_state=42)
rf.fit(train_embeddings, train_labels);
y_pred = rf.predict(test_embeddings)
print(cl)
print('Precision:', metrics.precision_score(test_labels, y_pred))
print('Recall:', metrics.recall_score(test_labels, y_pred))
print('F1-Score:', metrics.f1_score(test_labels, y_pred))
二分图上的模型性能表现如下:
嵌入算法 | 准确率 | 召回率 | F1 值 |
---|---|---|---|
HADAMARD | 0.73 | 0.76 | 0.75 |
AVERAGE | 0.71 | 0.79 | 0.75 |
WEIGHTED L1 | 0.64 | 0.78 | 0.70 |
WEIGHTED L2 | 0.63 | 0.78 | 0.70 |
三分图上的模型性能表现如下:
嵌入算法 | 准确率 | 召回率 | F1 值 |
---|---|---|---|
HADAMARD | 0.89 | 0.29 | 0.44 |
AVERAGE | 0.74 | 0.45 | 0.48 |
WEIGHTED L1 | 0.66 | 0.46 | 0.55 |
WEIGHTED L2 | 0.66 | 0.47 | 0.55 |
从结果可以看出,这两种方法在 F1 值、精确率和召回率指标上表现出显著差异。具体而言,三分图在精确率上优于二分图,二分图在召回率指标上表现更佳。因此,我们可以得出结论,在此特定场景下,使用二分图可能是更优选择,因为与三分图相比,二分图在节点和边数量更少的情况下仍能实现较高的 F1 值表现。
3. 基于无监督学习的欺诈交易识别
同样的方法也可应用于基于 k-means
的无监督任务,主要区别在于生成的特征空间无需进行训练-验证集划分。接下来,我们将在经过下采样处理生成的完整图上执行 Node2Vec
算法:
nod2vec_unsup = Node2Vec(G_down, weight_key='weight')
unsup_vals = nod2vec_unsup.fit(window=10)
如监督分析中所定义的,在构建节点特征向量时,我们可以采用不同的 Edge2Vec
算法来运行 k-means
聚类。
首先,针对每种 Edge2Vec
算法,使用先前在训练集和验证集上计算的 Node2Vec
结果来生成特征空间;然后,调用 sklearn
库中的 KMeans
聚类算法,对生成的特征集进行拟合;最后,计算多种性能指标,包括调整互信息 (adjusted mutual information
, AMI
)、同质性、完整性以及 v-measure
得分:
from sklearn.cluster import KMeans
classes = [HadamardEmbedder, AverageEmbedder, WeightedL1Embedder, WeightedL2Embedder]
true_labels = [x for x in nx.get_edge_attributes(G_down, "label").values()]
for cl in classes:
embedding_edge = cl(keyed_vectors=unsup_vals.wv)
embedding = [embedding_edge[str(x[0]), str(x[1])] for x in G_down.edges()]
kmeans = KMeans(2, random_state=42).fit(embedding)
ami = metrics.adjusted_mutual_info_score(true_labels, kmeans.labels_)
ho = metrics.homogeneity_score(true_labels, kmeans.labels_)
co = metrics.completeness_score(true_labels, kmeans.labels_)
vmeasure = metrics.v_measure_score(true_labels, kmeans.labels_)
print(cl)
print('AMI:', ami)
print('Homogeneity:', ho)
print('Completeness:', co)
print('V-Measure:', vmeasure)
该方法可同时适用于二分图和三分图,通过无监督算法解决欺诈检测任务。下表展示了二分图的性能表现:
嵌入算法 | AMI | 同质性 | 完整性 | v-measure 得分 |
---|---|---|---|---|
HADAMARD | 0.34 | 0.33 | 0.36 | 0.34 |
AVERAGE | 0.07 | 0.07 | 0.07 | 0.07 |
WEIGHTED L1 | 0.06 | 0.06 | 0.06 | 0.06 |
WEIGHTED L2 | 0.05 | 0.05 | 0.05 | 0.05 |
下表展示了三分图的性能表现:
嵌入算法 | AMI | 同质性 | 完整性 | v-measure 得分 |
---|---|---|---|---|
HADAMARD | 0.44 | 0.44 | 0.45 | 0.44 |
AVERAGE | 0.06 | 0.06 | 0.06 | 0.06 |
WEIGHTED L1 | 0.001 | 0.001 | 0.00 | 0.06 |
WEIGHTED L2 | 0.0004 | 0.0004 | 0.0004 | 0.0004 |
在以上两表中,我们展示了应用无监督算法时二分图与三分图的分类性能表现。从结果可见,这两种方法存在显著差异。值得注意的是,在此场景下,使用 Hadamard 嵌入算法的性能明显优于其他方法。
此任务中,三分图的性能同样超越了二分图。在无监督学习环境下,引入交易节点能够有效提升整体性能。基于该特定用例及表中数据,我们可以断言:在无监督设置中,采用三分图是更优选择,因其相较二分图能够实现更卓越的性能表现。
小结
在本节中,我们描述了如何将经典的欺诈检测任务转化为图问题,并且使用图机器学习技术来解决此问题。我们分别采用监督学习与无监督学习算法解决欺诈检测问题,并对比了二分图与三分图的性能表现。针对原始数据集中合法交易占主导的不平衡问题,我们首先进行简单下采样处理。在监督任务中,我们结合随机森林算法应用多种 Edge2Vec
算法;在无监督任务中则采用 k-means
算法,均获得了良好的分类性能。