2

上記の例では、データセットを使用して外れ値を特定しています。パラメータにわずかな変更を加えると、nu特定された異常の数に大きな違いが生じます。

1 クラス SVM

これはデータセットの特殊性にすぎないのでしょうか? それとも scikit-learn のバグですか?

PS 残念ながら、データセットを共有できません。

4

2 に答える 2

1

tolパラメータの値を小さくするOneClassSVMと、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()

nu_small_tol

デフォルトでtolは、次を取得します ここに画像の説明を入力

于 2020-12-22T22:17:47.163 に答える
1

注:答えではありません。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
于 2020-12-19T03:03:42.347 に答える