免费 python基于PyOD库实现数据异常检测(下)

  • 主题发起人 主题发起人 Scare
  • 开始时间 开始时间

Scare

0xFF|主权幽灵
07
908
172
奇源币
0
管理成员
工作人员
版主
VIP
使用阈值处理算法

利用PyThresh与PyOD库自动选择阈值,可以提高识别精度。然而,请注意,使用PyThresh中的算法来自动确定阈值并不保证在所有情况下都能获得理想效果。

# 从pyod库中导入KNN模型、评估函数和数据生成函数
from pyod.models.knn import KNN
from pyod.utils.data import generate_data
from sklearn.metrics import accuracy_score
# 从pythresh库中导入KARCH阈值计算方法
from pythresh.thresholds.karch import KARCH
# 设置污染率,即异常值的比例
contamination = 0.1 # percentage of outliers
# 设置训练样本的数量
n_train = 500 # number of training points
# 设置测试样本的数量
n_test = 1000 # number of testing points
# 生成样本数据,返回训练和测试数据及其标签
X_train, X_test, y_train, y_test = generate_data(n_train=n_train,
n_test=n_test,
n_features=2, # 特征数量
contamination=contamination, # 异常值比例
random_state=42) # 随机种子,以确保结果可重复
# 初始化KNN异常检测器
clf_name = 'KNN' # 分类器名称
clf = KNN() # 创建KNN模型实例
clf.fit(X_train) # 使用训练数据拟合模型
thres = KARCH() # 创建KARCH算法创建阈值处理实例
# 对测试数据进行预测
y_test_scores = clf.decision_function(X_test) # 计算测试集的异常分数
# 基于阈值clf.threshold_
y_test_pred = clf.predict(X_test) # 获取测试集,结果
y_test_pred_thre = thres.eval(y_test_scores) # 对异常值结果进行处理
# 计算精度
accuracy = accuracy_score(y_test, y_test_pred)
print(f"阈值处理前精度: {accuracy:.4f}")
accuracy = accuracy_score(y_test, y_test_pred_thre)
print(f"阈值处理后精度: {accuracy:.4f}")

阈值处理前精度: 0.9940
阈值处理后精度: 0.9950

contamination参数

除了初始化PyThresh算法模型实例,也可以在初始化PyOD模型时基于contamination参数指定阈值选择算法:

from pyod.models.kde import KDE # 导入KDE模型
from pyod.models.thresholds import FILTER
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
contamination = 0.1 # 异常点的比例
n_train = 200 # 训练数据点数量
n_test = 100 # 测试数据点数量
# 生成样本数据
X_train, X_test, y_train, y_test = generate_data(n_train=n_train,
n_test=n_test,
n_features=2,
contamination=contamination,
random_state=42) # 随机种子
# 训练KDE检测器
clf_name = 'KDE' # 模型名称
clf = KDE(contamination=FILTER()) # 添加阈值选择算法
clf.fit(X_train) # 使用训练数据拟合模型
# 获取训练数据的预测标签和异常分数
y_train_pred = clf.labels_ # 二元标签(0: 正常点, 1: 异常点)
y_train_scores = clf.decision_scores_ #
# 获取测试数据的预测结果
y_test_pred = clf.predict(X_test)
y_test_scores = clf.decision_function(X_test)
# 评估并打印结果
print("\n在训练数据上:")
evaluate_print(clf_name, y_train, y_train_scores) # 评估训练数据
print("\n在测试数据上:")
evaluate_print(clf_name, y_test, y_test_scores) # 评估测试数据

在训练数据上:
KDE ROC:0.9992, precision @ rank n:0.95
在测试数据上:
KDE ROC:1.0, precision @ rank n:1.0

1.2.4 模型保存与加载​

PyOD使用joblibpickle来保存和加载PyOD模型,如下所示:

from pyod.models.lof import LOF
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize
from joblib import dump, load # 从joblib库导入模型保存和加载工具
contamination = 0.3 # 异常点的比例
n_train = 200 # 训练数据点的数量
n_test = 100 # 测试数据点的数量
# 生成样本数据
X_train, X_test, y_train, y_test = generate_data(n_train=n_train,
n_test=n_test,
n_features=2, # 特征数量为2
contamination=contamination, # 异常比例
random_state=42) # 随机状态设置
# 训练LOF检测器
clf_name = 'LOF' # 分类器名称
clf = LOF() # 实例化LOF模型
clf.fit(X_train) # 在训练数据上拟合模型
# 获取训练数据的预测标签和异常分数
y_train_pred = clf.labels_ # 二进制标签(0:正常点, 1:异常点)
y_train_scores = clf.decision_scores_ # 原始异常分数
# 保存模型
dump(clf, 'clf.joblib') # 将模型保存到文件
# 加载模型
clf_load = load('clf.joblib') # 从文件加载模型
# 获取测试数据的预测
y_test_pred = clf_load.predict(X_test) # 测试数据的异常标签(0或1)
y_test_scores = clf_load.decision_function(X_test) # 测试数据的异常分数
# 评估并打印结果
print("\n在训练数据上的结果:")
evaluate_print(clf_name, y_train, y_train_scores) # 评估训练数据的结果
print("\n在测试数据上的结果:")
evaluate_print(clf_name, y_test, y_test_scores) # 评估测试数据的结果
# 可视化结果
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
y_test_pred, show_figure=True, save_figure=False) # 可视化训练和测试结果

在训练数据上的结果:
LOF ROC:0.5502, precision @ rank n:0.3333
在测试数据上的结果:
LOF ROC:0.4829, precision @ rank n:0.3333

png


2 参考​

 
后退
顶部