isolationforest 实现_使用python+sklearn实现在各种小型数据集(toy datasets)上比较异常检测算法...

此示例展示了二维数据集上不同异常检测算法的特点。数据集包含一个或两个模式(高密度区域))来说明算法处理多模态数据(multimodal data)的能力。 对于每个数据集,将生成15%的样本作为随机均匀噪声,该比例是OneClassSVM的参数和其他异常点检测算法的污染参数取值。正常值和异常值之间的决策边界用黑色显示,但局部异常值因子(Local Outlier Factor)(LOF)除外,因为它在用于异常值检测时,不能用于预测新数据。 众所周知, sklearn.svm.OneClassSVM 是对异常值是很敏感,因此对异常值检测的效果不太好。当训练集不受异常值污染时,此估计器最适合于新奇点检测(novelty detection),也就是说,在高维或没有任何关于内在数据的分布假设情况下,异常点的检测是非常具有挑战性的,One-class SVM在这些情况下可能会根据其超参数的值给出有用的结果。 sklearn.covariance.EllipticEnvelope 假设数据是服从高斯分布的,并学习一个椭圆分布,因此,当数据不是单峰(unimodal)时,它就会退化(degrade),但是,请注意,此估计器对异常值是鲁棒的。 sklearn.ensemble.IsolationForestsklearn.neighbors.LocalOutlierFactor 在多模态数据集上似乎表现良好。 sklearn.neighbors.LocalOutlierFactor 在第三个数据集上,显示了比其他估计器具有更优越的优点,其中两种模式具有不同的密度,这一优势可以由局部异常值因子(LOF)来解释,这意味着它只将一个样本的异常分数与其邻居的分数进行比较。 最后,对于最后一个数据集,很难说一个样本比另一个样本更不正常,因为它们都均匀分布在超立方体中,除了 sklearn.svm.OneClassSVM 有点过拟合的情况以外,所有估计器都给出了很好的解决方案,在这种情况下,更仔细地观察样本的异常分数是明智的,因为一个好的估计器应该为所有样本分配相似的分数。 尽管这些示例给出了有关算法的一些直觉,但这种直觉可能不适用于非常高维的数据。 最后,请注意,这些模型的参数是精心挑选的,但实际上它们需要调整,在没有标签数据的情况下,这个问题是完全无监督的,因此模型的选择可能是一个挑战。
91ef495a9d13ada8cb9ad26a6c0c2e97.png sphx_glr_plot_anomaly_comparison_001 (1)
# 作者: Alexandre Gramfort #         Albert Thomas # 许可证: BSD 3 clauseimport timeimport numpy as npimport matplotlibimport matplotlib.pyplot as pltfrom sklearn import svmfrom sklearn.datasets import make_moons, make_blobsfrom sklearn.covariance import EllipticEnvelopefrom sklearn.ensemble import IsolationForestfrom sklearn.neighbors import LocalOutlierFactorprint(__doc__)matplotlib.rcParams['contour.negative_linestyle'] = 'solid'# 实例参数设置n_samples = 300outliers_fraction = 0.15n_outliers = int(outliers_fraction * n_samples)n_inliers = n_samples - n_outliers# 定义要比较的异常值检测方法anomaly_algorithms = [    ("Robust covariance", EllipticEnvelope(contamination=outliers_fraction)),    ("One-Class SVM", svm.OneClassSVM(nu=outliers_fraction, kernel="rbf",                                      gamma=0.1)),    ("Isolation Forest", IsolationForest(contamination=outliers_fraction,                                         random_state=42)),    ("Local Outlier Factor", LocalOutlierFactor(        n_neighbors=35, contamination=outliers_fraction))]# 定义数据集blobs_params = dict(random_state=0, n_samples=n_inliers, n_features=2)datasets = [    make_blobs(centers=[[0, 0], [0, 0]], cluster_std=0.5,               **blobs_params)[0],    make_blobs(centers=[[2, 2], [-2, -2]], cluster_std=[0.5, 0.5],               **blobs_params)[0],    make_blobs(centers=[[2, 2], [-2, -2]], cluster_std=[1.5, .3],               **blobs_params)[0],    4. * (make_moons(n_samples=n_samples, noise=.05, random_state=0)[0] -          np.array([0.5, 0.25])),    14. * (np.random.RandomState(42).rand(n_samples, 2) - 0.5)]# 在具体设置的参数下比较定义好的分类器xx, yy = np.meshgrid(np.linspace(-7, 7, 150),                     np.linspace(-7, 7, 150))plt.figure(figsize=(len(anomaly_algorithms) * 2 + 3, 12.5))plt.subplots_adjust(left=.02, right=.98, bottom=.001, top=.96, wspace=.05,                    hspace=.01)plot_num = 1rng = np.random.RandomState(42)for i_dataset, X in enumerate(datasets):    # 添加异常值    X = np.concatenate([X, rng.uniform(low=-6, high=6,                       size=(n_outliers, 2))], axis=0)    for name, algorithm in anomaly_algorithms:        t0 = time.time()        algorithm.fit(X)        t1 = time.time()        plt.subplot(len(datasets), len(anomaly_algorithms), plot_num)        if i_dataset == 0:            plt.title(name, size=18)        # 训练数据和标记出异常值        if name == "Local Outlier Factor":            y_pred = algorithm.fit_predict(X)        else:            y_pred = algorithm.fit(X).predict(X)        # 画出等级(levels)的线和点        if name != "Local Outlier Factor":  # LOF没有实现预测            Z = algorithm.predict(np.c_[xx.ravel(), yy.ravel()])            Z = Z.reshape(xx.shape)            plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='black')        colors = np.array(['#377eb8', '#ff7f00'])        plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[(y_pred + 1) // 2])        plt.xlim(-7, 7)        plt.ylim(-7, 7)        plt.xticks(())        plt.yticks(())        plt.text(.99, .01, ('%.2fs' % (t1 - t0)).lstrip('0'),                 transform=plt.gca().transAxes, size=15,                 horizontalalignment='right')        plot_num += 1plt.show()
脚本的总运行时间:(0分钟4.223秒) 估计的内存使用量: 9 MB

7583644b161cef25f512b90aae81c724.png

下载Python源代码: plot_anomaly_comparison.py 下载Jupyter notebook源代码: plot_anomaly_comparison.ipynb 由Sphinx-Gallery生成的画廊

文壹由“伴编辑器”提供技术支持

☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏 文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:

20da86ab53183ace300928105f11cb6c.png

欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)

913ddb2a532dca57e8489be8bcfa9860.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值