Python Класс HDBScan всегда терпит неудачу на второй итерации даже перед входом в первую функцию - PullRequest
1 голос
/ 20 июня 2020

Я пытаюсь просмотреть информацию о совокупных выбросах, используя несколько различных классов SKLearn, HDBScan и пользовательских классов обнаружения выбросов. Однако по какой-то причине я постоянно сталкиваюсь с ошибкой, когда любой класс, использующий HDBScan, не может быть повторен. Все остальные классы Sklearn и Custom могут. Проблема, с которой я сталкиваюсь, кажется, постоянно возникает на втором проходе класса HDBScan и мгновенно возникает при алгоритме .fit (tmp). После отладки скрипта кажется, что ошибка возникает еще до того, как дойдет до первой строки класса.

Помощь? Ниже приведен минимальный допустимый размер воспроизводства:

import numpy as np
import pandas as pd
import hdbscan
from sklearn.datasets import make_blobs
from sklearn.svm import OneClassSVM
from sklearn.ensemble import IsolationForest
from sklearn.covariance import EllipticEnvelope

class DBClass():

    def __init__(self, random = None):
        self.random = random

    def fit(self, data):

        self.train_data = data

        cluster = hdbscan.HDBSCAN()
        cluster.fit(self.train_data)
        self.fit = cluster

    def predict(self, data):

        self.predict_data = data

        if self.train_data.equals(self.predict_data):
            return self.fit.probabilities_  


def OutlierEnsemble(df, anomaly_algorithms = None, num_slices = 5, num_columns = 7, outliers_fraction = 0.05):

    if isinstance(df, np.ndarray):
        df = pd.DataFrame(df)

    assert isinstance(df, pd.DataFrame)

    if not anomaly_algorithms: 
        anomaly_algorithms = [
            ("Robust covariance",
                EllipticEnvelope(contamination=outliers_fraction)),
            ("One-Class SVM",
                OneClassSVM(nu=outliers_fraction,
                                kernel="rbf")),
            ("Isolation Forest",
                IsolationForest(contamination=outliers_fraction)),
            ("HDBScan LOF",
                DBClass()),
        ]

    data = []
    for i in range(1, num_slices + 1):
        data.append(df.sample(n = num_columns, axis = 1, replace = False))

    predictions = []
    names = []

    for tmp in data:
        counter = 0
        for name, algorithm in anomaly_algorithms:
            algorithm.fit(tmp)
            predictions.append(algorithm.predict(tmp))
            counter += 1
            names.append(f"{name}{counter}")


    return predictions

blobs, labels = make_blobs(n_samples=3000, n_features=12)
OutlierEnsemble(blobs)

Указанная ошибка не самая полезная.

Traceback (most recent call last):

  File "<ipython-input-4-e1d4b63cfccd>", line 75, in <module>
    OutlierEnsemble(blobs)

  File "<ipython-input-4-e1d4b63cfccd>", line 66, in OutlierEnsemble
    algorithm.fit(tmp)

TypeError: 'HDBSCAN' object is not callable

1 Ответ

1 голос
/ 22 июня 2020

В вашем DBClass.fit, DBClass.fit непреднамеренно переопределено.

Возможно, вы могли бы использовать что-то вроде

class DBClass():

    def __init__(self, random = None):
        self.random = random

    def fit(self, data):

        self.train_data = data

        cluster = hdbscan.HDBSCAN()
        cluster.fit(self.train_data)
        self.myfit = cluster   # save calculated cluster

    def predict(self, data):

        self.predict_data = data

        if self.train_data.equals(self.predict_data):
            return self.myfit.probabilities_  # use calculated cluster
...