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)

¿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!


¿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


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.