【问题标题】:Unstable behavior of OneClassSVM by changing 'nu'通过更改“nu”导致 OneClassSVM 的行为不稳定
【发布时间】:2018-07-26 08:56:48
【问题描述】:

在上面的示例中,我使用我的数据集来识别异常值。对nu参数稍作改动后,识别出的异常数量有很大差异。

这可能只是数据集的一个特殊性吗?还是 scikit-learn 中的错误?

附:很遗憾,我无法共享数据集。

【问题讨论】:

    标签: scikit-learn svm outliers anomaly-detection


    【解决方案1】:

    如果您减小OneClassSVMtol 参数的值,结果会更好,尽管对于较低的 nu 值并不完全符合预期。

    import numpy as np
    from sklearn.svm import OneClassSVM
    
    import matplotlib.pyplot as plt
    
    X = np.random.rand(100, 1)
    nus = np.geomspace(0.0001, 0.5, num=100)
    
    outlier_fraction = np.zeros(len(nus))
    for i, nu in enumerate(nus):
        outlier_fraction[i] = (OneClassSVM(nu=nu, tol=1e-12).fit_predict(X) == -1).mean()
    
    plt.plot(nus, outlier_fraction)
    plt.xlabel('nu')
    plt.ylabel('Outlier fraction')
    plt.show()
    

    使用默认的tol,您可以获得以下内容

    【讨论】:

    • 你能把剧情加到帖子里吗?
    • 我添加了代码剪切返回的图,还添加了使用默认tol获得的图
    【解决方案2】:

    注意:不是答案。提供 MCVE。

    我最近也遇到了这个。我想了解低值的拐点

    import numpy as np
    import pandas as pd
    from sklearn.svm import OneClassSVM
    
    X = np.random.rand(100, 1)
    
    nu = np.geomspace(0.0001, 1, num=100)
    df = pd.DataFrame(data={'nu': nu})
    
    for i in range(0, len(X)):
        df.loc[i, 'anom_count'] = (OneClassSVM(nu=df.loc[i, 'nu']).fit_predict(X) == -1).sum()
    
    df.set_index('nu').plot();
    

    df.set_index('nu').plot(xlim=(0, 0.2));
    

    df.anom_count.min() # 3
    df.anom_count.idxmin() # 62
    df.loc[df.anom_count.idxmin(), 'nu'] # 0.031
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2020-05-05
      • 2012-11-12
      相关资源
      最近更新 更多