机器学习实验(九):基于高斯分布和OneClassSVM的异常点检测

    xiaoxiao2021-12-08  27

    声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents

    大多数数据挖掘或数据工作中,异常点都会在数据的预处理过程中被认为是“噪音”而剔除,以避免其对总体数据评估和分析挖掘的影响。但某些情况下,如果数据工作的目标就是围绕异常点,那么这些异常点会成为数据工作的焦点。 数据集中的异常数据通常被成为异常点、离群点或孤立点等,典型特征是这些数据的特征或规则与大多数数据不一致,呈现出“异常”的特点,而检测这些数据的方法被称为异常检测。 “噪音”的出现有多种原因,例如业务操作的影响(典型案例如网站广告费用增加10倍,导致流量激增)、数据采集问题(典型案例如数据缺失、不全、溢出、格式匹配等问题)、数据同步问题(异构数据库同步过程中的丢失、连接错误等导致的数据异常),而对离群点进行挖掘分析之前,需要从中区分出真正的“离群数据”,而非“垃圾数据”。

    基于高斯分布的异常点检测

    In [1]: import matplotlib.pyplot as plt import numpy as np %matplotlib inline from numpy import genfromtxt from scipy.stats import multivariate_normal from sklearn.metrics import precision_recall_fscore_support In [2]: def read_dataset(filePath,delimiter=','): return genfromtxt(filePath, delimiter=delimiter) def feature_normalize(dataset): mu = np.mean(dataset,axis=0) sigma = np.std(dataset,axis=0) return (dataset - mu)/sigma def estimateGaussian(dataset): mu = np.mean(dataset, axis=0) sigma = np.cov(dataset.T) return mu, sigma def multivariateGaussian(dataset,mu,sigma): p = multivariate_normal(mean=mu, cov=sigma) return p.pdf(dataset) def selectThresholdByCV(probs,gt): best_epsilon = 0 best_f1 = 0 f = 0 stepsize = (max(probs) - min(probs)) / 1000; epsilons = np.arange(min(probs),max(probs),stepsize) for epsilon in np.nditer(epsilons): predictions = (probs < epsilon) * 1 p, r, f, s = precision_recall_fscore_support(gt, predictions,average='binary') if f > best_f1: best_f1 = f best_epsilon = epsilon return best_f1, best_epsilon In [3]: tr_data = read_dataset('tr_server_data.csv') # test data cv_data = read_dataset('cv_server_data.csv') # used to tune parameters gt_data = read_dataset('gt_server_data.csv') # label n_training_samples = tr_data.shape[0] n_dim = tr_data.shape[1] print('Number of datapoints in training set: %d' % n_training_samples) print('Number of dimensions/features: %d' % n_dim) print(tr_data[1:5,:]) plt.xlabel('Latency (ms)') plt.ylabel('Throughput (mb/s)') plt.plot(tr_data[:,0],tr_data[:,1],'o') plt.show() Number of datapoints in training set: 307 Number of dimensions/features: 2 [[ 13.409 13.763] [ 14.196 15.853] [ 14.915 16.174] [ 13.577 14.043]] In [4]: mu, sigma = estimateGaussian(tr_data) p = multivariateGaussian(tr_data,mu,sigma) In [5]: #selecting optimal value of epsilon using cross validation p_cv = multivariateGaussian(cv_data,mu,sigma) fscore, ep = selectThresholdByCV(p_cv,gt_data) print fscore, ep /Applications/anaconda/lib/python2.7/site-packages/sklearn/metrics/classification.py:1074: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 due to no predicted samples. 'precision', 'predicted', average, warn_for) 0.875 9.03620132798e-05 In [6]: #selecting outlier datapoints outliers = np.asarray(np.where(p < ep)) In [7]: plt.figure() plt.xlabel('Latency (ms)') plt.ylabel('Throughput (mb/s)') plt.plot(tr_data[:,0],tr_data[:,1],'bx') plt.plot(tr_data[outliers,0],tr_data[outliers,1],'ro') plt.show()

    Anomaly Detection Using One-Class SVM

    OneClassSVM算法原理:

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

    In [8]: from sklearn import svm plt.style.use('fivethirtyeight') In [9]: # use the same dataset tr_data = read_dataset('tr_server_data.csv') # test data In [10]: clf = svm.OneClassSVM(nu=0.05, kernel="rbf", gamma=0.1) clf.fit(tr_data) Out[10]: 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) In [11]: pred = clf.predict(tr_data) # inliers are labeled 1, outliers are labeled -1 normal = tr_data[pred == 1] abnormal = tr_data[pred == -1] In [12]: plt.plot(normal[:,0],normal[:,1],'bx') plt.plot(abnormal[:,0],abnormal[:,1],'ro') Out[12]: [<matplotlib.lines.Line2D at 0x11a4b06d0>]

    转载请注明原文地址: https://ju.6miu.com/read-681669.html

    最新回复(0)