{"id":45770174,"url":"https://github.com/anaxagor/applybn","last_synced_at":"2026-02-26T05:02:44.466Z","repository":{"id":242550301,"uuid":"803918868","full_name":"Anaxagor/applybn","owner":"Anaxagor","description":"Multi-purpose data analysis framework based on Bayesian networks and Causal models","archived":false,"fork":false,"pushed_at":"2025-11-21T11:43:32.000Z","size":84568,"stargazers_count":22,"open_issues_count":6,"forks_count":4,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-11-21T13:19:51.688Z","etag":null,"topics":["bayesian-networks","causal-models","concept-analysis","feature-extraction","feature-selection","outlier-detection","oversampling","tabular-data","time-series"],"latest_commit_sha":null,"homepage":"https://anaxagor.github.io/applybn/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Anaxagor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-05-21T15:55:29.000Z","updated_at":"2025-11-21T11:43:12.000Z","dependencies_parsed_at":null,"dependency_job_id":"c8e0cb42-2b6a-4ec1-b27d-494eb1cac67c","html_url":"https://github.com/Anaxagor/applybn","commit_stats":null,"previous_names":["anaxagor/applybn"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Anaxagor/applybn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anaxagor%2Fapplybn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anaxagor%2Fapplybn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anaxagor%2Fapplybn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anaxagor%2Fapplybn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Anaxagor","download_url":"https://codeload.github.com/Anaxagor/applybn/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Anaxagor%2Fapplybn/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29849208,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T22:37:40.667Z","status":"online","status_checked_at":"2026-02-26T02:00:06.774Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bayesian-networks","causal-models","concept-analysis","feature-extraction","feature-selection","outlier-detection","oversampling","tabular-data","time-series"],"created_at":"2026-02-26T05:02:43.658Z","updated_at":"2026-02-26T05:02:44.458Z","avatar_url":"https://github.com/Anaxagor.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003ch1 align=\"center\"\u003eAPPLYBN\u003c/h1\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/license/Anaxagor/applybn?style=default\u0026logo=opensourceinitiative\u0026logoColor=white\u0026color=blue\" alt=\"license\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003eСоздано с помощью инструментов и технологий:\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/Python-3776AB.svg?style=default\u0026logo=Python\u0026logoColor=white\"alt=\"Python\"\u003e\n\t\u003cimg src=\"https://img.shields.io/badge/GitHub%20Actions-2088FF.svg?style=default\u0026logo=GitHub-Actions\u0026logoColor=white\"alt=\"GitHub%20Actions\"\u003e\n\u003c/p\u003e\n\u003cbr\u003e\n\napplybn — это многоцелевой фреймворк с открытым исходным кодом, основанный на байесовских сетях и каузальных моделях.\nОн представляет анализ данных, основанный на понятных и интерпретируемых алгоритмах байесовских сетей и каузальных моделей.\n![image](https://github.com/user-attachments/assets/996f8e5a-1742-4849-a64f-58b97a4cf17d)\n\n## Ключевые особенности\n### 1. **Обнаружение аномалий во временных рядах и табличных данных**\n#### **Табличные данные**\n   - Метод сочетает в себе обнаружение на основе условных распределений байесовской сети и оценку на основе близости.\n   - Метод позволяет выявлять как выбросы по плотности, так и выбросы, возникающие из-за нарушения зависимостей между признаками.\n#### **Временные ряды**\n   - Метод выявляет выбросы в многомерных временных рядах, используя динамические байесовские сети (DBN) для моделирования временных и межпеременных зависимостей.\n   - Его ключевые преимущества заключаются в улавливании сложных временных взаимозависимостей, автоматизации классификации выбросов с помощью адаптивных стратегий анализа оценок.\n### 2. **Генерация синтетических данных**\n   - Фреймворк включает методы для генерации синтетических обучающих данных при обнаружении дисбаланса классов в наборе данных. Используя гибридные байесовские сети (с моделями гауссовых смесей), он генерирует сбалансированные синтетические данные, улучшая результаты обучения моделей.\n   - Метод позволяет учитывать взаимодействия между переменными, что повышает качество синтетических данных.\n\n### 3. **Отбор и извлечение признаков**\n#### **Отбор признаков на основе причинно-следственного эффекта**\n   - Этот метод количественно оценивает причинно-следственные эффекты с помощью теории информации и пост-нелинейных моделей, автоматически выбирая признаки с ненулевым причинным влиянием на ключевые показатели эффективности (KPI) путем анализа снижения неопределенности в энтропии.\n   - Метод отличается интерпретируемостью и стабильностью, отдавая приоритет причинно-следственным связям, избегает ручной настройки пороговых значений и надежно работает даже с ограниченными или нелинейными промышленными данными, повышая надежность программных датчиков.\n#### **Отбор признаков на основе нормализованной взаимной информации**\n   - Метод сочетает отбор признаков с правилами Мика для выявления марковских покрытий, используя взаимную информацию для сохранения узлов со значительными зависимостями и отсеивания нерелевантных или избыточных признаков в байесовских сетях.\n   - Его ключевые преимущества включают эффективную обработку высокоразмерных данных за счет сосредоточения на локальных структурах, повышенную точность по сравнению с традиционными методами.\n#### **Извлечение признаков на основе байесовских сетей**\n   - Метод работает путем вывода условных зависимостей между признаками с использованием байесовских сетей и добавления вероятностных параметров (λ), представляющих эти зависимости, в исходный набор данных.\n   - Его преимущества включают повышенную точность классификации в различных областях, снижение зависимости от априорных знаний и низкую вычислительную сложность, что обеспечивает надежное и интерпретируемое обогащение признаков без ограничений, специфичных для предметной области.\n\n### 4. **Объяснимый анализ**\n#### **Причинно-следственный анализ для моделей машинного обучения**\n   - Метод анализа компонентов модели - строится структурная каузальная модель (SCM) для анализа моделей глубокого обучения, что позволяет отсеивать неважные части (например, фильтры в CNN) путем оценки их причинной важности.\n   - Метод объяснения влияния данных на прогнозы позволяет делать причинно-следственные выводы между признаками и показателями уверенности модели. Рассчитывая **средний причинный эффект (ACE)**, он помогает определить, какие признаки значительно влияют на неопределенность модели, предоставляя ценную информацию для улучшения или отладки моделей.\n\n### 5. **Совместимость со Scikit-learn**\nВсе оценщики и преобразователи данных совместимы со scikit-learn.\n## Направления прикладного использования\nНиже приведён обобщённый перечень направлений прикладного использования фреймворка applybn на основе его ключевых возможностей:\n\n### Обнаружение аномалий\n\n- Финансы и банковская сфера: выявление мошеннических транзакций и отклонений в поведении клиентов на основе табличных и временных данных.\n\n- Промышленный мониторинг и предиктивное обслуживание: раннее обнаружение отклонений в работе оборудования (например, датчиков на производственной линии) с учётом сложных временных зависимостей.\n\n- Кибербезопасность: детектирование нетипичных событий в логах и сетевом трафике, нарушений привычных зависимостей между признаками.\n\n### Генерация синтетических данных\n\n- Преодоление дисбаланса классов: дополнение малочисленных классов в датасете (например, при классификации редких заболеваний или редких отказов в оборудовании).\n\n- Конфиденциальность и защита персональных данных: создание «псевдо‑данных» для разработки и тестирования без утраты статистических свойств оригинала.\n\n### Отбор и извлечение признаков\n\n- Классификация и прогнозирование в бизнес-аналитике: автоматический выбор только причинно значимых факторов, влияющих на ключевые метрики (KPI), без ручной настройки порогов.\n\n- Биоинформатика и медицина: отбор генов или клинических маркёров на основе причинных эффектов и взаимной информации при ограниченных размерах выборки.\n\n- Рекомендательные системы: выявление наиболее релевантных факторов поведения пользователей для повышения качества рекомендаций.\n\n### Объяснимый анализ моделей (Explainable AI)\n\n- Debug и оптимизация нейронных сетей: анализ важности компонентов (фильтров, слоёв) через структурную каузальную модель, отсечение несущественных элементов.\n\n- Регулирование и отчётность: формализация вклада каждого признака в предсказание модели для соответствия требованиям «чёрного ящика» (например, в страховании или кредитовании).\n\n### Интеграция в ML‑конвейеры\n\n- Полная совместимость со Scikit‑learn: применение в пайплайнах вместе с другими пре- и пост‑обработчиками, перекрёстная валидация, grid‑search, имплементация в sklearn.Pipeline/imblearn.Pipeline.\n\n- Конвейеры для задач классификации: объединение этапов синтетической генерации, отбора признаков, ресемплинга и обучения модели в единую цепочку обработки.\n\n### Образовательные и исследовательские задачи\n\n- Курсы по машинному обучению, демонстрация работы байесовских сетей и динамических каузальных моделей (DBN).\n\n- Научные исследования в области каузального анализа: тестирование и сравнение методов отбора на основе причинно-следственных эффектов.\n\n## Технические требования\n\nOS: Linux/MacOS/Windows\nPython version: 3.11/3.12\n\nТребования к железу аналогичны требованиям Pytorch в зависимости от использования GPU/CPU/MPS.\n\n## Установка\n\n### Установка системных зависимостей\nПеред установкой applybn убедитесь, что у вас установлены системные зависимости.\n\n#### Linux\nДля этого обновите индексы репозиториев\n(это надо сделать обязательно, чтобы ставилась Java):\n\n```bash#\nsudo apt update\n```\n\nУстановите необходимые пакеты для cv2:\n\n```bash\nsudo apt install -y libgl1 libglib2.0-0 libsm6 libxext6 libxrender1 libgomp1 \n```\n\nУстановите Java (требуется для работы с временными рядами):\n\n```bash\nsudo apt install -y openjdk-21-jdk\n```\n\n#### Windows\n# Установить JDK 21\n```\nwinget install EclipseAdoptium.Temurin.21.JDK\n```\n\n# Обновить переменные окружения\n```shell\n$javaHome = \"C:\\Program Files\\Eclipse Adoptium\\jdk-21.0.2.13-hotspot\"\n[Environment]::SetEnvironmentVariable(\"JAVA_HOME\", $javaHome, \"Machine\")\n```\n\n# Перезапустить терминал и проверить\n```shell\njava -version\n```\n\n### pip\n\nЧтобы установить applybn с помощью pip, используйте следующую команду\n\n```\npip install applybn\n```\n\n### from source\n\nЧтобы начать работу с applybn, клонируйте репозиторий и установите необходимые зависимости.\n\n1. Установите менеджер пакетов [uv](https://github.com/astral-sh/uv)\n\n```bash\n# On macOS and Linux.\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n```\n\n```bash\n# On Windows.\npowershell -ExecutionPolicy ByPass -c \"irm https://astral.sh/uv/install.ps1 | iex\"\n```\n\n2. Клонируйте репозиторий и установите зависимости с помощью uv\n\n```bash\ngit clone https://github.com/Anaxagor/applybn.git\ncd applybn\nuv pip install -r pyproject.toml\n```\n\n2.1. Для запуска примеров установите проект в editable режиме\n\n```bash\nuv pip install -e .\n```\n\n3. (Опционально) Установите torch и torchvision с [официального сайта](https://pytorch.org/). Для использования torch \"^2.5.0\" на GPU необходима видеокарта с поддержкой CUDA 12. \n\n### Проблемы с установкой\nЕсли вы столкнулись с проблемами при установке, мы рекомендуем использовать контейнер Docker.\n\n#### Установка и работа в Docker\n1. Установите [Docker](https://docs.docker.com/get-docker/).\n2. Клонируйте репозиторий applybn:\n\n```bash\ngit clone https://github.com/Anaxagor/applybn\ncd applybn\n```\n3. Постройте Docker-образ:\n\n```bash\ndocker build -t applybn:latest .\n```\n\nНа Mac с чипом M1/M2 может потребоваться указать платформу:\n\n```bash\ndocker build --platform linux/amd64 -t applybn:latest .\n```\n\n4. Запустите контейнер:\n\n```bash\ndocker run --ipc=host -it --rm applybn:latest bash\n```\n\n5. Внутри контейнера вы можете запускать скрипты с примерами.\n\nОбратите внимание, пожалуйста, что вы должны находиться в директории `/app` внутри контейнера.\n\nОттуда вы можете запускать примеры, например:\n```bash\npoetry run python examples/anomaly_detection/tabular.py\n```\nИли:\n```bash\npoetry run pytest -s tests\n```\n\n## Пример конвейера Scikit-learn\n\nПример, демонстрирующий, как использовать несколько компонентов из библиотеки `applybn` в Pipeline, совместимом со scikit-learn. Мы рассмотрим отбор признаков, генерацию признаков, ресемплирование для несбалансированных наборов данных и обнаружение аномалий.\n\n```python\nimport pandas as pd\nimport numpy as np\nimport warnings\nimport logging\nimport sys\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import KBinsDiscretizer\nfrom imblearn.pipeline import Pipeline as ImbPipeline\nfrom sklearn.linear_model import LogisticRegression\nfrom applybn.feature_selection.ce_feature_selector import CausalFeatureSelector\nfrom applybn.feature_extraction.bn_feature_extractor import BNFeatureGenerator\nfrom applybn.imbalanced.over_sampling.bn_over_sampler import BNOverSampler\nfrom applybn.anomaly_detection.static_anomaly_detector.tabular_detector import TabularDetector\nwarnings.filterwarnings('ignore')\nlogging.getLogger().setLevel(logging.CRITICAL)\nlogging.disable(logging.CRITICAL)\nlogging.getLogger('applybn').setLevel(logging.CRITICAL)\nlogging.getLogger('applybn').disabled = True\nclass NullWriter:\n    def write(self, txt): pass\n    def flush(self): pass\noriginal_stderr = sys.stderr\nsys.stderr = NullWriter()\n\nclass CausalFeatureSelector2(CausalFeatureSelector):\n    def fit(self, X, y):\n        super().fit(X, y)\n        self.selected_features_mask_ = self.get_support()\n        return self\n        \n    def transform(self, X):\n        return X.iloc[:, self.selected_features_mask_]\n\ndef generate_example_data(n_samples=200, n_features=5, n_cat_features=2, target_name='target_class', imbalance_ratio=0.1, random_state=42):\n    \"\"\"Генерирует синтетический несбалансированный набор данных.\"\"\"\n    rng = np.random.RandomState(random_state)\n    X_cont_data = rng.rand(n_samples, n_features - n_cat_features)\n    cont_feature_names = [f'cont_feature_{j}' for j in range(n_features - n_cat_features)]\n    X_cont_df = pd.DataFrame(X_cont_data, columns=cont_feature_names)\n    \n    X_cat_df = pd.DataFrame()\n    for i in range(n_cat_features):\n        cat_feature_name = f'cat_feature_{i}'\n        temp_cont_for_cat = rng.rand(n_samples)\n        n_bins_cat = rng.randint(2, 4)\n        discretizer = KBinsDiscretizer(n_bins=n_bins_cat, encode='ordinal', strategy='uniform', subsample=None, random_state=rng)\n        # Сохраняем категориальные признаки как целые числа\n        X_cat_df[cat_feature_name] = discretizer.fit_transform(temp_cont_for_cat.reshape(-1, 1)).ravel().astype(int)\n    X_df = pd.concat([X_cont_df, X_cat_df], axis=1)\n    \n    n_class1 = int(n_samples * imbalance_ratio)\n    n_class0 = n_samples - n_class1\n    y_array = np.array([0] * n_class0 + [1] * n_class1)\n    rng.shuffle(y_array)\n    y_series = pd.Series(y_array, name=target_name, dtype=int)\n    return X_df, y_series\n\n# --- Основной пример ---\nTARGET_NAME = 'target_class_example'\n\n# 1. Генерация данных\nprint(\"1. Генерация синтетических данных...\")\nX_df, y_s = generate_example_data(n_samples=250, n_features=6, n_cat_features=2, target_name=TARGET_NAME, imbalance_ratio=0.15, random_state=42)\nX_train_df, X_test_df, y_train_s, y_test_s = train_test_split(X_df, y_s, test_size=0.3, random_state=42, stratify=y_s)\nprint(f\"   Обучающие данные: {X_train_df.shape}, Тестовые данные: {X_test_df.shape}\")\nprint(f\"   Распределение целевой переменной (обучение):\\n{y_train_s.value_counts(normalize=True).to_string()}\\n\")\n\n# 2. Обработка данных с обнаружением аномалий\nX_train_df = X_train_df.reset_index(drop=True)\ny_train_s = y_train_s.reset_index(drop=True)\nX_test_df = X_test_df.reset_index(drop=True)\ny_test_s = y_test_s.reset_index(drop=True)\ndetector = TabularDetector(target_name=TARGET_NAME, additional_score=\"IF\")\nX_train_df[TARGET_NAME] = y_train_s\ndetector.fit(X_train_df)\nscores = detector.predict_scores(X_train_df)\nthreshold = np.percentile(scores, 95)\nmask = scores \u003c= threshold # Выбираем 5% самых аномальных примеров\nX_train_df = X_train_df[mask]\ny_train_s = X_train_df[TARGET_NAME]\ny_train_s = y_train_s.reset_index(drop=True)\nX_train_df = X_train_df.drop(columns=[TARGET_NAME])\nX_train_df = X_train_df.reset_index(drop=True)\n\n# 3. Создание полного конвейера с отбором признаков, генерацией признаков, передискретизацией и классификацией\nprocessing_pipeline = ImbPipeline([\n    ('feature_selector', CausalFeatureSelector2(n_bins=3)),\n    ('bn_features', BNFeatureGenerator()),\n    ('oversampler', BNOverSampler(class_column=TARGET_NAME, strategy='max_class', shuffle=True)),\n    ('classifier', LogisticRegression(solver='liblinear', random_state=42))\n    \n])\n\n# 4. Обучение и оценка конвейера\nprint(\"\\n2. Обучение полного конвейера...\")\nprocessing_pipeline.fit(X_train_df, y_train_s)\npipeline_score = processing_pipeline.score(X_test_df, y_test_s)\nprint(f\"   Точность конвейера на тестовых данных: {pipeline_score:.4f}\\n\")\nprint(\"\\n--- Пример завершен ---\")\n```\n\n## Помощь и поддержка\n\n### Документация с примерами\n\nДокументацию с примерами можно найти [здесь](https://anaxagor.github.io/applybn/).\n\n### Связь\n\nНе стесняйтесь создавать новые [задачи](https://github.com/Anaxagor/applybn/issues).\n\nЕсли у вас есть вопросы или предложения, вы можете связаться с нами по следующим ресурсам:\n* [Helpdesk в чате Telegram](https://t.me/+4FOcyF0Rri00ZGEy)\n* ideeva@itmo.ru (Ирина Деева)\n\n### Участие в разработке\n\nВклад в applybn приветствуется! Если вы заинтересованы в улучшении каких-либо функций или тестировании новых веток, пожалуйста, ознакомьтесь с разделом [Как внести вклад](https://anaxagor.github.io/applybn/development/contributing/) документации.\n\n### Лицензия\n\napplybn распространяется под лицензией MIT. Дополнительную информацию см. в файле `LICENSE`.\n\n## Цитирование\n\n```bibtex\n@software{applybn,\n  author = {Irina Deeva},\n  title = {applybn},\n  url = {https://github.com/Anaxagor/applybn},\n  version = {0.1.0},\n  date = {2025-05-03},\n}\n```\n\n## Благодарности\nПроект поддержан [Фондом содействия инновациям](https://fasie.ru/). \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanaxagor%2Fapplybn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanaxagor%2Fapplybn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanaxagor%2Fapplybn/lists"}