【scikit-learn】sklearn.svm.OneClassSVM 类:一类支持向量机,用于异常检测
OneClassSVM 是 sklearn.svm 提供的异常检测(Outlier Detection) 方法,适用于无监督学习,用于检测异常点、孤立点或异常行为,例如欺诈检测、入侵检测、工业设备故障检测。OneClassSVM 适用于异常检测任务,利用支持向量机超平面分割异常点,适用于高维数据,但比 IsolationForest 计算成本更高。
·
sklearn.svm.OneClassSVM(一类支持向量机,用于异常检测)
OneClassSVM 是 sklearn.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计算成本更高。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)