1.ГОСТ Р 59525–2021. Информатизация здоровья. Интеллектуальные методы обработки медицинских данных. Основные положения. – Введ. 01.01.2022. – М. : Стандартинформ, 2021. – 24 с.
ГОСТ Р 59921.0–2022. Системы искусственного интеллекта в клинической медицине. Основные положения. – Введ. 01.01.2023. – М. : Стандартинформ, 2022. – 20 с.
ГОСТ Р 59921.1–2022. Системы искусственного интеллекта в клинической медицине. Часть 1. Клиническая оценка. – Введ. 01.09.2022. – М. : Стандартинформ, 2022. – 28 с.
ГОСТ Р 59921.4–2021. Системы искусственного интеллекта в клинической медицине. Часть 4. Оценка и контроль эксплуатационных параметров. – Введ. 01.01.2022. – М. : Стандартинформ, 2021. – 32 с.
ГОСТ Р 71671–2024. Системы поддержки принятия врачебных решений с применением искусственного интеллекта. Основные положения. – Введ. 01.01.2025. – М. : Стандартинформ, 2024. – 30 с.
ГОСТ Р 71737–2024. Системы искусственного интеллекта в здравоохранении. Применение менеджмента риска к медицинским изделиям. Общие положения. – Введ. 2025. – М. : Стандартинформ, 2024. – 40 с.
ГОСТ Р 59847–2021 (ИСО 11616:2017). Информатизация здоровья. Идентификация лекарственных средств для медицинского применения. Элементы и структуры данных для уникальной идентификации и обмена фармацевтической информацией. – Введ. 01.04.2022. – М. : Стандартинформ, 2021.
ГОСТ Р 71476–2024 (ИСО/МЭК 22989:2022). Информационные технологии. Искусственный интеллект. Концепции и терминология. – Введ. 2025. – М. : Стандартинформ, 2024.
Абдуллаев Н. Т. Нечеткая логическая система для повышения точности медицинской диагностики заболеваний желудочно-кишечного тракта [Электронный ресурс] // Вестник инновационных технологий. – 2021. – Режим доступа: vit-j.ru.
Гермашев И. В., Дубовская В. И. Применение моделей нечеткой логики в задачах медицинской диагностики [Электронный ресурс] // Вестник ВГУ. Серия: Математика. Физика. – 2021. – Режим доступа: MathNet.
ИИ в медицине 2025: как нейросети диагностируют, лечат и спасают жизни [Электронный ресурс]. – 2025. – Режим доступа: aimarketwave.com.
Нечеткая модель оценки качества управления персоналом медицинской организации [Электронный ресурс] // Electronic Data Research Journal. – 2024. – Режим доступа: edrj.ru.
Прогностический алгоритм ранней диагностики сердечно-сосудистых осложнений на основе нечеткой логики [Электронный ресурс] // Российский кардиологический журнал. – 2020. – Режим доступа: russjcardiol.elpub.ru.
Родионова Л. Н. Интеллектуальные методы принятия решений в условиях неопределённости [Электронный ресурс] // Системы и информационные технологии. – 2025. – Режим доступа: siit.ugatu.su.
Ходашинский И. А. Fuzzy classifiers in cardiovascular disease diagnostics: Review [Электронный ресурс] // Journal of Advanced Research in Dynamical and Control Systems. – 2020. – Режим доступа: ResearchGate.
Zhou S. K., Greenspan H., Davatzikos C. et al. A review of deep learning in medical imaging: imaging traits, technology trends, case studies with progress highlights, and future promises [Электронный ресурс]. – 2020. – Режим доступа: arXiv:2008.09104.
Xia Q., Li J., Zhang Y. et al. A comprehensive review of deep learning for medical image processing [Электронный ресурс]. – 2025. – Neurocomputing. – Режим доступа: ScienceDirect.
Mienye I. D. Deep Convolutional Neural Networks in Medical Image Analysis: A Review [Электронный ресурс]. – 2025. – Information. – Режим доступа: MDPI.
Xia Z., Sadeghi Z., et al. A review of Explainable Artificial Intelligence in healthcare [Электронный ресурс]. – 2024. – Computers in Biology and Medicine. – Режим доступа: ScienceDirect.
Explainable Artificial Intelligence for Medical Applications: A Review [Электронный ресурс] // ACM Computing Surveys. – 2024. – Режим доступа: ACM Digital Library.
Johannssen A., et al. The crucial role of explainable artificial intelligence (XAI) in health care management systems [Электронный ресурс]. – 2025. – Режим доступа: PubMed Central.
Xu Z., et al. Addressing fairness issues in deep learning-based medical imaging [Электронный ресурс]. – 2024. – npj Digital Medicine. – Режим доступа: Nature.
Nambison N. K., et al. Pathology Report Interpretation and Disease Diagnosis Using Fuzzy Logic-based Systems [Электронный ресурс]. – 2024. – Режим доступа: PubMed Central.
Mjahad A., et al. Combining Deep Learning Architectures with Fuzzy Logic for the Detection of Pneumonia in Chest X-ray Images [Электронный ресурс]. – 2025. – Applied Sciences. – Режим доступа: MDPI.
Rashed B. M., et al. Medical Image-Based Diagnosis Using a Hybrid Adaptive Neuro-Fuzzy Inference System [Электронный ресурс]. – 2024. – Mathematics. – Режим доступа: MDPI.
Zacarias-Morales N., et al. Artificial Neural Network, Attention Mechanism and Fuzzy Logic for Medical Diagnostic Support: A Systematic Review [Электронный ресурс]. – 2025. – Diagnostics (или др. журнал MDPI). – Режим доступа: MDPI.
Kiremit B. Y., et al. A comparative study of neuro-fuzzy and neural network models for healthcare services [Электронный ресурс]. – 2025. – BMC Health Services Research. – Режим доступа: журнал BMC.
Adedeji P. Neuro-fuzzy deep hybrid frameworks for multi-disease medical diagnosis [Электронный ресурс]. – 2022. – Режим доступа: ResearchGate.
Hybrid deep neuro-fuzzy models for multi-disease medical classification [Электронный ресурс]. – 2023. – Режим доступа: ResearchGate.
Bodyanskiy Y., et al. Adaptive Probabilistic Neuro-Fuzzy System and its Hybrid Modifications for Medical Diagnosis [Электронный ресурс]. – 2021. – Procedia Computer Science. – Режим доступа: ScienceDirect.
Fuzzy Sets-Based Approaches for Improved Medical Diagnosis [Электронный ресурс]. – 2025. – ACM Computing Surveys. – Режим доступа: ACM Digital Library.
Fuzzy Logic-based Systems for Medical Diagnosis – A Review [Электронный ресурс]. – 2025. – Режим доступа: ResearchGate.
Attarilar Z., et al. Application of fuzzy logic and systems in COVID-19 diagnosis and management: a systematic review [Электронный ресурс]. – 2025. – Режим доступа: Springer.
Band S. S., et al. Application of explainable artificial intelligence in medical health: a systematic review of interpretability methods [Электронный ресурс] // Informatics in Medicine Unlocked. – 2023. – Режим доступа: ScienceDirect.
Deep Learning in Medical Imaging: A Review [Электронный ресурс]. – 2022. – Режим доступа: ResearchGate / PubMed.
Приложение
Ключевые метрики:
AUC (Area Under Curve): Площадь под кривой ROC. Чем ближе к 1, тем лучше модель.
Идеальная модель: AUC = 1 (кривая проходит через верхний левый угол)
Случайная модель: AUC = 0.5 (диагональная линия)
1. Создание нескольких ROC-кривых для сравнения моделей
python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.metrics import roc_curve, auc, roc_auc_score
from sklearn.preprocessing import label_binarize
import warnings
warnings.filterwarnings('ignore')
# Создаем синтетические данные
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2,
n_informative=10, random_state=42, weights=[0.7, 0.3])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# Обучаем несколько моделей
models = {
'Логистическая регрессия': LogisticRegression(max_iter=1000, random_state=42),
'Случайный лес': RandomForestClassifier(n_estimators=100, random_state=42),
'Метод опорных векторов': SVC(probability=True, random_state=42)
}
# Создаем график
plt.figure(figsize=(12, 8))
plt.plot([0, 1], [0, 1], 'k--', alpha=0.6, label='Случайный классификатор (AUC = 0.5)')
# Для каждой модели вычисляем ROC-кривую
for name, model in models.items():
model.fit(X_train, y_train)
# Получаем вероятности для положительного класса
if hasattr(model, "predict_proba"):
y_proba = model.predict_proba(X_test)[:, 1]
else:
y_proba = model.decision_function(X_test)
y_proba = (y_proba - y_proba.min()) / (y_proba.max() - y_proba.min())
# Вычисляем ROC-кривую
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
roc_auc = auc(fpr, tpr)
# Рисуем кривую
plt.plot(fpr, tpr, lw=2, label=f'{name} (AUC = {roc_auc:.3f})')
# Настраиваем график
plt.xlim([-0.01, 1.01])
plt.ylim([-0.01, 1.01])
plt.xlabel('False Positive Rate (FPR)', fontsize=12)
plt.ylabel('True Positive Rate (TPR) / Recall', fontsize=12)
plt.title('Сравнение ROC-кривых различных моделей', fontsize=14, fontweight='bold')
plt.legend(loc='lower right', fontsize=11)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
2. Подробная ROC-кривая с дополнительной информацией
python
from sklearn.metrics import confusion_matrix
import seaborn as sns
# Обучаем конкретную модель
model = LogisticRegression(max_iter=1000, random_state=42)
model.fit(X_train, y_train)
y_proba = model.predict_proba(X_test)[:, 1]
# Вычисляем ROC-кривую
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
roc_auc = auc(fpr, tpr)
# Находим оптимальный порог (ближайший к верхнему левому углу)
distances = (fpr - 0)**2 + (tpr - 1)**2
optimal_idx = np.argmin(distances)
optimal_threshold = thresholds[optimal_idx]
# Создаем график с дополнительными элементами
fig, axes = plt.subplots(1, 2, figsize=(15, 6))
# 1. Основная ROC-кривая
ax1 = axes[0]
ax1.plot(fpr, tpr, 'b-', lw=2, label=f'ROC-кривая (AUC = {roc_auc:.3f})')
ax1.plot([0, 1], [0, 1], 'k--', alpha=0.6, label='Случайный классификатор')
ax1.scatter(fpr[optimal_idx], tpr[optimal_idx], color='red', s=100,
label=f'Оптимальная точка\nПорог = {optimal_threshold:.3f}\nFPR = {fpr[optimal_idx]:.3f}, TPR = {tpr[optimal_idx]:.3f}')
ax1.fill_between(fpr, tpr, alpha=0.1, color='blue')
# Линии к оптимальной точке
ax1.plot([fpr[optimal_idx], fpr[optimal_idx]], [0, tpr[optimal_idx]], 'r--', alpha=0.5)
ax1.plot([0, fpr[optimal_idx]], [tpr[optimal_idx], tpr[optimal_idx]], 'r--', alpha=0.5)
ax1.set_xlim([-0.01, 1.01])
ax1.set_ylim([-0.01, 1.01])
ax1.set_xlabel('False Positive Rate (FPR)', fontsize=12)
ax1.set_ylabel('True Positive Rate (TPR) / Recall', fontsize=12)
ax1.set_title('ROC-кривая с оптимальной точкой', fontsize=14, fontweight='bold')
ax1.legend(loc='lower right', fontsize=10)
ax1.grid(True, alpha=0.3)
# 2. Матрица ошибок для оптимального порога
ax2 = axes[1]
y_pred_optimal = (y_proba >= optimal_threshold).astype(int)
cm = confusion_matrix(y_test, y_pred_optimal)
# Визуализируем матрицу ошибок
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False, ax=ax2,
xticklabels=['Предсказан 0', 'Предсказан 1'],
yticklabels=['Истинный 0', 'Истинный 1'])
ax2.set_title(f'Матрица ошибок при пороге = {optimal_threshold:.3f}', fontsize=14, fontweight='bold')
ax2.set_xlabel('Предсказанный класс', fontsize=12)
ax2.set_ylabel('Истинный класс', fontsize=12)
# Добавляем метрики на график
tn, fp, fn, tp = cm.ravel()
accuracy = (tp + tn) / (tp + tn + fp + fn)
precision = tp / (tp + fp) if (tp + fp) > 0 else 0
recall = tp / (tp + fn) # TPR
metrics_text = f'Accuracy: {accuracy:.3f}\nPrecision: {precision:.3f}\nRecall (TPR): {recall:.3f}\nFPR: {fp/(fp+tn):.3f}'
ax2.text(2.5, 0.5, metrics_text, fontsize=11, verticalalignment='center',
bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
plt.tight_layout()
plt.show()
# Выводим таблицу с порогами
print("Пример порогов и соответствующих метрик:")
print("-" * 60)
print(f"{'Порог':<10} {'TPR':<8} {'FPR':<8} {'Precision':<12} {'F1-Score':<10}")
print("-" * 60)
for i in range(0, len(thresholds), len(thresholds)//10):
thresh = thresholds[i]
y_pred_thresh = (y_proba >= thresh).astype(int)
tn, fp, fn, tp = confusion_matrix(y_test, y_pred_thresh).ravel()
tpr_val = tp / (tp + fn) if (tp + fn) > 0 else 0
fpr_val = fp / (fp + tn) if (fp + tn) > 0 else 0
precision_val = tp / (tp + fp) if (tp + fp) > 0 else 0
f1_val = 2 * (precision_val * tpr_val) / (precision_val + tpr_val) if (precision_val + tpr_val) > 0 else 0
print(f"{thresh:<10.3f} {tpr_val:<8.3f} {fpr_val:<8.3f} {precision_val:<12.3f} {f1_val:<10.3f}")
3. ROC-кривые для многоклассовой классификации
python
# Создаем многоклассовые данные
X_multi, y_multi = make_classification(n_samples=1000, n_features=20, n_classes=3,
n_informative=10, random_state=42)
X_train_m, X_test_m, y_train_m, y_test_m = train_test_split(X_multi, y_multi, test_size=0.3, random_state=42)
# Бинаризуем метки для многоклассового случая
y_test_bin = label_binarize(y_test_m, classes=[0, 1, 2])
n_classes = y_test_bin.shape[1]
# Обучаем модель
model_multi = LogisticRegression(max_iter=1000, random_state=42)
model_multi.fit(X_train_m, y_train_m)
y_score = model_multi.predict_proba(X_test_m)
# Вычисляем ROC-кривые для каждого класса
plt.figure(figsize=(10, 8))
# Для каждого класса
for i in range(n_classes):
fpr, tpr, _ = roc_curve(y_test_bin[:, i], y_score[:, i])
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, lw=2, label=f'Класс {i} (AUC = {roc_auc:.3f})')
# Микро-усреднение
fpr_micro, tpr_micro, _ = roc_curve(y_test_bin.ravel(), y_score.ravel())
roc_auc_micro = auc(fpr_micro, tpr_micro)
plt.plot(fpr_micro, tpr_micro, 'k-', lw=3, label=f'Микро-усреднение (AUC = {roc_auc_micro:.3f})')
# Макро-усреднение
all_fpr = np.unique(np.concatenate([roc_curve(y_test_bin[:, i], y_score[:, i])[0] for i in range(n_classes)]))
mean_tpr = np.zeros_like(all_fpr)
for i in range(n_classes):
fpr, tpr, _ = roc_curve(y_test_bin[:, i], y_score[:, i])
mean_tpr += np.interp(all_fpr, fpr, tpr)
mean_tpr /= n_classes
roc_auc_macro = auc(all_fpr, mean_tpr)
plt.plot(all_fpr, mean_tpr, 'r--', lw=3, label=f'Макро-усреднение (AUC = {roc_auc_macro:.3f})')
plt.plot([0, 1], [0, 1], 'k--', alpha=0.6, label='Случайный классификатор')
plt.xlim([-0.01, 1.01])
plt.ylim([-0.01, 1.01])
plt.xlabel('False Positive Rate (FPR)', fontsize=12)
plt.ylabel('True Positive Rate (TPR)', fontsize=12)
plt.title('ROC-кривые для многоклассовой классификации', fontsize=14, fontweight='bold')
plt.legend(loc='lower right', fontsize=10)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# Сводная таблица AUC
print("\nСводная таблица AUC для многоклассовой классификации:")
print("-" * 50)
print(f"{'Метод усреднения':<25} {'AUC':<10}")
print("-" * 50)
for i in range(n_classes):
fpr, tpr, _ = roc_curve(y_test_bin[:, i], y_score[:, i])
print(f"Класс {i}:{'':<20} {auc(fpr, tpr):.4f}")
print(f"Микро-усреднение:{'':<10} {roc_auc_micro:.4f}")
print(f"Макро-усреднение:{'':<10} {roc_auc_macro:.4f}")
4. Интерактивная ROC-кривая (используя Plotly)
python
# Если у вас установлен plotly, раскомментируйте этот код
"""
import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots
# Создаем интерактивный график
fig = go.Figure()
# ROC-кривая
fig.add_trace(go.Scatter(
x=fpr,
y=tpr,
mode='lines',
name=f'ROC-кривая (AUC = {roc_auc:.3f})',
line=dict(color='blue', width=3),
fill='tozeroy',
fillcolor='rgba(0, 0, 255, 0.1)'
))
# Диагональная линия
fig.add_trace(go.Scatter(
x=[0, 1],
y=[0, 1],
mode='lines',
name='Случайный классификатор',
line=dict(color='black', dash='dash', width=2)
))
# Оптимальная точка
fig.add_trace(go.Scatter(
x=[fpr[optimal_idx]],
y=[tpr[optimal_idx]],
mode='markers',
name=f'Оптимальная точка<br>Порог = {optimal_threshold:.3f}',
marker=dict(color='red', size=12, symbol='circle'),
hovertemplate='<b>Оптимальная точка</b><br>FPR: %{x:.3f}<br>TPR: %{y:.3f}<br>Порог: ' + f'{optimal_threshold:.3f}'
))
# Настраиваем макет
fig.update_layout(
title='Интерактивная ROC-кривая',
xaxis_title='False Positive Rate (FPR)',
yaxis_title='True Positive Rate (TPR) / Recall',
hovermode='closest',
width=800,
height=600,
showlegend=True,
template='plotly_white'
)
fig.show()
"""
Интерпретация результатов:
Чем выше кривая над диагональю, тем лучше модель
AUC > 0.9 - отличная модель
AUC 0.8-0.9 - хорошая модель
AUC 0.7-0.8 - удовлетворительная модель
AUC 0.6-0.7 - плохая модель
AUC 0.5 - модель не лучше случайного угадывания