Używanie GridSearchCV z IsolationForest do znajdowania wartości odstających

10

Chcę użyć IsolationForestdo znalezienia wartości odstających. Chcę znaleźć najlepsze parametry dla modelu GridSearchCV. Problem polega na tym, że zawsze pojawia się ten sam błąd:

TypeError: If no scoring is specified, the estimator passed should have a 'score' method. The estimator IsolationForest(behaviour='old', bootstrap=False, contamination='legacy',
                max_features=1.0, max_samples='auto', n_estimators=100,
                n_jobs=None, random_state=None, verbose=0, warm_start=False) does not.

Wydaje się, że jest to problem, ponieważ IsolationForestnie ma scoremetody. Czy istnieje sposób, aby to naprawić? Czy jest też sposób na znalezienie wyniku dla lasu izolacji? To jest mój kod:

import pandas as pd
from sklearn.ensemble import IsolationForest
from sklearn.model_selection import GridSearchCV

df = pd.DataFrame({'first': [-112,0,1,28,5,6,3,5,4,2,7,5,1,3,2,2,5,2,42,84,13,43,13],
                   'second': [42,1,2,85,2,4,6,8,3,5,7,3,64,1,4,1,2,4,13,1,0,40,9],
                   'third': [3,4,7,74,3,8,2,4,7,1,53,6,5,5,59,0,5,12,65,4,3,4,11],
                   'result': [5,2,3,0.04,3,4,3,125,6,6,0.8,9,1,4,59,12,1,4,0,8,5,4,1]})

x = df.iloc[:,:-1]

tuned = {'n_estimators':[70,80,100,120,150,200], 'max_samples':['auto', 1,3,5,7,10],
         'contamination':['legacy', 'outo'], 'max_features':[1,2,3,4,5,6,7,8,9,10,13,15],
         'bootstrap':[True,False], 'n_jobs':[None,1,2,3,4,5,6,7,8,10,15,20,25,30], 'behaviour':['old', 'new'],
         'random_state':[None,1,5,10,42], 'verbose':[0,1,2,3,4,5,6,7,8,9,10], 'warm_start':[True,False]}

isolation_forest = GridSearchCV(IsolationForest(), tuned)

model = isolation_forest.fit(x)

list_of_val = [[1,35,3], [3,4,5], [1,4,66], [4,6,1], [135,5,0]]
df['outliers'] = model.predict(x)
df['outliers'] = df['outliers'].map({-1: 'outlier', 1: 'good'})

print(model.best_params_)
print(df)
taga
źródło
Jaki byłby twój wybór na wynik? Precyzja? MSE? Ponadto usuń cały kod, który pojawia się po zgłoszonym błędzie (nigdy nie jest wykonywany, dlatego nie ma znaczenia dla pytania - po prostu tworzy niepotrzebny bałagan).
desertnaut
Chcę wynik dokładności, usunąłem kod nieistotny dla pytania
taga

Odpowiedzi:

9

Musisz stworzyć własną funkcję oceniania, ponieważ IsolationForestnie ma scorewbudowanej metody. Zamiast tego możesz skorzystać z score_samplesfunkcji, która jest dostępna w IsolationForest(może być traktowana jako proxy dla score) i stworzyć własnego strzelca, jak opisano tutaj i przekazać go do GridSearchCV. Zmodyfikowałem twój kod, aby to zrobić:

import pandas as pd
import numpy as np
from sklearn.ensemble import IsolationForest
from sklearn.model_selection import GridSearchCV

df = pd.DataFrame({'first': [-112,0,1,28,5,6,3,5,4,2,7,5,1,3,2,2,5,2,42,84,13,43,13],
                   'second': [42,1,2,85,2,4,6,8,3,5,7,3,64,1,4,1,2,4,13,1,0,40,9],
                   'third': [3,4,7,74,3,8,2,4,7,1,53,6,5,5,59,0,5,12,65,4,3,4,11],
                   'result': [5,2,3,0.04,3,4,3,125,6,6,0.8,9,1,4,59,12,1,4,0,8,5,4,1]})

x = df.iloc[:,:-1]

tuned = {'n_estimators':[70,80], 'max_samples':['auto'],
     'contamination':['legacy'], 'max_features':[1],
     'bootstrap':[True], 'n_jobs':[None,1,2], 'behaviour':['old'],
     'random_state':[None,1,], 'verbose':[0,1,2], 'warm_start':[True]}  

def scorer_f(estimator, X):   #your own scorer
      return np.mean(estimator.score_samples(X))

#or you could use a lambda aexpression as shown below
#scorer = lambda est, data: np.mean(est.score_samples(data)) 

isolation_forest = GridSearchCV(IsolationForest(), tuned, scoring=scorer_f)
model = isolation_forest.fit(x)

PRZYKŁADOWA WYDAJNOŚĆ

print(model.best_params_)

{'behaviour': 'old',
 'bootstrap': True,
 'contamination': 'legacy',
 'max_features': 1,
 'max_samples': 'auto',
 'n_estimators': 70,
 'n_jobs': None,
 'random_state': None,
 'verbose': 1,
 'warm_start': True}

Mam nadzieję że to pomoże!

Parthasarathy Subburaj
źródło
Czy można to zrobić bez lambda?
taga
możesz zastąpić lambdawyrażenie funkcją jak pokazano powyżej.
Parthasarathy Subburaj
Dzięki przyjacielu, czy możesz mi pomóc z tym pytaniem? stackoverflow.com/questions/58214457/…
taga
-1

Uważam, że ocena odnosi się do obiektu GridSearchCV, a nie do IsolationForest.

Jeśli jest to „Brak” (domyślnie), spróbuje użyć oceny estymatorów, która jak twierdzisz nie istnieje. Spróbuj użyć jednego z dostępnych wskaźników oceny odpowiednich dla Twojego problemu w obiekcie GridSearchCV

ConorL
źródło
czy możesz opublikować kod, który to pokazuje? Twoje obecne rozwiązanie tego nie ma
ConorL
Problem polega na tym, że myślę, że Las Izolacji nie jest nadzorowany, więc nie ma sposobu, aby umieścić y_true i y_pred
taga