Оценщики, конвейеры и байесовские сети (продвинутый уровень)¶
Обзор¶
Оценщики предоставляют универсальную обертку для bamt в формате, совместимом с sklearn, что позволяет разработчикам беспрепятственно работать с байесовскими сетями. Цель состоит в реализации гибких интерфейсов оценщиков.
Фреймворк applybn следует этой структуре:
Байесовские сети (Ядро: bamt)
|
↓
Оценщики BN (Обертка для сетей bamt) [Уровень разработчика]
|
↓
Конвейеры (Интерфейс applybn для bamt) [Уровень пользователя]
Байесовские сети¶
В bamt существует три типа сетей:
HybridBNContinuousBNDiscreteBN
Кроме того, bamt может автоматически определять типы данных.
Поддерживаемые типы данных:¶
# Дискретные типы
categorical_types = ["str", "O", "b", "categorical", "object", "bool"]
# Дискретные числовые типы
integer_types = ["int32", "int64"]
# Непрерывные типы
float_types = ["float32", "float64"]
Danger
Пожалуйста, не используйте этот уровень, если в этом нет необходимости.
Оценщики¶
Оценщики предназначены для разработчиков и наследуются от sklearn.BaseEstimator.
Определение типа BN¶
Используйте этот статический метод для определения bn_type на основе пользовательских данных:
Метод Fit¶
estimator = BNEstimator()
data = pd.read_csv(DATA_PATH)
descriptor = {"types": {...}, "signs": {...}}
preprocessed_data = preprocessor([...]).apply(data)
fit_package = (preprocessed_data, descriptor, data)
estimator.fit(fit_package)
Обучение структуры и параметров (partial=False, по умолчанию)¶
Низкоуровневый подход:¶
bn = HybridBN(use_mixture=False, has_logit=True) # Может быть любой тип сети
bn.add_nodes(descriptor)
bn.add_edges(X, scoring_function=("MI", ))
bn.fit_parameters(clean_data)
Использование applybn:¶
estimator = BNEstimator(use_mixture=False, has_logit=True,
learning_params={"scoring_function": ("MI", )})
<...>
estimator.fit(fit_package)
Обучение только структуры (partial="structure")¶
Низкоуровневый подход:¶
Использование applybn:¶
Обучение только параметров (partial="parameters")¶
Note
Этот метод требует предварительно обученной структуры. Если estimator.bn_ не установлен или estimator.bn_.edges пуст, будет вызвано исключение NotFittedError.
Низкоуровневый подход:¶
Использование applybn:¶
Настройка оценщиков¶
Вы можете создавать собственные оценщики с помощью метапрограммирования и наследования:
from applybn.core.estimators.estimator_factory import EstimatorPipelineFactory
import inspect
factory = EstimatorPipelineFactory(task_type="classification")
estimator_with_default_interface = factory.estimator.__class__
class StaticEstimator(estimator_with_default_interface):
def __init__(self):
pass
my_estimator = StaticEstimator()
print(*inspect.getmembers(my_estimator), sep="\n") # Проверка доступных методов
Стратегия делегирования¶
Если метод неизвестен BNEstimator, он будет делегирован self.bn_. Если bn_ не установлен, будет вызвано исключение NotFittedError или AttributeError.
Конвейеры¶
Конвейеры объединяют bamt_preprocessor и BNEstimator. Вы можете заменить препроцессор любым трансформером, совместимым с scikit-learn.
Конвейеры следуют паттерну фабрики, что означает, что любой вызов getattr делегируется последнему шагу конвейера (обычно BNEstimator).
Инициализация фабрики¶
Укажите тип задачи (классификация или регрессия) при инициализации:
import pandas as pd
from applybn.core.estimators.estimator_factory import EstimatorPipelineFactory
X = pd.read_csv(DATA_PATH)
# y = X.pop("anomaly") # Извлечение целевой переменной, если необходимо
factory = EstimatorPipelineFactory(task_type="classification")
Создание конвейера¶
# Конвейер с препроцессором по умолчанию
pipeline = factory()
# Конвейер с пользовательским препроцессором
# pipeline = factory(preprocessor)
pipeline.fit(X)
Управление атрибутами конвейера¶
Чтобы сначала обучить структуру, выполнить промежуточные шаги, а затем обучить параметры:
# Обучение структуры с использованием функции оценки MI
pipeline = factory(partial="structure", learning_params={"scoring_function": "MI"})
pipeline.fit(X)
# Промежуточные шаги обработки
<...>
# Обучение параметров
pipeline.set_params(bn_estimator__partial="parameters")
pipeline.fit(X)
print(pipeline.bn_.edges)
Установка параметров¶
Компоненты фабрики конвейера структурированы следующим образом:
Чтобы изменить атрибуты препроцессора:Tip
Параметры могут быть установлены во время инициализации или после создания конвейера.
Стратегия делегирования¶
Методы конвейера делегируют вызовы последнему шагу (BNEstimator).
factory = EstimatorPipelineFactory(task_type="classification")
pipeline = factory()
pipeline.fit(X)
pipeline.get_info(as_df=False)
pipeline.save("mybn")
Создание пользовательских препроцессоров¶
Чтобы создать пользовательский препроцессор, убедитесь, что он совместим с scikit-learn, унаследовав от BaseEstimator и TransformerMixin.