基于OneClassSVM实现全数据集异常检测结果输出的技术问询
解决OneClassSVM全量样本异常预测标记问题
要生成包含全量样本的0/1异常标记列,核心是对训练集和测试集分别做预测,再按原数据集的顺序合并结果,具体步骤如下:
1. 对训练集执行预测并转换标记
训练好One_Class_Svm模型后,不要只预测测试集,对训练集也执行相同的预测和标记转换逻辑:
# 对训练集做异常预测 prediction_train = One_Class_Svm.predict(X_train) # 统一转换为0/1标记:-1(异常)转1,1(正常)转0 prediction_train = [1 if i == -1 else 0 for i in prediction_train] # 原测试集预测代码保留 prediction_test = One_Class_Svm.predict(X_test) prediction_test = [1 if i == -1 else 0 for i in prediction_test]
2. 合并预测结果到全量样本
这里分两种数据格式处理,确保预测结果和原数据集的样本顺序完全对应:
情况1:数据集是Pandas DataFrame
如果原数据集X_full是DataFrame,划分时X_train和X_test会保留原索引,直接利用索引合并排序:
import pandas as pd # 将预测结果转为带索引的Series pred_train_series = pd.Series(prediction_train, index=X_train.index) pred_test_series = pd.Series(prediction_test, index=X_test.index) # 合并并按原数据集索引排序,得到全量预测列 full_prediction = pd.concat([pred_train_series, pred_test_series]).reindex(X_full.index) # 可选:将预测列加入原数据框 X_full['anomaly_pred'] = full_prediction
情况2:数据集是Numpy数组
如果用Numpy数组存储数据,划分时需要额外记录样本索引,再按索引填充结果:
import numpy as np from sklearn.model_selection import train_test_split # 划分训练/测试集时同时记录原索引 indices = np.arange(X_full.shape[0]) X_train, X_test, idx_train, idx_test = train_test_split(X_full, indices, test_size=0.2, random_state=42) # 训练集预测(用numpy.where更高效) prediction_train = np.where(One_Class_Svm.predict(X_train) == -1, 1, 0) # 测试集预测 prediction_test = np.where(One_Class_Svm.predict(X_test) == -1, 1, 0) # 创建全量预测数组并按索引填充 full_prediction = np.zeros(X_full.shape[0]) full_prediction[idx_train] = prediction_train full_prediction[idx_test] = prediction_test
关键注意点
- 训练集也需要用训练好的模型预测,不能只处理测试集
- 必须严格对应原数据集的样本顺序,否则标记会错位,影响后续和真实结果的对比
- 0/1标记的转换逻辑要完全统一,确保异常/正常的定义一致
内容的提问来源于stack exchange,提问作者hhamidy
相关产品推荐
相关产品推荐

