В чем разница между функцией решения и 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

В заключение, вы можете использовать их как взаимозаменяемые, поскольку они оба имеют одинаковые отношения с целью.

Другие вопросы по тегам