ใช้ GridSearchCV กับ IsolationForest เพื่อค้นหาค่าผิดปกติ


10

ฉันต้องการใช้IsolationForestสำหรับการค้นหาค่าผิดปกติ GridSearchCVฉันต้องการที่จะหาพารามิเตอร์ที่ดีที่สุดสำหรับรูปแบบด้วย ปัญหาคือฉันมักจะได้รับข้อผิดพลาดเดียวกัน:

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.

ดูเหมือนว่าปัญหาเพราะIsolationForestไม่มีscoreวิธี มีวิธีแก้ไขปัญหานี้หรือไม่? นอกจากนี้ยังมีวิธีการหาคะแนนสำหรับป่าแยกหรือไม่ นี่คือรหัสของฉัน:

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)

สิ่งที่คุณจะเลือกสำหรับคะแนน? ความถูกต้อง? MSE? นอกจากนี้โปรดลบรหัสทั้งหมดที่เกิดขึ้นหลังจากข้อผิดพลาดที่รายงาน (ไม่เคยถูกเรียกใช้งานดังนั้นจึงไม่เกี่ยวข้องกับคำถาม - เพียงแค่สร้างความยุ่งเหยิงที่ไม่จำเป็น)
desertnaut

ฉันต้องการคะแนนความถูกต้องฉันได้ลบรหัสที่ไม่เกี่ยวข้องกับคำถามออก
taga

คำตอบ:


9

คุณต้องสร้างฟังก์ชั่นการให้คะแนนของคุณเองเนื่องจากIsolationForestไม่มีscoreเมธอดในตัว แต่คุณสามารถทำให้การใช้งานของscore_samplesฟังก์ชั่นที่มีอยู่ในIsolationForest(ถือได้ว่าเป็นพร็อกซี่สำหรับscore) และสร้างแต้มของคุณเองตามที่อธิบายไว้ที่นี่GridSearchCVและผ่านมันไป ฉันได้แก้ไขรหัสของคุณเพื่อทำสิ่งนี้:

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)

ตัวอย่างผลลัพธ์

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}

หวังว่านี่จะช่วยได้!


และมีวิธีการทำเช่นนี้โดยไม่lambda?
taga

คุณสามารถแทนที่lambdaนิพจน์ด้วยฟังก์ชันตามที่แสดงไว้ด้านบน
Parthasarathy Subburaj

ขอบคุณเพื่อนของฉันคุณช่วยฉันด้วยคำถามนี้ได้ไหม stackoverflow.com/questions/58214457/…
taga

-1

ฉันเชื่อว่าการให้คะแนนนั้นอ้างถึงวัตถุ GridSearchCV ไม่ใช่เป็น IsolationForest

หากเป็น "ไม่มี" (ค่าเริ่มต้น) จะพยายามใช้การประมาณค่าการให้คะแนนซึ่งตามที่คุณระบุไม่มีอยู่ ลองใช้หนึ่งในตัวชี้วัดการให้คะแนนที่เหมาะสมกับปัญหาของคุณภายในวัตถุ GridSearchCV


คุณสามารถโพสต์รหัสที่แสดงสิ่งนี้ได้ไหม โซลูชันปัจจุบันของคุณไม่มีสิ่งนี้
ConorL

ปัญหาคือฉันคิดว่า Isolation Forest ไม่ได้รับการดูแลดังนั้นจึงไม่มีวิธีที่จะวาง y_true และ y_pred
taga
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.