2013-09-23 17 views
7

私は、テキスト分類のためにsklearn-frameworkからLinearSVCとSVCを実装しました。 TfidfVectorizerを使用して、2つの異なるクラス(良性のデータと悪意のあるデータ)からなる入力データの疎な表現を取得しています。この部分はかなりうまく動作していますが、今はOneClassSVM分類器を使用し、1つのクラス(異常値検出など)でモデルをトレーニングすることで、何らかの異常検出を実装したかったのです。残念ながら、それはまばらなデータでは機能しません。一部の開発者はパッチ(https://github.com/scikit-learn/scikit-learn/pull/1586)で作業していますが、いくつかのバグがあり、OneClassSVM実装を使用するための解決策はまだありません。[異常判定] - OneClassSVMの代替案

sklearn-frameworkには、このようなことを行うための方法はありますか?私は例を見ているが、何も合わないようだ。

ありがとうございます!

答えて

1

外れ値検出

のため残念ながら、現在scikit-学ぶimplementsのみ1クラスSVMと強固な共分散推定あなたは、2Dデータの違いを調べることによって、これらのメソッド(as provided in the doc)の比較ですが試すことができます。

import numpy as np 
import pylab as pl 
import matplotlib.font_manager 
from scipy import stats 

from sklearn import svm 
from sklearn.covariance import EllipticEnvelope 

# Example settings 
n_samples = 200 
outliers_fraction = 0.25 
clusters_separation = [0, 1, 2] 

# define two outlier detection tools to be compared 
classifiers = { 
    "One-Class SVM": svm.OneClassSVM(nu=0.95 * outliers_fraction + 0.05, 
            kernel="rbf", gamma=0.1), 
    "robust covariance estimator": EllipticEnvelope(contamination=.1)} 

# Compare given classifiers under given settings 
xx, yy = np.meshgrid(np.linspace(-7, 7, 500), np.linspace(-7, 7, 500)) 
n_inliers = int((1. - outliers_fraction) * n_samples) 
n_outliers = int(outliers_fraction * n_samples) 
ground_truth = np.ones(n_samples, dtype=int) 
ground_truth[-n_outliers:] = 0 

# Fit the problem with varying cluster separation 
for i, offset in enumerate(clusters_separation): 
    np.random.seed(42) 
    # Data generation 
    X1 = 0.3 * np.random.randn(0.5 * n_inliers, 2) - offset 
    X2 = 0.3 * np.random.randn(0.5 * n_inliers, 2) + offset 
    X = np.r_[X1, X2] 
    # Add outliers 
    X = np.r_[X, np.random.uniform(low=-6, high=6, size=(n_outliers, 2))] 

    # Fit the model with the One-Class SVM 
    pl.figure(figsize=(10, 5)) 
    for i, (clf_name, clf) in enumerate(classifiers.iteritems()): 
     # fit the data and tag outliers 
     clf.fit(X) 
     y_pred = clf.decision_function(X).ravel() 
     threshold = stats.scoreatpercentile(y_pred, 
              100 * outliers_fraction) 
     y_pred = y_pred > threshold 
     n_errors = (y_pred != ground_truth).sum() 
     # plot the levels lines and the points 
     Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) 
     Z = Z.reshape(xx.shape) 
     subplot = pl.subplot(1, 2, i + 1) 
     subplot.set_title("Outlier detection") 
     subplot.contourf(xx, yy, Z, levels=np.linspace(Z.min(), threshold, 7), 
         cmap=pl.cm.Blues_r) 
     a = subplot.contour(xx, yy, Z, levels=[threshold], 
          linewidths=2, colors='red') 
     subplot.contourf(xx, yy, Z, levels=[threshold, Z.max()], 
         colors='orange') 
     b = subplot.scatter(X[:-n_outliers, 0], X[:-n_outliers, 1], c='white') 
     c = subplot.scatter(X[-n_outliers:, 0], X[-n_outliers:, 1], c='black') 
     subplot.axis('tight') 
     subplot.legend(
      [a.collections[0], b, c], 
      ['learned decision function', 'true inliers', 'true outliers'], 
      prop=matplotlib.font_manager.FontProperties(size=11)) 
     subplot.set_xlabel("%d. %s (errors: %d)" % (i + 1, clf_name, n_errors)) 
     subplot.set_xlim((-7, 7)) 
     subplot.set_ylim((-7, 7)) 
    pl.subplots_adjust(0.04, 0.1, 0.96, 0.94, 0.1, 0.26) 

pl.show() 
5

もう少し遅いですが、他の誰かがこれに関する情報を探している場合は、Sklearn用のサードパーティ異常検出モジュールがあります。http://www.cit.mak.ac.ug/staff/jquinn/software/lsanomaly.html、最小自乗法に基づいています。これは、OneClassSVMのプラグインを置き換えるものでなければなりません。