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)
taga
la source
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!

Parthasarathy Subburaj
la source
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

ConorL
la source
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