基于自动机器学习的电信网络诈骗反制实践
2inc

实习期间涉及的其中一个项目,在这次项目中学习了自动机器学习,在此记录一下。

引言

在数字化时代,电信网络已成为人们日常生活和工作的重要组成部分。然而,随着技术的发展和应用范围的扩大,电信网络诈骗案件也呈现出愈加猖獗的趋势。这些诈骗行为不仅给受害者带来经济损失,同时也对社会稳定和人们的心理安全造成了严重影响。当前,反制电信网络诈骗的手段主要依靠传统的监管政策、法律法规以及人工审核。然而,这些方法往往耗时耗力,随着信息时代的快速到来,这些传统方法往往难以应对诈骗手段的快速迭代和大规模蔓延。

面对此类挑战,机器学习技术的引入为我们提供了新的解决方案。机器学习是人工智能领域的一个重要分支,它能够让机器像人脑一样有能力学习和识别模式,并在没有明确编程的情况下作出决策。通过分析大量电信诈骗案例的数据样本,机器学习模型能够学习得到潜在的诈骗电话特征,并实时预测和拦截可疑通话,从而在源头上减少电信诈骗案件的发生。

在机器学习的传统实践中,整个流程涉及多个环节,包括数据预处理、特征工程、模型选择及优化等关键步骤。针对像电信诈骗案件的实际应用场景,数据往往是非结构化的,包含大量噪声,且特征间的关系复杂,这使得从原始数据中提取有效的信息成为一项艰巨的任务。数据工程师和算法专家需要投入大量的时间和精力,通过专业的技术手段来处理和转化数据这一过程不仅耗时耗力,而且对专业知识的依赖性极强,给机器学习的实际应用带来了不小的挑战。

事实上,随着人工智能技术的不断发展,现在已经有成熟的技术可以解决机器学习技术门槛高的问题:自动化机器学习(AutoML) 。它通过自动化的方式完成模型的选择、特征处理、参数调优等工作,极大地减少了人为干预的需求以及对专业知识的依赖。这不仅降低了整个模型开发过程的技术门槛,还使得非技术背景的从业者也能参与到模型的开发和训练中来。AutoML 的出现使得更多的资源和精力可以集中于解决实际问题,而不是被繁琐的技术细节所困。因此,在电信网络诈骗反制领域,AutoML 的应用无疑会为我们提供更强有力的技术支持。

接下来,本文将从电信网络诈骗的背景出发,简要介绍机器学习及自动化机器学习的相关知识,并通过一个具体的实验流程,展示如何利用 AutoML 技术构建一个使用的的诈骗电话识别模型。通过本文的介绍,读者将能够深入理解机器学习在电信网络诈骗反制实践中的应用价值和潜力。

预备知识

机器学习

什么是机器学习

无关轻重的文字,不做赘述,下同

典型算法简介

自动化机器学习(AutoML)

背景介绍

如前文所述,传统机器学习模型大致可分为以下四个部分:数据采集、数据预处理、优化、应用;其中数据预处理与模型优化部分往往需要具备专业知识的数据科学家来完成,他们建立起了数据到计算的桥梁。然而,即使是数据科学家,也需要花费大量的精力来进行算法与模型的选择。

机器学习在各种应用中的成功,导致对机器学习从业人员的需求不断增长,因此我们希望实现真正意义上的机器学习,让尽可能多的工作也能够被自动化完成,进一步降低机器学习的门槛,让没有该领域专业知识的人也可以使用机器学习来完成相关的工作。

AutoML 旨在使机器学习模型的构建过程更加自动化,从而使数据科学家和工程师能够更有效地工作,甚至使非专家也能利用机器学习技术。它从传统机器学习模型出发,从特征工程、模型构建、超参优化三方面实现自动化;并且也提出了 end-to-end 的解决方案。

与传统机器学习方法相比,AutoML 的优势在于其操作的简便性和整个过程的自动化。用户不需要深入理解每个算法的细节,就可以完成从数据清理到最终模型部署的整个流程。这大大简化了机器学习的应用,使其不仅限于数据科学家或算法工程师,任何对数据有需求的个人或企业都能够利用这项强大的技术。通过 AutoML,机器学习的门槛被大幅降低,其应用范围和潜力也随之大大拓展。

常见框架

关于 AutoML 的实现,学术界和工业界都已提出各种各样的框架,包括开源及闭源框架。下面本文调研了几个常用的开源框架,并将特点总结如下

Auto_ml:
Auto_ml 强调广泛的适用性和易用性,支持多种传统机器学习模型,如随机森林和梯度提升机。它提供自动特征工程、模型选择和超参数优化,旨在简化机器学习的整个工作流程。特别适合中小型数据集,并且集成了数据预处理和模型解释性工具,帮助用户更好地理解模型的行为。

FLAML (Fast and Lightweight AutoML):
FLAML 是一款由微软开源的轻量级 Python 库,可以帮助用户快速、高效地找出最佳机器学习模型,支持分类和回归问题。采用成本敏感的优化方法,能够在资源有限的环境下快速提供优化的参数调整。FLAML 是一个用户友好且易于集成的 AutoML 解决方案,特别适合那些需要快速有效地进行机器学习建模的场景。

MLJAR:
MLJAR 提供自动化的特征工程、模型选择和超参数调优,使得模型开发过程更加高效。MLJAR 提供 Web 界面和 Python API,使得用户无论是通过图形界面还是编程方式都能轻松使用。它还支持模型的可视化和解释,帮助用户更好地理解和展示他们的结果。

Microsoft 的 Azure AutoML:
Azure AutoML 是 Microsoft 提供的一站式机器学习服务,旨在简化机器学习模型的构建、训练和部署。它提供了丰富的数据处理能力,自动特征选择以及广泛的模型选择和调优选项。Azure AutoML 紧密集成在 Azure 云平台上,提供高效的计算资源和易于使用的 Web 界面,使得从数据到部署的整个机器学习流程变得简单快捷。对于企业用户来说,Azure AutoML 还提供了强大的安全性和可扩展性,使得企业可以安心地在云端进行机器学习工作。

Auto-Keras:
Auto-Keras 是专门为深度学习设计的 AutoML 系统,提供神经网络架构的自动搜索功能。它使用贝叶斯优化技术进行参数调优,旨在无需深入了解网络架构的情况下,提供高性能的深度学习模型。用户友好的 API 使得即使是初学者也能轻松入门,支持的数据类型包括图像、文本和表格数据。

这些 AutoML 框架各具特色,它们为不同的应用场景和需求提供了多种选择。无论是对于初学者,还是对于希望快速构建和部署机器学习模型的专业人士,这些框架都提供了强大的工具和功能。通过这些框架,用户可以更加便捷地利用机器学习技术,无需深入了解算法细节,就能够构建高效、准确的模型。

实验内容

了解了上面的准备知识后,接下来将展示如何依靠FLAML (Fast and Lightweight AutoML)全自动模式实现一个轻量级的电信诈骗号码的分类 (Classification) 问题。

(1) 加载数据和预处理

这里的数据来自通话记录明细的本地文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
from sklearn.model_selection import train_test_split

# 读取 Excel 文件,生成DataFrame,这里的Excel文件已经过添加标签处理
df1 = pd.read_excel('白名单用户通话明细.xlsx')
df2 = pd.read_excel('黑名单用户通话明细0112.xlsx')
df3 = pd.read_excel('黑名单用户通话明细0113.xlsx')

# 合并DataFrame
df_combined = pd.concat([df1, df2, df3])
# 确保索引有序,重置合并后DataFrame的索引
df_combined = df_combined.reset_index(drop=True)
# 显示合并后的DataFrame的前几行以确认
print(df_combined.head())

image

1
2
3
4
5
6
7
8
# 首先,分离特征和目标变量
X = df_combined.drop('value', axis=1) # 特征
y = df_combined['value'] # 目标变量

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

X_train

从运行结果可以看到训练集测试集及标签的维度信息。

image

(2) 运行 FLAML 全自动模式

下面我们直接运行 FLAML automl 全自动模式。

实际在运行配置中,我们只需要可以指定 任务类型、时间预算、误差度量、学习者列表、是否下采样、重采样策略类型等。 如果不作任何设定的话,所有这些参数都会使用默认值(例如,默认分类器是 lgbm, xgboost, xgb_limitdepth, catboost, rf, extra_tree, lrl1)。

1
2
# 导入工具库并初始化AutoML对象 
from flaml import AutoML automl = AutoML()
1
2
3
4
5
6
7
8
# 参数设定
settings = {
"time_budget": 600, # 指总共的运行时间
"metric": 'accuracy', # 指衡量性能的标准,详见文档
"task": 'classification', # 任务类型
"log_file_name": 'telefraud_experiment.log', # 训练过程中日志文件命名
"seed": 7654321, # 随机种子
}
1
2
# 运行自动化机器学习 
automl.fit(X_train=X_train, y_train=y_train, **settings)

image

从上述运行结果可以看出,自动机器学习过程,对 lgbm, xgboost, xgb_limitdepth, catboost, rf, extra_tree, lrl1 这些候选模型进行了实验,并运行出了对应的结果。

(3) 最优模型与评估结果

1
2
3
4
print('Best ML leaner:', automl.best_estimator) 
print('Best hyperparmeter config:', automl.best_config)
print('Best accuracy on validation data: {0:.4g}'.format(1-automl.best_loss))
print('Training duration of best run: {0:.4g} s'.format(automl.best_config_train_time))

运行结果如下

1
2
3
4
Best ML leaner: lgbm
Best hyperparmeter config: {'n_estimators': 30, 'num_leaves': 153, 'min_child_samples': 13, 'learning_rate': 0.5373247775471219, 'log_max_bin': 7, 'colsample_bytree': 0.8846477664073648, 'reg_alpha': 0.001264139323090345, 'reg_lambda': 16.718685131056866}
Best accuracy on validation data: 0.9998
Training duration of best run: 0.4925 s

可以通过运行完毕的 automl 对象属性,取出对应的「最优模型」、「最佳模型配置」、「评估准则结果」等信息。

更进一步,我们可以通过下面的代码,导出最优模型,并用它对测试集进行预测。

1
2
# 最佳模型导出
automl.model.estimator

运行结果如下

1
2
3
4
5
6

LGBMClassifier(colsample_bytree=0.8846477664073648,
learning_rate=0.5373247775471219, max_bin=127,
min_child_samples=13, n_estimators=1, n_jobs=-1, num_leaves=153,
reg_alpha=0.001264139323090345, reg_lambda=16.718685131056866,
verbose=-1)

(4) 模型存储与加载

1
2
3
4
5
6
7
# 模型存储与持久化
import pickle
with open('automl.pkl', 'wb') as f:
pickle.dump(automl, f, pickle.HIGHEST_PROTOCOL)
# 模型加载
with open('automl.pkl', 'rb') as f:
automl = pickle.load(f)
1
2
3
4
5
6
# 对测试集进行预估
y_pred = automl.predict(X_test)
print('Predicted labels', y_pred)
print('True labels', y_test)

y_pred_proba = automl.predict_proba(X_test)[:,1]

运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Predicted labels [1. 1. 1. ... 1. 1. 1.]
True labels 1263 1.0
3951 1.0
6199 1.0
6080 1.0
96 0.0
...
3954 1.0
1840 1.0
4850 1.0
5208 1.0
2582 1.0
Name: value, Length: 1303, dtype: float64

可以看到,automl 得到的最佳模型,对测试集预估的方式,和自己建模得到的模型是一样的。

1
2
3
4
5
# 测试集效果评估 
from flaml.ml import sklearn_metric_loss_score
print('accuracy', '=', 1 - sklearn_metric_loss_score('accuracy', y_pred, y_test))
print('roc_auc', '=', 1 - sklearn_metric_loss_score('roc_auc', y_pred_proba, y_test))
print('log_loss', '=', sklearn_metric_loss_score('log_loss', y_pred_proba, y_test))

评估结果如下:

1
2
3
accuracy = 0.9720332824110467 
roc_auc = 0.7253276908529442
log_loss = 0.1034449031876942

从评估结果中可以看出,该模型可以较好的完成号码识别的任务。

总结与展望

同样是一些无关轻重的文字*

 评论
评论插件加载失败
正在加载评论插件