def test_model_sgd_oneclass_svm(self): X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) model = SGDOneClassSVM(random_state=42) model.fit(X) test_x = np.array([[0, 0], [-1, -1], [1, 1]]).astype(np.float32) model.predict(test_x) model_onnx = convert_sklearn( model, "scikit-learn SGD OneClass SVM", [("input", FloatTensorType([None, X.shape[1]]))], target_opset=TARGET_OPSET) self.assertIsNotNone(model_onnx) dump_data_and_model(test_x.astype(np.float32), model, model_onnx, basename="SklearnSGDOneClassSVMBinaryHinge")
clf = OneClassSVM(gamma=gamma, kernel='rbf', nu=nu) clf.fit(X_train) y_pred_train = clf.predict(X_train) y_pred_test = clf.predict(X_test) y_pred_outliers = clf.predict(X_outliers) n_error_train = y_pred_train[y_pred_train == -1].size n_error_test = y_pred_test[y_pred_test == -1].size n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # Fit the One-Class SVM using a kernel approximation and SGD transform = Nystroem(gamma=gamma, random_state=random_state) clf_sgd = SGDOneClassSVM(nu=nu, shuffle=True, fit_intercept=True, random_state=random_state, tol=1e-4) pipe_sgd = make_pipeline(transform, clf_sgd) pipe_sgd.fit(X_train) y_pred_train_sgd = pipe_sgd.predict(X_train) y_pred_test_sgd = pipe_sgd.predict(X_test) y_pred_outliers_sgd = pipe_sgd.predict(X_outliers) n_error_train_sgd = y_pred_train_sgd[y_pred_train_sgd == -1].size n_error_test_sgd = y_pred_test_sgd[y_pred_test_sgd == -1].size n_error_outliers_sgd = y_pred_outliers_sgd[y_pred_outliers_sgd == 1].size Z_sgd = pipe_sgd.decision_function(np.c_[xx.ravel(), yy.ravel()]) Z_sgd = Z_sgd.reshape(xx.shape) # plot the level sets of the decision function plt.figure(figsize=(9, 6)) plt.title('One Class SVM')
# define outlier/anomaly detection methods to be compared. # the SGDOneClassSVM must be used in a pipeline with a kernel approximation # to give similar results to the OneClassSVM anomaly_algorithms = [ ("Robust covariance", EllipticEnvelope(contamination=outliers_fraction)), ("One-Class SVM", svm.OneClassSVM(nu=outliers_fraction, kernel="rbf", gamma=0.1)), ( "One-Class SVM (SGD)", make_pipeline( Nystroem(gamma=0.1, random_state=42, n_components=150), SGDOneClassSVM( nu=outliers_fraction, shuffle=True, fit_intercept=True, random_state=42, tol=1e-6, ), ), ), ( "Isolation Forest", IsolationForest(contamination=outliers_fraction, random_state=42), ), ( "Local Outlier Factor", LocalOutlierFactor(n_neighbors=35, contamination=outliers_fraction), ), ]
tstart = time() pipe_libsvm.fit(X_train) fit_time_libsvm += time() - tstart tstart = time() # scoring such that the lower, the more normal scoring = -pipe_libsvm.decision_function(X_test) predict_time_libsvm += time() - tstart fpr_libsvm_, tpr_libsvm_, _ = roc_curve(y_test, scoring) f_libsvm = interp1d(fpr_libsvm_, tpr_libsvm_) tpr_libsvm += f_libsvm(x_axis) print('----------- Online OCSVM ------------') nystroem = Nystroem(gamma=gamma, random_state=random_state) online_ocsvm = SGDOneClassSVM(nu=nu, random_state=random_state) pipe_online = make_pipeline(std, nystroem, online_ocsvm) tstart = time() pipe_online.fit(X_train) fit_time_online += time() - tstart tstart = time() # scoring such that the lower, the more normal scoring = -pipe_online.decision_function(X_test) predict_time_online += time() - tstart fpr_online_, tpr_online_, _ = roc_curve(y_test, scoring) f_online = interp1d(fpr_online_, tpr_online_) tpr_online += f_online(x_axis)