one-class svm单分类器使用初尝试

本文介绍了如何使用one-class SVM(OC-SVM)进行异常检测。通过详细注释的代码展示了如何构建训练集,进行训练,预测,并绘制散点图和等高线来判断异常数据。OC-SVM在只有正常样本的情况下,用于识别测试集中不寻常的样本,区别于CNN的平衡样本训练。
摘要由CSDN通过智能技术生成

ocsvm单分类器使用

每部分代码都有注释,较为详尽了都能看懂。代码可见于开源中国ocsvm的讲解博客,其他很多站也能搜到,看起来还是比较直观步骤也比较清晰,核心的步骤都有,于是就挨个查了一下。

最终做了几个小地方的修改,主要是测试数据和数据个数的调整。

先说下目标,比如你一堆数据是一堆点很多坐标,都是正常数据(图中白色)利用其作为训练集,再有一些测试集的数据(有正样本(图中紫色)和负样本(图中黄色)),利用训练出的模型判定测试集样本是否为正常数据。

这和CNN就有差别了,CNN每个训练样本都有标签,知道哪些正样本哪些负样本,但两种样本数量相对均衡。这里就不均衡了,拿到的全是正样本需要找到异常数据,这就可以称之为异常检测(AD)。

看下这段代码,从结果看,输出的图片是散点图配上两类等高线,填充的等高线是判定区域之外的部分,红色(偏红那个,其实不是红色)部分是判定是否是异常数据的平面,也就是所谓的根据训练得到的分界线。

修改代码后运行截图

代码如下

'''
ocsvm1
'''
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager
from sklearn import svm

# linespace(start,end,num)在start和end之间均匀间隔生成的num个数
# meshgrid生成网格点坐标矩阵,xx,yy = np.meshgrid(x,y),xx与yy一一对应坐标数据
# 如xx,yy = np.meshgrid(x,y) x = [0,1,2] y = [0,1] xx = [[0,1,2],[0,1,2]] yy = [[0,0,0],[1,1,1]]
# xx和yy用于画等高线
xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))

# Generate train data
# np.random.randn(d1,d2,...,dn),与np.random.rand(d1,d2,...,dn)生成[0,1)范围内的数据相似
# np.random.randn()符合标准正态分布N(0,1)以0为均值1为标准差,d均为生成数据的维度
X = 0.3 * np.random.randn(200, 2)
Y = 0.3 * np.random
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是使用遗传算法优化OneClassSVM分类器参数的示例代码: ```python import numpy as np from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split from sklearn.svm import OneClassSVM import genetic_algorithm as ga # 遗传算法模块,需自行安装 # 定义目标函数:返回 OneClassSVM 分类器在测试集上的混淆矩阵(即 TP,FP,TN,FN) def fitness_func(params, x_train, x_test): clf = OneClassSVM(kernel='rbf', nu=params[0], gamma=params[1]) clf.fit(x_train) y_pred = clf.predict(x_test) cm = confusion_matrix(y_test, y_pred) # 计算混淆矩阵 tp, fp, tn, fn = cm.ravel() # 摊平混淆矩阵 return tp, fp, tn, fn # 加载数据集 data = np.load('data.npy') x = data[:, :-1] y = data[:, -1] # 划分训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=42) # 定义变量的取值范围(nu ∈ [0.01, 0.3],gamma ∈ [0.01, 10.0]) genes = [ {'name': 'nu', 'type': 'float', 'min': 0.01, 'max': 0.3}, {'name': 'gamma', 'type': 'float', 'min': 0.01, 'max': 10.0}, ] # 定义遗传算法的相关参数 num_generations = 50 population_size = 10 mutation_rate = 0.01 # 运行遗传算法进行参数优化 best_params, best_fitness = ga.run(fitness_func, genes, x_train, x_test, num_generations, population_size, mutation_rate) # 打印最佳参数和最佳适应度 print('Best parameters:', best_params) print('Best fitness:', best_fitness) # 运行 OneClassSVM 分类器,并在测试集上计算混淆矩阵 clf = OneClassSVM(kernel='rbf', nu=best_params[0], gamma=best_params[1]) clf.fit(x_train) y_pred = clf.predict(x_test) cm = confusion_matrix(y_test, y_pred) # 打印混淆矩阵 print('Confusion matrix:') print(cm) ``` 其中, `genetic_algorithm.py` 是自己编写的遗传算法模块,也可以使用开源遗传算法库,例如 DEAP。运行时需要将数据集 `data.npy` 放在同一目录下,并在代码中指定变量的取值范围。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值