You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:30:59