Uso de GridSearchCV con IsolationForest para encontrar valores atípicos

10

Quiero usar IsolationForestpara encontrar valores atípicos. Quiero encontrar los mejores parámetros para el modelo con GridSearchCV. El problema es que siempre recibo el mismo error:

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.

Parece que es un problema porque IsolationForestno tiene scoremétodo. ¿Hay alguna manera de arreglar esto? ¿También hay una manera de encontrar una puntuación para el bosque de aislamiento? Este es mi código:

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
fuente
¿Cuál sería tu elección para un puntaje? ¿Exactitud? MSE? Además, elimine todo el código que viene después del error informado (nunca se ejecuta, por lo tanto, es irrelevante para la pregunta, solo crea un desorden innecesario).
desertnaut
Quiero puntaje de precisión, he eliminado el código irrelevante para la pregunta
taga

Respuestas:

9

Necesita crear su propia función de puntuación ya IsolationForestque no tiene un scoremétodo incorporado. En su lugar, puede hacer uso de la score_samplesfunción que está disponible en IsolationForest(puede considerarse como un proxy para score) y crear su propio anotador como se describe aquí y pasarlo al GridSearchCV. He modificado tu código para hacer esto:

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)

SALIDA DE MUESTRA

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}

¡Espero que esto ayude!

Parthasarathy Subburaj
fuente
¿Y hay una manera de hacer esto sin lambda?
taga
podría reemplazar la lambdaexpresión con una función como se muestra arriba.
Parthasarathy Subburaj
Gracias amigo mío, ¿puedes ayudarme con esta pregunta? stackoverflow.com/questions/58214457/…
taga
-1

Creo que la puntuación se refiere al objeto GridSearchCV, y no al IsolationForest.

Si es "Ninguno" (predeterminado) intentará utilizar la puntuación de los estimadores, que como usted dice no existe. Intente utilizar una de las métricas de puntuación disponibles adecuadas para su problema dentro del objeto GridSearchCV

ConorL
fuente
¿podrías publicar el código que muestra esto? Su solución actual no tiene esto
ConorL
El problema es que creo que Isolation Forest no está supervisado, por lo que no hay forma de poner y_true y y_pred
taga el