В чем разница между функцией решения и score_samples вolated_forest в SKLearn
Я прочитал документацию функции решения и score_samples здесь , но не мог понять, в чем разница между этими двумя методами и которые один я должен использовать для алгоритма обнаружения с выбросом.
Любая помощь будет оценена по достоинству.
3 ответа
См. Документацию по атрибуту:
Смещение, используемое для определения функции принятия решения из исходных оценок. У нас есть отношение:
. определяется следующим образом. Когда для параметра загрязнения установлено значение «auto», смещение равно -0,5, так как оценки выбросов близки к 0, а оценки выбросов близки к -1. Когда предоставляется параметр загрязнения, отличный от «auto», смещение определяется таким образом, чтобы мы получали ожидаемое количество выбросов (выборок с функцией принятия решения <0) в обучении.
Как было сказано ранее в ответе @ user10495893decision_function = score_samples - offset_
. Для дальнейшего уточнения...
- Если
contamination = 'auto'
, затем фиксируется на 0,5 - Если установлено значение, отличное от «авто», то
offset
больше не фиксируется.
Это можно увидеть в функции подгонки в исходном коде :
def fit(self, X, y=None, sample_weight=None):
...
if self.contamination == "auto":
# 0.5 plays a special role as described in the original paper.
# we take the opposite as we consider the opposite of their score.
self.offset_ = -0.5
return self
# else, define offset_ wrt contamination parameter
self.offset_ = np.percentile(self.score_samples(X),
100. * self.contamination)
Таким образом, важно обратить внимание на то, чтоcontamination
установлен, а также какие оценки аномалий вы используете.score_samples
возвращает то, что можно считать «сырыми» оценками, поскольку на них не влияет , тогда какdecision_function
зависит отoffset_
В Руководстве пользователя содержится ссылка на статью « Лес изоляции», написанную Фей Тони, Кай Мином и Чжи-Хуа.
Я не читал статью, но думаю, что вы можете использовать любой результат для обнаружения выбросов. В документации говорится
score_samples
противоположен
decision_function
, поэтому я подумал, что они будут обратно связаны, но оба выхода, похоже, имеют одинаковую связь с целью. Единственная разница в том, что они находятся на разных диапазонах. Фактически, они даже имеют одинаковую дисперсию.
Чтобы убедиться в этом, я подобрал модель к набору данных рака груди, доступному в sklearn, и визуализировал среднее значение целевой переменной, сгруппированное по децилям каждого вывода. Как видите, у них обоих одинаковые отношения.
# Import libraries
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import IsolationForest
# Load data
X = load_breast_cancer()['data']
y = load_breast_cancer()['target']
# Fit model
clf = IsolationForest()
clf.fit(X, y)
# Split the outputs into deciles to see their relationship with target
t['bins_decision_function'] = pd.qcut(t['decision_fn'], 10)
t['bins_score_samples'] = pd.qcut(t['score_samples'], 10)
t['target'] = y
# Visualize relationship
plt.plot(t.groupby('bins_decision_function')['target'].mean().values, lw=3, label='Decision Function')
plt.plot(t.groupby('bins_score_samples')['target'].mean().values, ls='--', label='Score Samples')
plt.legend()
plt.show()
Как я уже сказал, у них даже есть одинаковая дисперсия:
t[['decision_function','score_samples']].var()
> decision_function 0.003039
> score_samples 0.003039
> dtype: float64
В заключение, вы можете использовать их как взаимозаменяемые, поскольку они оба имеют одинаковые отношения с целью.