首页 > 编程知识 正文

分类算法应用,svm算法应用实例

时间:2023-05-05 19:26:17 阅读:51327 作者:3968

检查中常用的算法有Isolation Forest、One-Class Classification等,孤立森林见另一篇。 今天主要介绍One-Class Classification单分类算法。

第一,单分类算法概述One Class Learning比较经典的算法是One-Class-SVM。 该算法的思路非常简单,就是寻找超平面包围样本中的正例。 预测在这个超平面上进行决策,在有魅力的大米样本中被认为是正样本。 由于内核函数的计算很费时间,因此在大量数据的场景中很少使用;

另一种算法是基于神经网络的算法。 在深度学习中广泛使用的自编码算法可以应用于单分类问题。 自编码是一种BP神经网络。 网络的输入层和输出层相同,中间层的数量可以是多层,中间层的节点数量比输出层少。 最简单的是只有一个中间层。 如下图所示,由于中间层的节点数少,中间层相当于压缩数据并抽象,以没有监视的方式学习数据

如果我们只有正样本数据,没有负样本数据,或者只关注学习正样本的规律,那么使用正样本训练自编码器,编码器相当于单分类模型,在预测总量数据时,输入层和输出层的相似度自助代码通过神经网络实现,可以通过GPU进行高速计算,适用于海量数据的场景。

最后是Isolation Forest方法。 孤立森林是一种高效的异常点检测算法。 Sklearn提供了ensemble.IsolatuibForest模块。 模块在检测时随机选取特征,并按所选特征的最大值和最小值随机选取层切面。 该算法下整个训练集的训练可以像树一样递归划分。 分割的次数等于从根节点到叶节点的路径距离d。 所有随机树(随机选择许多树形成森林,以增强鲁棒性)的d平均值是我们检测函数的最终结果。

森林相关的笔记本请参考这里。 请点击我

One-Class SVM算法概述sklearn提供了一种可用于检测奇异(点或异常)点的机器学习方法,包括oneclassvm、隔离偏移、定位因子(lof )

严格来说,OneCLassSVM是novelty detection方法,而不是outlier detection。 训练集中不应该包含例外点,因为模型可能与这些例外点匹配。 然而,在数据的维度高或对关联的数据的分布没有任何假设的情况下,OneClassSVM也可以是良好的outlier detection方法。

在one-class classification中,只有一种信息可用于训练,而缺少其他类型的“outlier”信息。 也就是说,区分两种类型的边界线是通过只学习一种数据的信息获得的。

名词的解释

novelty detection :目标是在训练数据没有离群点的情况下,利用训练过的模型检测另一个发现的新样本outlier dection。 如果训练数据包含离群点,则在训练模型时匹配训练数据的中心样本,忽略训练样本中的其他异常点。 将OneClass与二分类、多分类的区分分类算法划分,可以根据类别的个数分为单分类、二分类、多分类。 常用的分类算法主要解决二分类和多分类问题,预测一封邮件是否垃圾邮件是典型的二分类问题,手写识别是典型的多分类问题,这些算法不能很好地应用于单分类,但单分类问题在工业界广泛存在,各企业都在刻画用户也就是说,即使采用一些排除方法筛选负样本,由于负样本不纯,不能保证负样本没有正,因此在只能定义正样本而不能定义负样本的情况下,使用单分类算法更合适

单分类算法只关注与样本的相似或一致程度,对未知部分不做结论。

典型的两类问题:识别邮件是否是垃圾邮件,一个是“是”,一个是“否”。

典型的多类问题:人脸识别是每个人对应的人脸属于一个类,将识别的人脸分为对应的类。

在OneClassClassification中,只有一个类,如果属于该类,则返回“是”;如果不属于,则返回“否”。

其区别在于,在二分类问题中,训练集由两个类样本组成,训练模型为一个二分类模型; 因为OneClassClassification只有一种训练样本,所以训练的分类器只需要将不属于该类的所有其他样本判断为“否”,而不是返回“否”的结果,因为它们属于其他类

One Class SVM算法步骤One Class SVM也是支持向量机的大家庭,但与传统的基于监控学习的分类回归支持向量机不同,它是一种没有监控学习的方法。 也就是说,不需要标记训练集

输出标签。

  那么没有类别标签,我们如何寻找划分的超平面以及寻找支持向量机呢?One Class SVM这个问题的解决思路有很多。这里只讲解一种特别的思想SVDD,对于SVDD来说,我们期望所有不是异常的样本都是正类别,同时它采用一个超球体而不是一个超平面来做划分,该算法在特征空间中获得数据周围的球形边界,期望最小化这个超球体的体积,从而最小化异常点数据的影响。

  假设产生的超球体参数为中心 o 和对应的超球体半径 r >0,超球体体积V(r) 被最小化,中心 o 是支持行了的线性组合;跟传统SVM方法相似,可以要求所有训练数据点xi到中心的距离严格小于r。但是同时构造一个惩罚系数为 C 的松弛变量 ζi ,优化问题入下所示:

采用拉格朗日对偶求解之后,可以判断新的数据点 z 是否在内,如果 z 到中心的距离小于或者等于半径 r ,则不是异常点,如果在超球体以外,则是异常点。

  在Sklearn中,我们可以采用SVM包里面的OneClassSVM来做异常点检测。OneClassSVM也支持核函数,所以普通SVM里面的调参思路在这里也使用。

相关SVDD参考:https://zhuanlan.zhihu.com/p/97522759

sklearn实现:OneClasssSVM

  根据已有支持向量机的理解,算法并非对已有标签的数据进行分类判别,而是通过回答:yes  or  no 的方法去根据支持向量域(support  vector domaindescription SVDD),将样本数据训练出一个最小的超球面(大于三维特征),其中在二维中是一个曲线,将数据全部包起来,即将异常点排除。

 OneClass SVM 主要参数和方法

class sklearn.svm.OneClassSVM(kernel=’rbf’, degree=3, gamma=’auto’, coef0=0.0, tol=0.001, nu=0.5, shrinking=True, cache_size=200, verbose=False, max_iter=-1, random_state=None)

参数:

  kernel:核函数(一般使用yxdbg核)  nu:设定训练误差(0, 1],表示异常点比例,默认值为0.5

属性:

方法:

fit(X):训练,根据训练样本和上面两个参数探测边界。(注意是无监督)predict(X):返回预测值,+1就是正常样本,-1就是异常样本。decision_function(X):返回各样本点到超平面的函数距离(signed distance),正的维正常样本,负的为异常样本。set_params(**params):设置这个评估器的参数,该方法适用于简单估计器以及嵌套对象(例如管道),而后者具有表单<component>_<parameter>的参数,,因此可以更新嵌套对象的每个组件。get_params([deep]):获取这个评估器的参数。fit_predict(X[, y]):在X上执行拟合并返回X的标签,对于异常值,返回 -1 ,对于内点,返回1。

 

One-Class SVM with  non-linear kernel (RBF)

  下面使用OneClass SVM 进行奇异点检测。

  OneClass SVM 是一个无监督算法,它用于学习奇异点检测的决策函数:将新数据分类为与训练集相似或者不同的数据。

 sklearn实现代码如下:

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.font_managerfrom sklearn import svmxx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))# Generate train dataX = 0.3 * np.random.randn(100, 2)X_train = np.r_[X + 2, X - 2]X_test = np.r_[X + 2, X-2]# Generate some abnormal novel observationsX_outliers = np.random.uniform(low=0.1, high=4, size=(20, 2))# fit the modelclf = svm.OneClassSVM(nu=0.1, kernel='rbf', gamma=0.1)clf.fit(X_train)y_pred_train = clf.predict(X_train)y_pred_test = clf.predict(X_test)y_pred_outliers = clf.predict(X_outliers)n_error_train = y_pred_train[y_pred_train == -1].sizen_error_test = y_pred_test[y_pred_test == -1].sizen_error_outlier = y_pred_outliers[y_pred_outliers == 1].size# plot the line , the points, and the nearest vectors to the planeZ = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.title("Novelty Detection")plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu)a = plt.contour(xx, yy, Z, levels=[0, Z.max()], colors='palevioletred')s =40b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white', s=s, edgecolors='k')b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='blueviolet', s=s, edgecolors='k')c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='gold', s=s, edgecolors='k')plt.axis('tight')plt.xlim((-5, 5))plt.ylim((-5, 5))plt.legend([a.collections[0], b1, b2, c], ["learned frontier", 'training observations', "new regular observations", "new abnormal observations"], loc="upper left", prop=matplotlib.font_manager.FontProperties(size=11))plt.xlabel( "error train: %d/200; errors novel regular: %d/40; errors novel abnormal:%d/40"%( n_error_train, n_error_test, n_error_outlier) )plt.show()

OneClassSVM 代码二

根据对已有支持向量机的理解,算法并非对已有标签的数据进行分类判别,而是通过回答“yes or no”的方式去根据支持向量域描述(support  vector domaindescription  SVDD),将样本数据训练出一个最小的超球面(大于三维特征),其中在二维中是一个曲线,将数据全部包起来,即将异常点排除。Sklearn包中给出的demo实验结果如上:我们可以看出在不同的数据分布下会有一些不一样的误差,其中调整参数中有一个比较重要的nu,表示异常点比例,默认值为0.5。 

from sklearn import svmimport matplotlib.pyplot as pltplt.style.use('fivethirtyeight')from numpy import genfromtxtdef read_dataset(filePath, delimiter=','): return genfromtxt(filePath, delimiter=delimiter)# use the same datasettr_data = read_dataset('tr_data.csv')clf = svm.OneClassSVM(nu=0.05, kernel='rbf', gamma=0.1)'''OneClassSVM(cache_size=200, coef0=0.0, degree=3, gamma=0.1, kernel='rbf', max_iter=-1, nu=0.05, random_state=None, shrinking=True, tol=0.001, verbose=False)'''clf.fit(tr_data)pred = clf.predict(tr_data)# inliers are labeled 1 , outliers are labeled -1normal = tr_data[pred == 1]abnormal = tr_data[pred == -1]plt.plot(normal[:, 0], normal[:, 1], 'bx)plt.plot(abnormal[:, 0], abnormal[:, 1], 'ro')

因为上面的代码没有数据,我这里在网上找了一张图,可以基本说明问题,如下:

参考:

https://blog.csdn.net/bbbeoy/article/details/79159652https://blog.csdn.net/u013719780/article/details/53219997https://www.cnblogs.com/damumu/p/7320334.htmlhttps://www.debugger.wiki/article/html/1557561603397775

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。