Sử dụng GridSearchCV với IsolationForest để tìm các ngoại lệ


10

Tôi muốn sử dụng IsolationForestđể tìm các ngoại lệ. Tôi muốn tìm các thông số tốt nhất cho mô hình với GridSearchCV. Vấn đề là tôi luôn nhận được cùng một lỗi:

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.

Có vẻ như đó là một vấn đề vì IsolationForestkhông có scorephương pháp. Có cách nào để sửa lỗi này? Ngoài ra có cách nào để tìm một điểm cho rừng cách ly? Đây là mã của tôi:

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)

Điều gì sẽ là sự lựa chọn của bạn cho một điểm số? Sự chính xác? MSE? Ngoài ra, vui lòng xóa tất cả mã xuất hiện sau lỗi được báo cáo (nó không bao giờ được thực thi, do đó không liên quan đến câu hỏi - nó chỉ tạo ra sự lộn xộn không cần thiết).
sa mạc

Tôi muốn điểm chính xác, tôi đã xóa mã không liên quan đến câu hỏi
taga

Câu trả lời:


9

Bạn cần tạo chức năng cho điểm của riêng mình vì IsolationForestkhông có scoresẵn phương thức. Thay vào đó, bạn có thể sử dụng score_sampleschức năng có sẵn IsolationForest(có thể được coi là proxy cho score) và tạo trình ghi điểm của riêng bạn như được mô tả ở đây và chuyển nó cho GridSearchCV. Tôi đã sửa đổi mã của bạn để làm điều này:

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)

MẪU ĐẦU RA

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}

Hi vọng điêu nay co ich!


Và có cách nào để làm điều này mà không có lambda?
taga

bạn có thể thay thế lambdabiểu thức bằng một hàm như hình trên.
Parthasarathy Subburaj

Cảm ơn bạn của tôi, bạn có thể vui lòng giúp tôi với câu hỏi này? stackoverflow.com/questions/58214457/ từ
taga

-1

Tôi tin rằng việc ghi điểm đang đề cập đến đối tượng GridSearchCV chứ không phải IsolationForest.

Nếu là "Không" (mặc định), nó sẽ cố gắng sử dụng tính năng ước tính cho điểm, như trạng thái của bạn không tồn tại. Hãy thử sử dụng một trong các số liệu chấm điểm khả dụng phù hợp với vấn đề của bạn trong đối tượng GridSearchCV


bạn có thể gửi mã cho thấy điều này? Giải pháp hiện tại của bạn không có điều này
ConorL

Vấn đề là tôi nghĩ rằng Rừng cách ly không được giám sát, vì vậy không có cách nào để đặt y_true và y_pred
taga
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.