使用阈值处理算法
利用PyThresh与PyOD库自动选择阈值,可以提高识别精度。然而,请注意,使用PyThresh中的算法来自动确定阈值并不保证在所有情况下都能获得理想效果。
contamination参数
除了初始化PyThresh算法模型实例,也可以在初始化PyOD模型时基于contamination参数指定阈值选择算法:
利用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使用joblib或pickle来保存和加载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 |