一、oneclasssvm算法
oneclasssvm是一种无监督学习方法,用来进行异常检测。它的主要思想是将正常数据视为一种分类,并试图寻找一个边界,使得所有异常数据点都位于该边界的外部。
在实际应用中,我们很难获得完整的异常数据点,因此,oneclasssvm的目的就是在没有异常数据点的情况下,学习到正常数据的分布,并进一步将新数据分为正常或异常数据。
oneclasssvm算法的输出结果在分类问题中通常表示分类的概率,但是在异常检测问题中,它表示离该决策边界的距离。因此,输出结果越大,表明越可能是一个异常点。
二、oneclasssvm输出概率
在oneclasssvm中,输出的结果是输入数据点到决策边界的距离。如果该距离为负值,则该数据点被视为异常数据;如果该距离为正值,则该数据点被视为正常数据。
不过在实际应用中,我们可能会更关心分类的概率。这时,我们需要进行如下转换:
# 计算分类概率
decision_func = clf.decision_function(X_test)
prob = np.exp(-decision_func) / np.sum(np.exp(-decision_func))
# 输出结果
print(prob)
通过上述代码,我们可以将距离转换为概率输出。其中,exp()函数用于计算指数,sum()函数用于计算均值。
三、oneclasssvm论文
oneclasssvm最初由Schölkopf和Platt在1999年提出,其论文题为”Support Vector Method for Novelty Detection”.
在该论文中,作者提出了一种新的分类方法,称为支持向量机(SVM)。该方法采用一个非常小的核函数(例如径向基函数),生成一个高维空间,使得正常数据在该空间中形成一个超球体。因此,新数据点到该超球体的距离即为其分类距离。
后续研究发现,不同的核函数可能对结果产生不同的影响,并且该算法存在一定的缺点。因此,该算法的改进研究仍在进行中。
四、oneclasssvm概率
在oneclasssvm中,分类概率是一个非常重要的概念,因为它可以告诉我们每个数据点被分类为正常或异常的可能性。
在sklearn库中,我们可以使用predict_proba()函数来计算每个数据点被分类为正常或异常的概率。
# 计算分类概率
pred_prob = clf.predict_proba(X_test)
# 输出结果
print(pred_prob)
通过上述代码,我们可以很方便地获得分类概率。不过需要注意的是,该函数对于oneclasssvm算法而言并不是一个标准的函数,因此在实际应用中需要谨慎使用。
五、oneclasssvm控制限
在oneclasssvm中,我们不仅需要考虑如何找到正常数据和异常数据的边界,还需要考虑如何设定一个控制限,来确保被识别的异常数据点的数量不超过某个阈值。
为此,我们可以使用nu参数进行控制,它表示异常数据点的最大比例。同时,我们还可以使用gamma参数来控制核函数的宽度,从而进一步精细化分类结果。
# 设定控制限和核函数宽度
clf = svm.OneClassSVM(kernel='rbf', nu=0.1, gamma=0.1)
# 训练模型
clf.fit(X_train)
# 预测结果
y_pred = clf.predict(X_test)
# 输出结果
print(y_pred)
六、oneclasssvm参数调节
在oneclasssvm中,我们还需要调节一些参数,来优化分类效果。
其中,nu是一个非常重要的参数,它表示异常数据点的最大比例。如果该值过小,则会忽略一些异常数据点,从而影响分类结果,如果该值过大,则会将一些正常数据点误判为异常数据点。
除此之外,我们还可以调节gamma参数,来控制核函数宽度。该参数越大,则核函数越窄,从而会导致模型更加敏感。
# 设定nu和gamma参数
nu = 0.1
gamma = 0.1
# 训练模型
clf = svm.OneClassSVM(kernel='rbf', nu=nu, gamma=gamma)
clf.fit(X_train)
# 预测结果
y_pred = clf.predict(X_test)
# 输出结果
print(y_pred)
七、oneclasssvm异常检测
如果我们要检测异常数据点,并进行分类,则可以使用oneclasssvm算法。
其中,nu参数用于控制异常数据点的最大比例,gamma参数用于调节核函数宽度。
# 训练模型
clf = svm.OneClassSVM(kernel='rbf', nu=0.1, gamma=0.1)
clf.fit(X_train)
# 预测结果
y_pred = clf.predict(X_test)
# 输出结果
print(y_pred)
八、oneclasssvm异常检测 实现
为了进行异常检测,我们需要先获得一些正常数据和异常数据。
# 导入模块
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_moons
# 生成数据集
X, y = make_moons(n_samples=300, noise=0.1, random_state=0)
# 获得正常数据和异常数据
X_train = X[:200]
X_test = X[200:]
通过上述代码,我们可以生成一些月牙形的数据点,并将前200个数据点视为正常数据,后100个数据点视为异常数据。
接下来,我们可以使用oneclasssvm算法来进行异常检测。
# 训练模型
clf = svm.OneClassSVM(kernel='rbf', nu=0.1, gamma=0.1)
clf.fit(X_train)
# 预测结果
y_pred = clf.predict(X_test)
# 输出异常数据点
print(X_test[y_pred == -1])
通过上述代码,我们可以输出所有被oneclasssvm算法识别为异常数据点的数据点。
九、代码示例
# 导入模块
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_moons
# 生成数据集
X, y = make_moons(n_samples=300, noise=0.1, random_state=0)
# 获得正常数据和异常数据
X_train = X[:200]
X_test = X[200:]
# 训练模型
clf = svm.OneClassSVM(kernel='rbf', nu=0.1, gamma=0.1)
clf.fit(X_train)
# 预测结果
y_pred = clf.predict(X_test)
# 输出异常数据点
print(X_test[y_pred == -1])
原创文章,作者:MDXJ,如若转载,请注明出处:https://www.506064.com/n/143579.html
微信扫一扫
支付宝扫一扫