Verwenden von GridSearchCV mit IsolationForest zum Auffinden von Ausreißern

10

Ich möchte zum IsolationForestAuffinden von Ausreißern verwenden. Ich möchte die besten Parameter für das Modell mit finden GridSearchCV. Das Problem ist, dass ich immer den gleichen Fehler bekomme:

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.

Es scheint ein Problem zu sein, da IsolationForestes keine scoreMethode gibt. Gibt es eine Möglichkeit, dies zu beheben? Gibt es auch eine Möglichkeit, eine Punktzahl für den Isolationswald zu finden? Das ist mein Code:

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
quelle
Was wäre Ihre Wahl für eine Partitur? Richtigkeit? MSE? Entfernen Sie außerdem den gesamten Code, der nach dem gemeldeten Fehler auftritt (er wird nie ausgeführt und ist daher für die Frage irrelevant - er verursacht nur unnötige Unordnung).
Desertnaut
Ich möchte Genauigkeitsbewertung, ich habe Code entfernt, der für die Frage irrelevant ist
taga

Antworten:

9

Sie müssen Ihre eigene Bewertungsfunktion erstellen, da IsolationForestkeine scoreMethode integriert ist. Stattdessen können Sie die score_samplesFunktion verwenden, die in verfügbar ist IsolationForest(kann als Proxy für betrachtet werden score), Ihren eigenen Scorer erstellen, wie hier beschrieben , und ihn an die übergeben GridSearchCV. Ich habe Ihren Code dazu geändert:

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)

PROBENAUSGABE

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}

Hoffe das hilft!

Parthasarathy Subburaj
quelle
Und gibt es eine Möglichkeit, dies ohne zu tun lambda?
Taga
Sie können den lambdaAusdruck durch eine Funktion wie oben gezeigt ersetzen .
Parthasarathy Subburaj
Danke mein Freund, kannst du mir bitte bei dieser Frage helfen? stackoverflow.com/questions/58214457/…
taga
-1

Ich glaube, die Bewertung bezieht sich auf das GridSearchCV-Objekt und nicht auf das IsolationForest.

Wenn es "Keine" ist (Standard), wird versucht, die Schätzerbewertung zu verwenden, die, wie Sie angeben, nicht vorhanden ist. Versuchen Sie, eine der verfügbaren Bewertungsmetriken zu verwenden, die für Ihr Problem im GridSearchCV-Objekt geeignet sind

ConorL
quelle
Könntest du den Code posten, der dies zeigt? Ihre aktuelle Lösung hat dies nicht
ConorL
Das Problem ist, dass ich denke, dass Isolation Forest unbeaufsichtigt ist, so dass es keine Möglichkeit gibt, y_true und y_pred
taga