Utilisation de GridSearchCV avec IsolationForest pour trouver des valeurs aberrantes


10

Je veux utiliser IsolationForestpour trouver des valeurs aberrantes. Je veux trouver les meilleurs paramètres pour le modèle avec GridSearchCV. Le problème est que j'obtiens toujours la même erreur:

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.

Il semble que ce soit un problème car il IsolationForestn'a pas de scoreméthode. Y'a t'il un moyen d'arranger cela? Existe-t-il également un moyen de trouver un score pour la forêt d'isolement? Voici mon 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)

Quel serait votre choix pour un score? Précision? MSE? En outre, veuillez supprimer tout le code qui vient après l'erreur signalée (il n'est jamais exécuté, donc sans rapport avec la question - il crée simplement un encombrement inutile).
desertnaut

Je veux un score de précision, j'ai supprimé le code sans rapport avec la question
taga

Réponses:


9

Vous devez créer votre propre fonction de notation car IsolationForestaucune scoreméthode n'est intégrée. Au lieu de cela, vous pouvez utiliser la score_samplesfonction disponible dans IsolationForest(peut être considérée comme un proxy pour score) et créer votre propre scoreur comme décrit ici et le transmettre auGridSearchCV . J'ai modifié votre code pour ce faire:

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)

EXEMPLE DE SORTIE

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}

J'espère que cela t'aides!


Et est-il possible de s'en passer lambda?
taga

vous pouvez remplacer l' lambdaexpression par une fonction comme indiqué ci-dessus.
Parthasarathy Subburaj

Merci mon ami, pouvez-vous m'aider à répondre à cette question? stackoverflow.com/questions/58214457/…
taga

-1

Je pense que le score fait référence à l'objet GridSearchCV, et non à IsolationForest.

S'il est "Aucun" (par défaut), il essaiera d'utiliser le score des estimateurs qui, comme vous le dites, n'existe pas. Essayez d'utiliser l'une des métriques de notation disponibles adaptées à votre problème dans l'objet GridSearchCV


pourriez-vous poster le code le montrant? Votre solution actuelle n'a pas cela
ConorL

Le problème est que je pense que la forêt d'isolement n'est pas supervisée, donc il n'y a aucun moyen de mettre y_true et y_pred
taga
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.