Aykırı değerleri bulmak için IsolationForest ile GridSearchCV kullanma


10

IsolationForestAykırı değerleri bulmak için kullanmak istiyorum . Model için en iyi parametreleri bulmak istiyorum GridSearchCV. Sorun şu ki ben her zaman aynı hatayı alıyorum:

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.

Çünkü onun bir sorun gibi görünüyor IsolationForestyoktur scoreyöntemi. Bunu düzeltmenin bir yolu var mı? Ayrıca izolasyon ormanı için bir puan bulmak için bir yolu var mı? Bu benim kodum:

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)

Bir skor için seçiminiz ne olurdu ? Doğruluk? MSE? Ayrıca, lütfen bildirilen hatadan sonra gelen tüm kodu kaldırın (asla çalıştırılmaz, bu nedenle soru ile ilgisizdir - sadece gereksiz karışıklık yaratır).
desertnaut

Doğruluk puanı istiyorum, soru ile ilgisiz kodu kaldırdım
taga

Yanıtlar:


9

İçinde yöntem IsolationForestbulunmadığından kendi puanlama işlevinizi oluşturmanız gerekir score. Bunun yerine score_samples, içinde mevcut olan işlevden yararlanabilir IsolationForest(bunun için bir proxy olarak kabul edilebilir score) ve burada açıklandığı gibi kendi puanlayıcınızı oluşturabilir ve GridSearchCV. Bunu yapmak için kodunuzu değiştirdim:

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)

ÖRNEK ÇIKTI

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}

Bu yardımcı olur umarım!


Bunu olmadan yapmanın bir yolu var lambdamı?
taga

lambdaifadeyi yukarıda gösterildiği gibi bir işlevle değiştirebilirsiniz .
Parthasarathy Subburaj

Teşekkürler arkadaşım, lütfen bana bu soruda yardımcı olabilir misiniz? stackoverflow.com/questions/58214457/…
taga

-1

Puanlama, IsolationForest değil, GridSearchCV nesnesine atıfta olduğuna inanıyorum.

"Hiçbiri" ise (varsayılan), belirttiğiniz gibi mevcut olmayan tahmin edicileri puanlamayı kullanmaya çalışır. GridSearchCV nesnesinde sorununuza uygun olan mevcut puanlama metriklerinden birini kullanmayı deneyin


Bunu gösteren kodu gönderebilir misiniz? Mevcut çözümünüz buna sahip değil
ConorL

Sorun, Izolasyon Ormanı denetimsiz olduğunu düşünüyorum, bu yüzden y_true ve y_pred
taga
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.