sklearn.svm.OneClassSVM(一类支持向量机,用于异常检测)

OneClassSVMsklearn.svm 提供的 异常检测(Outlier Detection) 方法,适用于 无监督学习,用于检测异常点、孤立点或异常行为,例如 欺诈检测、入侵检测、工业设备故障检测


1. OneClassSVM 作用

  • 用于异常检测(outlier detection),识别不同于主流数据的样本。
  • 基于支持向量机(SVM),寻找高维超平面,使得大多数正常数据在一侧,异常数据在另一侧。
  • 适用于高维数据,但对大规模数据计算较慢

2. OneClassSVM 代码示例

(1) 训练 OneClassSVM 进行异常检测

from sklearn.svm import OneClassSVM
import numpy as np

# 生成数据
rng = np.random.RandomState(42)
X = 0.3 * rng.randn(100, 2)  # 100 个正常点
X = np.concatenate([X, rng.uniform(low=-4, high=4, size=(10, 2))])  # 10 个异常点

# 训练 One-Class SVM 模型
model = OneClassSVM(kernel="rbf", gamma="scale", nu=0.1)
model.fit(X)

# 预测:1 表示正常点,-1 表示异常点
y_pred = model.predict(X)

# 统计异常点数量
n_outliers = np.sum(y_pred == -1)
print("检测到的异常点数量:", n_outliers)

解释

  • nu=0.1:假设 10% 的数据是异常点(超参数)。
  • kernel="rbf":使用径向基函数(RBF)核,适用于非线性数据。
  • gamma="scale":自动计算核函数参数,值越大,影响越局部。

3. OneClassSVM 主要参数

OneClassSVM(kernel="rbf", nu=0.1, gamma="scale", degree=3)
参数 说明
nu 异常样本比例(默认 0.1,范围 0 < nu ≤ 1
kernel 核函数类型"linear""poly""rbf""sigmoid"
gamma 核函数参数(默认 "scale",值越大影响越局部)
degree 多项式核的阶数(仅在 kernel="poly" 时有效)

4. 获取异常分数

anomaly_scores = model.decision_function(X)
print("前 10 个样本的异常分数:", anomaly_scores[:10])

解释

  • decision_function(X) 返回 异常分数(anomaly score,值越小越可能是异常点。

5. 可视化异常点

import matplotlib.pyplot as plt

# 可视化正常点和异常点
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap="coolwarm", edgecolors="k")
plt.title("OneClassSVM 异常检测")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

解释

  • 蓝色表示正常点,红色表示异常点

6. OneClassSVM vs. 其他异常检测方法

方法 适用情况 主要区别
OneClassSVM 基于超平面分割异常点 适用于高维数据,但计算成本高
IsolationForest 基于决策树隔离异常点 适用于大规模数据,计算更快
LocalOutlierFactor (LOF) 基于密度检测异常点 适用于低维数据,计算局部密度

示例

from sklearn.ensemble import IsolationForest

iso_forest = IsolationForest(contamination=0.1, random_state=42)
iso_forest.fit(X)
y_pred_iso = iso_forest.predict(X)

print("IsolationForest 检测到的异常点数量:", np.sum(y_pred_iso == -1))

解释

  • OneClassSVM 适用于高维数据,IsolationForest 适用于大规模数据

7. nu 对异常检测的影响

nu_values = [0.05, 0.1, 0.2]
for nu in nu_values:
    model = OneClassSVM(kernel="rbf", nu=nu, gamma="scale")
    model.fit(X)
    y_pred = model.predict(X)
    print(f"nu={nu}, 检测到的异常点数={np.sum(y_pred == -1)}")

解释

  • nu=0.05:认为 5% 的数据是异常点。
  • nu=0.2:认为 20% 的数据是异常点。

8. 适用场景

  • 异常检测(outlier detection)(如 欺诈检测、网络攻击检测)。
  • 数据无标签,使用无监督学习
  • 当数据异常点较少时,OneClassSVM 可能比传统方法更有效

9. 结论

  • OneClassSVM 适用于异常检测任务,利用支持向量机超平面分割异常点,适用于高维数据,但比 IsolationForest 计算成本更高
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐