Menggunakan GridSearchCV dengan IsolationForest untuk mencari outlier

10

Saya ingin menggunakan IsolationForestuntuk mencari outlier. Saya ingin mencari parameter terbaik untuk model GridSearchCV. Masalahnya adalah saya selalu mendapatkan kesalahan yang sama:

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.

Sepertinya ini masalah karena IsolationForesttidak punya scoremetode. Apakah ada cara untuk memperbaikinya? Juga adakah cara untuk menemukan skor untuk hutan isolasi? Ini kode saya:

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
sumber
Apa yang akan menjadi pilihan Anda untuk skor? Ketepatan? MSE? Selain itu, harap hapus semua kode yang muncul setelah kesalahan yang dilaporkan (tidak pernah dieksekusi, karenanya tidak relevan dengan pertanyaan - itu hanya menciptakan kekacauan yang tidak perlu).
desertnaut
Saya ingin skor akurasi, saya telah menghapus kode yang tidak relevan dengan pertanyaan
taga

Jawaban:

9

Anda perlu membuat fungsi penilaian sendiri karena IsolationForesttidak memiliki scoremetode inbuilt. Alih-alih, Anda dapat menggunakan score_samplesfungsi yang tersedia di IsolationForest(dapat dianggap sebagai proxy untuk score) dan membuat skor Anda sendiri seperti yang dijelaskan di sini dan meneruskannya ke GridSearchCV. Saya telah memodifikasi kode Anda untuk melakukan ini:

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)

OUTPUT SAMPEL

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}

Semoga ini membantu!

Parthasarathy Subburaj
sumber
Dan adakah cara untuk melakukan ini tanpa lambda?
taga
Anda bisa mengganti lambdaekspresi dengan fungsi seperti yang ditunjukkan di atas.
Parthasarathy Subburaj
Terima kasih teman saya, bisakah Anda membantu saya dengan pertanyaan ini? stackoverflow.com/questions/58214457/...
taga
-1

Saya percaya penilaian mengacu pada objek GridSearchCV, dan bukan IsolationForest.

Jika "Tidak Ada" (default) akan mencoba menggunakan penaksir penilaian, yang seperti yang Anda nyatakan tidak ada. Coba gunakan salah satu metrik penilaian yang tersedia yang sesuai dengan masalah Anda dalam objek GridSearchCV

ConorL
sumber
bisakah Anda memposting kode yang menunjukkan ini? Solusi Anda saat ini tidak memiliki ini
ConorL
Masalahnya adalah saya berpikir bahwa Isolation Forest tidak diawasi, jadi tidak ada cara untuk meletakkan y_true dan y_pred
taga