Utilizzo di GridSearchCV con IsolationForest per trovare valori anomali


10

Voglio usare IsolationForestper trovare valori anomali. Voglio trovare i migliori parametri per il modello con GridSearchCV. Il problema è che ottengo sempre lo stesso errore:

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.

Sembra che sia un problema perché IsolationForestnon ha scoremetodo. C'è un modo per risolvere questo problema? C'è anche un modo per trovare un punteggio per la foresta di isolamento? Questo è il mio codice:

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)

Quale sarebbe la tua scelta per un punteggio? Precisione? MSE? Inoltre, rimuovi tutto il codice che viene dopo l'errore segnalato (non viene mai eseguito, quindi irrilevante per la domanda: crea solo disordine inutile).
Desertnaut

Voglio un punteggio di precisione, ho rimosso il codice irrilevante per la domanda
taga,

Risposte:


9

Devi creare la tua funzione di punteggio in quanto IsolationForestnon ha il scoremetodo integrato. Invece puoi usare la score_samplesfunzione che è disponibile in IsolationForest(può essere considerata un proxy per score) e creare il tuo marcatore come descritto qui e passarlo al GridSearchCV. Ho modificato il tuo codice per fare questo:

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)

USCITA DEL CAMPIONE

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}

Spero che sia di aiuto!


E c'è un modo per farlo senza lambda?
Taga,

potresti sostituire l' lambdaespressione con una funzione come mostrato sopra.
Parthasarathy Subburaj,

Grazie amico mio, puoi aiutarmi per favore con questa domanda? stackoverflow.com/questions/58214457/...
Taga

-1

Credo che il punteggio si riferisca all'oggetto GridSearchCV e non all'isolamento.

Se è "Nessuno" (impostazione predefinita), tenterà di utilizzare il punteggio degli stimatori, che come si afferma non esiste. Prova a utilizzare una delle metriche di punteggio disponibili adatte al tuo problema all'interno dell'oggetto GridSearchCV


potresti pubblicare il codice che mostra questo? La tua soluzione attuale non ha questo
ConorL

Il problema è che penso che Isolation Forest sia incustodito, quindi non c'è modo di mettere y_true e y_pred
taga,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.