欢迎光临
我们一直在努力

机器学习预警模型时序预测(LSTM神经网络):哮喘发作提前预警和慢阻肺急性加重风险评估(上)

第一节:呼吸健康预测机器学习预警模型

一、系统架构设计

python

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.model_selection import train_test_split, cross_val_score

from sklearn.preprocessing import StandardScaler, LabelEncoder

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier

from sklearn.svm import SVC

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score

from sklearn.impute import SimpleImputer

import warnings

warnings.filterwarnings('ignore')

class RespiratoryHealthPredictor:

"""

呼吸健康预测预警模型

"""

def __init__(self):

self.models = {}

self.scalers = {}

self.feature_importance = {}

self.results = {}

def generate_sample_data(self, n_samples=5000):

"""

生成模拟的呼吸健康数据集

在实际应用中应替换为真实数据

"""

np.random.seed(42)

data = {

'age': np.random.normal(45, 15, n_samples),

'gender': np.random.choice([0, 1], n_samples),

'smoking_status': np.random.choice([0, 1, 2], n_samples, p=[0.6, 0.3, 0.1]),

'bmi': np.random.normal(24, 4, n_samples),

'air_quality_index': np.random.lognormal(2.5, 0.8, n_samples),

'respiratory_rate': np.random.normal(16, 4, n_samples),

'oxygen_saturation': np.random.normal(97, 2, n_samples),

'cough_frequency': np.random.poisson(2, n_samples),

'allergy_history': np.random.choice([0, 1], n_samples, p=[0.7, 0.3]),

'family_history': np.random.choice([0, 1], n_samples, p=[0.8, 0.2]),

'exercise_frequency': np.random.choice([0, 1, 2, 3], n_samples),

'sleep_quality': np.random.choice([1, 2, 3, 4, 5], n_samples),

'stress_level': np.random.choice([1, 2, 3, 4, 5], n_samples)

}

df = pd.DataFrame(data)

# 生成目标变量(呼吸健康风险等级)

risk_score = (

df['age'] * 0.1 +

df['smoking_status'] * 0.3 +

(df['bmi'] – 22) * 0.05 +

df['air_quality_index'] * 0.02 +

(18 – df['respiratory_rate']).abs() * 0.1 +

(98 – df['oxygen_saturation']) * 0.2 +

df['cough_frequency'] * 0.15 +

df['allergy_history'] * 0.1 +

df['family_history'] * 0.08 +

(3 – df['exercise_frequency']) * 0.05 +

(5 – df['sleep_quality']) * 0.03 +

df['stress_level'] * 0.04 +

np.random.normal(0, 1, n_samples)

)

# 将风险分数转换为健康等级

conditions = [

risk_score < 2,

(risk_score >= 2) & (risk_score < 4),

(risk_score >= 4) & (risk_score < 6),

risk_score >= 6

]

choices = [0, 1, 2, 3] # 0:健康, 1:低风险, 2:中风险, 3:高风险

df['health_risk'] = np.select(conditions, choices, default=0)

return df

def preprocess_data(self, df):

"""数据预处理"""

# 复制数据

processed_df = df.copy()

# 处理缺失值

imputer = SimpleImputer(strategy='median')

numeric_columns = processed_df.select_dtypes(include=[np.number]).columns

processed_df[numeric_columns] = imputer.fit_transform(processed_df[numeric_columns])

# 分离特征和目标变量

X = processed_df.drop('health_risk', axis=1)

y = processed_df['health_risk']

return X, y

def train_models(self, X_train, y_train):

"""训练多个机器学习模型"""

models = {

'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42),

'Gradient Boosting': GradientBoostingClassifier(n_estimators=100, random_state=42),

'SVM': SVC(probability=True, random_state=42),

'Logistic Regression': LogisticRegression(random_state=42, max_iter=1000)

}

for name, model in models.items():

print(f"训练 {name}…")

model.fit(X_train, y_train)

self.models[name] = model

# 计算特征重要性(基于随机森林)

self.feature_importance = dict(zip(

X_train.columns,

self.models['Random Forest'].feature_importances_

))

def evaluate_models(self, X_test, y_test):

"""评估模型性能"""

results = {}

for name, model in self.models.items():

y_pred = model.predict(X_test)

y_pred_proba = model.predict_proba(X_test)

# 多分类AUC

auc_score = roc_auc_score(y_test, y_pred_proba, multi_class='ovr')

results[name] = {

'accuracy': model.score(X_test, y_test),

'auc': auc_score,

'classification_report': classification_report(y_test, y_pred),

'confusion_matrix': confusion_matrix(y_test, y_pred)

}

self.results = results

return results

def plot_feature_importance(self):

"""可视化特征重要性"""

importance_df = pd.DataFrame({

'feature': list(self.feature_importance.keys()),

'importance': list(self.feature_importance.values())

}).sort_values('importance', ascending=False)

plt.figure(figsize=(10, 6))

sns.barplot(data=importance_df, x='importance', y='feature')

plt.title('呼吸健康风险特征重要性')

plt.tight_layout()

plt.show()

return importance_df

def plot_model_comparison(self):

"""模型性能比较"""

model_names = list(self.results.keys())

accuracies = [self.results[name]['accuracy'] for name in model_names]

auc_scores = [self.results[name]['auc'] for name in model_names]

x = np.arange(len(model_names))

width = 0.35

fig, ax = plt.subplots(figsize=(10, 6))

bars1 = ax.bar(x – width/2, accuracies, width, label='准确率')

bars2 = ax.bar(x + width/2, auc_scores, width, label='AUC得分')

ax.set_xlabel('模型')

ax.set_ylabel('得分')

ax.set_title('模型性能比较')

ax.set_xticks(x)

ax.set_xticklabels(model_names)

ax.legend()

# 在柱状图上显示数值

for bar in bars1:

height = bar.get_height()

ax.annotate(f'{height:.3f}',

xy=(bar.get_x() + bar.get_width() / 2, height),

xytext=(0, 3),

textcoords="offset points",

ha='center', va='bottom')

for bar in bars2:

height = bar.get_height()

ax.annotate(f'{height:.3f}',

xy=(bar.get_x() + bar.get_width() / 2, height),

xytext=(0, 3),

textcoords="offset points",

ha='center', va='bottom')

plt.tight_layout()

plt.show()

def predict_health_risk(self, patient_data):

"""预测单个患者的健康风险"""

best_model = self.models['Random Forest'] # 使用最佳模型

# 确保输入数据格式正确

if isinstance(patient_data, pd.DataFrame):

prediction = best_model.predict(patient_data)[0]

probability = best_model.predict_proba(patient_data)[0]

else:

prediction = best_model.predict([patient_data])[0]

probability = best_model.predict_proba([patient_data])[0]

risk_levels = {0: '健康', 1: '低风险', 2: '中风险', 3: '高风险'}

result = {

'risk_level': risk_levels[prediction],

'confidence': max(probability),

'probabilities': {

risk_levels[i]: f"{prob*100:.2f}%" for i, prob in enumerate(probability)

}

}

return result

def generate_early_warning(self, patient_data, threshold=0.7):

"""生成早期预警"""

prediction = self.predict_health_risk(patient_data)

warning_messages = {

'健康': "当前呼吸健康状况良好,请继续保持健康生活方式。",

'低风险': "存在轻微呼吸健康风险,建议关注生活方式改善。",

'中风险': "存在中度呼吸健康风险,建议进行专业检查并采取干预措施。",

'高风险': "存在严重呼吸健康风险,请立即就医并进行全面检查。"

}

warning = {

'risk_level': prediction['risk_level'],

'confidence': prediction['confidence'],

'message': warning_messages[prediction['risk_level']],

'urgent': prediction['risk_level'] in ['中风险', '高风险'],

'recommendations': self.generate_recommendations(prediction['risk_level'])

}

return warning

def generate_recommendations(self, risk_level):

"""根据风险等级生成个性化建议"""

recommendations = {

'健康': [

"保持规律运动",

"均衡饮食,多摄入蔬果",

"保证充足睡眠",

"定期进行呼吸健康检查"

],

'低风险': [

"减少吸烟或戒烟",

"改善室内空气质量",

"增加有氧运动",

"学习呼吸训练技巧"

],

'中风险': [

"立即进行专业呼吸功能检查",

"避免空气污染环境",

"遵医嘱进行药物治疗",

"定期监测呼吸指标"

],

'高风险': [

"立即就医进行全面检查",

"严格遵医嘱治疗",

"避免所有呼吸道刺激物",

"建立紧急医疗联系方案"

]

}

return recommendations.get(risk_level, [])

二、模型训练与评估

python

def main():

# 初始化预测器

predictor = RespiratoryHealthPredictor()

# 生成示例数据

print("生成呼吸健康数据集…")

df = predictor.generate_sample_data(5000)

print(f"数据集形状: {df.shape}")

print(f"健康风险分布:\\n{df['health_risk'].value_counts().sort_index()}")

# 数据预处理

print("\\n数据预处理…")

X, y = predictor.preprocess_data(df)

# 划分训练测试集

X_train, X_test, y_train, y_test = train_test_split(

X, y, test_size=0.2, random_state=42, stratify=y

)

# 训练模型

print("\\n训练机器学习模型…")

predictor.train_models(X_train, y_train)

# 评估模型

print("\\n评估模型性能…")

results = predictor.evaluate_models(X_test, y_test)

# 显示结果

for model_name, metrics in results.items():

print(f"\\n{model_name} 结果:")

print(f"准确率: {metrics['accuracy']:.4f}")

print(f"AUC得分: {metrics['auc']:.4f}")

print("分类报告:")

print(metrics['classification_report'])

# 可视化

print("\\n生成可视化结果…")

importance_df = predictor.plot_feature_importance()

predictor.plot_model_comparison()

# 示例预测

print("\\n示例预测:")

sample_patient = X_test.iloc[0:1] # 取测试集第一个样本

prediction = predictor.predict_health_risk(sample_patient)

warning = predictor.generate_early_warning(sample_patient)

print(f"预测结果: {prediction}")

print(f"预警信息: {warning}")

return predictor, results

# 运行主程序

if __name__ == "__main__":

predictor, results = main()

三、实时预警系统

python

class RealTimeMonitoringSystem:

"""

实时呼吸健康监测预警系统

"""

def __init__(self, predictor):

self.predictor = predictor

self.patient_history = {}

def add_patient_data(self, patient_id, patient_data):

"""添加患者数据"""

if patient_id not in self.patient_history:

self.patient_history[patient_id] = []

self.patient_history[patient_id].append({

'timestamp': pd.Timestamp.now(),

'data': patient_data,

'prediction': self.predictor.predict_health_risk(patient_data),

'warning': self.predictor.generate_early_warning(patient_data)

})

def get_patient_trend(self, patient_id):

"""获取患者健康趋势"""

if patient_id not in self.patient_history:

return None

history = self.patient_history[patient_id]

risk_scores = []

timestamps = []

for record in history:

risk_level = record['prediction']['risk_level']

risk_map = {'健康': 0, '低风险': 1, '中风险': 2, '高风险': 3}

risk_scores.append(risk_map[risk_level])

timestamps.append(record['timestamp'])

return pd.DataFrame({

'timestamp': timestamps,

'risk_score': risk_scores

})

def generate_population_report(self):

"""生成群体健康报告"""

all_risks = []

for patient_id, history in self.patient_history.items():

latest = history[-1]

all_risks.append(latest['prediction']['risk_level'])

risk_counts = pd.Series(all_risks).value_counts()

report = {

'total_patients': len(self.patient_history),

'risk_distribution': risk_counts.to_dict(),

'high_risk_patients': risk_counts.get('高风险', 0),

'medium_risk_patients': risk_counts.get('中风险', 0)

}

return report

# 使用示例

def demo_real_time_system():

# 初始化系统

predictor = RespiratoryHealthPredictor()

df = predictor.generate_sample_data(1000)

X, y = predictor.preprocess_data(df)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

predictor.train_models(X_train, y_train)

# 创建实时监测系统

monitoring_system = RealTimeMonitoringSystem(predictor)

# 模拟实时数据输入

for i in range(10):

patient_data = X_test.iloc[i:i+1]

monitoring_system.add_patient_data(f"patient_{i}", patient_data)

# 生成报告

report = monitoring_system.generate_population_report()

print("群体健康报告:")

print(report)

# 获取单个患者趋势

trend = monitoring_system.get_patient_trend("patient_0")

print(f"\\n患者0的健康趋势:\\n{trend}")

# 运行实时系统演示

demo_real_time_system()

四、模型部署建议

1. 数据安全与隐私

医疗数据加密存储,匿名化处理患者信息,符合HIPAA等医疗数据法规。

2. 系统集成

RESTful API接口,与医院信息系统集成,移动端应用支持。

3. 持续学习

定期更新模型,增量学习新数据,模型性能监控。

第二节:时序预测:LSTM神经网络

一、基于LSTM的呼吸健康时序预测预警模型

(一)系统架构设计

python

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

from sklearn.preprocessing import StandardScaler, MinMaxScaler

from sklearn.metrics import mean_squared_error, mean_absolute_error, accuracy_score, classification_report

import tensorflow as tf

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import LSTM, Dense, Dropout, Bidirectional

from tensorflow.keras.optimizers import Adam

from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau

import warnings

warnings.filterwarnings('ignore')

class RespiratoryLSTMPredictor:

"""

基于LSTM的呼吸健康时序预测预警模型

"""

def __init__(self, sequence_length=30, prediction_horizon=7):

self.sequence_length = sequence_length

self.prediction_horizon = prediction_horizon

self.model = None

self.scalers = {}

self.history = None

def generate_temporal_data(self, n_patients=200, time_steps=365):

"""

生成模拟的呼吸健康时序数据

"""

np.random.seed(42)

data = []

for patient_id in range(n_patients):

# 基础特征

base_features = {

'patient_id': patient_id,

'age': np.random.normal(45, 15),

'gender': np.random.choice([0, 1]),

'smoking_status': np.random.choice([0, 1, 2], p=[0.6, 0.3, 0.1]),

'bmi': np.random.normal(24, 4),

'allergy_history': np.random.choice([0, 1], p=[0.7, 0.3]),

'family_history': np.random.choice([0, 1], p=[0.8, 0.2])

}

# 生成时序数据

for t in range(time_steps):

date = pd.Timestamp('2023-01-01') + pd.Timedelta(days=t)

# 季节性因素

seasonal_factor = 1 + 0.2 * np.sin(2 * np.pi * t / 365)

# 空气质量(有季节性变化)

air_quality = np.random.lognormal(2.5, 0.5) * seasonal_factor

# 呼吸率(受多种因素影响)

base_resp_rate = 16 + base_features['smoking_status'] * 2

resp_rate = base_resp_rate + np.random.normal(0, 1) + 0.1 * air_quality # 血氧饱和度

base_oxygen = 98 – base_features['smoking_status'] * 1

oxygen_sat = base_oxygen + np.random.normal(0, 0.5) – 0.05 * air_quality

# 咳嗽频率(有趋势性)

cough_trend = 0.001 * t # 轻微恶化趋势

base_cough = 2 + base_features['smoking_status'] * 3

cough_freq = max(0, base_cough + np.random.poisson(1) + cough_trend)

# 症状评分

symptom_score = (

(resp_rate – 16) * 0.1 +

(98 – oxygen_sat) * 0.3 +

cough_freq * 0.2 +

air_quality * 0.05 +

np.random.normal(0, 0.5)

)

# 风险等级(基于症状评分)

if symptom_score < 1:

risk_level = 0 # 健康

elif symptom_score < 2:

risk_level = 1 # 低风险

elif symptom_score < 4:

risk_level = 2 # 中风险

else:

risk_level = 3 # 高风险

record = {

'patient_id': patient_id,

'date': date,

'respiratory_rate': resp_rate,

'oxygen_saturation': oxygen_sat,

'cough_frequency': cough_freq,

'air_quality_index': air_quality,

'symptom_score': symptom_score,

'risk_level': risk_level,

**base_features

}

data.append(record)

df = pd.DataFrame(data)

return df

def prepare_sequences(self, df, features, target):

"""

准备LSTM序列数据

"""

sequences = []

targets = []

patient_ids = df['patient_id'].unique()

for patient_id in patient_ids:

patient_data = df[df['patient_id'] == patient_id].sort_values('date')

# 标准化特征

feature_data = patient_data[features].values

# 创建序列

for i in range(len(patient_data) – self.sequence_length – self.prediction_horizon + 1):

seq = feature_data[i:(i + self.sequence_length)]

target_val = patient_data[target].iloc[i + self.sequence_length + self.prediction_horizon – 1]

sequences.append(seq)

targets.append(target_val)

return np.array(sequences), np.array(targets)

def build_lstm_model(self, input_shape, num_classes=4):

"""

构建LSTM模型架构

"""

model = Sequential([

Bidirectional(LSTM(128, return_sequences=True, input_shape=input_shape)),

Dropout(0.2),

Bidirectional(LSTM(64, return_sequences=True)),

Dropout(0.2),

Bidirectional(LSTM(32)),

Dropout(0.2),

Dense(64, activation='relu'),

Dropout(0.2),

Dense(32, activation='relu'),

Dropout(0.1),

Dense(num_classes, activation='softmax') # 多分类输出

])

model.compile(

optimizer=Adam(learning_rate=0.001),

loss='sparse_categorical_crossentropy',

metrics=['accuracy']

)

return model

def build_lstm_regression_model(self, input_shape):

"""

构建回归LSTM模型(预测症状评分)

"""

model = Sequential([

Bidirectional(LSTM(128, return_sequences=True, input_shape=input_shape)),

Dropout(0.2),

Bidirectional(LSTM(64, return_sequences=True)),

Dropout(0.2),

Bidirectional(LSTM(32)),

Dropout(0.2),

Dense(64, activation='relu'),

Dropout(0.2),

Dense(32, activation='relu'),

Dropout(0.1),

Dense(1, activation='linear') # 回归输出

])

model.compile(

optimizer=Adam(learning_rate=0.001),

loss='mse',

metrics=['mae']

)

return model

def train_model(self, X_train, y_train, X_val, y_val, model_type='classification'):

"""

训练LSTM模型

"""

if model_type == 'classification':

self.model = self.build_lstm_model((X_train.shape[1], X_train.shape[2]))

else:

self.model = self.build_lstm_regression_model((X_train.shape[1], X_train.shape[2]))

callbacks = [

EarlyStopping(patience=15, restore_best_weights=True),

ReduceLROnPlateau(patience=10, factor=0.5, min_lr=1e-6)

]

self.history = self.model.fit(

X_train, y_train,

validation_data=(X_val, y_val),

epochs=100,

batch_size=32,

callbacks=callbacks,

verbose=1

)

return self.history

def predict_risk(self, sequences):

"""

预测风险

"""

if self.model is None:

raise ValueError("模型尚未训练")

predictions = self.model.predict(sequences)

return predictions

def plot_training_history(self):

"""

绘制训练历史

"""

if self.history is None:

raise ValueError("没有训练历史可显示")

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))

# 损失曲线

ax1.plot(self.history.history['loss'], label='训练损失')

ax1.plot(self.history.history['val_loss'], label='验证损失')

ax1.set_title('模型损失')

ax1.set_xlabel('Epoch')

ax1.set_ylabel('Loss')

ax1.legend()

# 准确率曲线

if 'accuracy' in self.history.history:

ax2.plot(self.history.history['accuracy'], label='训练准确率')

ax2.plot(self.history.history['val_accuracy'], label='验证准确率')

ax2.set_title('模型准确率')

else:

ax2.plot(self.history.history['mae'], label='训练MAE')

ax2.plot(self.history.history['val_mae'], label='验证MAE')

ax2.set_title('模型MAE')

ax2.set_xlabel('Epoch')

ax2.set_ylabel('Score')

ax2.legend()

plt.tight_layout()

plt.show()

def evaluate_model(self, X_test, y_test):

"""

评估模型性能

"""

if self.model is None:

raise ValueError("模型尚未训练")

# 预测

y_pred = self.model.predict(X_test)

# 分类任务评估

if len(y_pred.shape) > 1 and y_pred.shape[1] > 1:

y_pred_classes = np.argmax(y_pred, axis=1)

accuracy = accuracy_score(y_test, y_pred_classes)

print(f"测试集准确率: {accuracy:.4f}")

print("\\n分类报告:")

print(classification_report(y_test, y_pred_classes,

target_names=['健康', '低风险', '中风险', '高风险'])) # 混淆矩阵

cm = tf.math.confusion_matrix(y_test, y_pred_classes)

plt.figure(figsize=(8, 6))

sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',

xticklabels=['健康', '低风险', '中风险', '高风险'],

yticklabels=['健康', '低风险', '中风险', '高风险'])

plt.title('混淆矩阵')

plt.xlabel('预测标签')

plt.ylabel('真实标签')

plt.show()

return accuracy

# 回归任务评估

else:

y_pred = y_pred.flatten()

mse = mean_squared_error(y_test, y_pred)

mae = mean_absolute_error(y_test, y_pred)

print(f"测试集MSE: {mse:.4f}")

print(f"测试集MAE: {mae:.4f}")

# 预测 vs 真实值散点图

plt.figure(figsize=(10, 6))

plt.scatter(y_test, y_pred, alpha=0.6)

plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r–', lw=2)

plt.xlabel('真实值')

plt.ylabel('预测值')

plt.title('预测值 vs 真实值')

plt.show()

return mse, mae

class AdvancedRespiratoryMonitor:

"""

高级呼吸健康监测预警系统

"""

def __init__(self, predictor):

self.predictor = predictor

self.patient_profiles = {}

def add_patient_profile(self, patient_id, historical_data):

"""添加患者档案"""

self.patient_profiles[patient_id] = {

'historical_data': historical_data,

'predictions': [],

'warnings': [],

'risk_trend': []

}

def generate_future_predictions(self, patient_id, future_days=30):

"""生成未来预测"""

if patient_id not in self.patient_profiles:

raise ValueError(f"患者 {patient_id} 不存在")

patient_data = self.patient_profiles[patient_id]['historical_data']

features = ['respiratory_rate', 'oxygen_saturation', 'cough_frequency', 'air_quality_index']

# 使用最后 sequence_length 天的数据

recent_data = patient_data[features].tail(self.predictor.sequence_length).values

recent_data = recent_data.reshape(1, self.predictor.sequence_length, len(features))

# 预测未来风险

future_risks = []

current_sequence = recent_data.copy()

for day in range(future_days):

prediction = self.predictor.predict_risk(current_sequence)

risk_level = np.argmax(prediction[0])

future_risks.append(risk_level)

# 更新序列(在实际应用中需要真实数据,这里使用模拟更新)

# 这里简化处理,实际应该基于预测值和其他因素更新序列

current_sequence = np.roll(current_sequence, -1, axis=1)

# 用最后一个值填充新的时间步(实际应用中应该使用预测的特征值)

current_sequence[0, -1, :] = current_sequence[0, -2, :] * 0.95 + np.random.normal(0, 0.1, len(features))

self.patient_profiles[patient_id]['future_predictions'] = future_risks

return future_risks

def analyze_risk_trend(self, patient_id):

"""分析风险趋势"""

if patient_id not in self.patient_profiles:

raise ValueError(f"患者 {patient_id} 不存在")

historical_data = self.patient_profiles[patient_id]['historical_data']

# 计算风险趋势

risk_values = historical_data['risk_level'].values

trend = np.convolve(risk_values, np.ones(7)/7, mode='valid') # 7天移动平均

# 趋势分析

if len(trend) > 1:

slope = (trend[-1] – trend[0]) / len(trend)

if slope > 0.1:

trend_direction = "恶化"

elif slope < -0.1:

trend_direction = "改善"

else:

trend_direction = "稳定"

else:

trend_direction = "数据不足"

self.patient_profiles[patient_id]['risk_trend'] = {

'values': trend,

'direction': trend_direction,

'slope': slope if len(trend) > 1 else 0

}

return trend_direction

def generate_early_warnings(self, patient_id):

"""生成早期预警"""

if patient_id not in self.patient_profiles:

raise ValueError(f"患者 {patient_id} 不存在")

current_risk = self.patient_profiles[patient_id]['historical_data']['risk_level'].iloc[-1]

trend_direction = self.analyze_risk_trend(patient_id)

warnings = []

# 基于当前风险和趋势生成警告

if current_risk >= 2 or (current_risk == 1 and trend_direction == "恶化"):

if current_risk == 3:

warnings.append({

'level': '紧急',

'message': '高风险状态检测到,建议立即就医',

'actions': ['立即联系医生', '进行详细检查', '避免外出']

})

elif current_risk == 2:

warnings.append({

'level': '警告',

'message': '中风险状态,健康状况正在恶化',

'actions': ['预约医生检查', '加强监测频率', '注意休息']

})

elif current_risk == 1 and trend_direction == "恶化":

warnings.append({

'level': '注意',

'message': '低风险但趋势恶化,需要关注',

'actions': ['增加监测', '改善生活习惯', '注意症状变化']

})

# 基于未来预测生成预警

if 'future_predictions' in self.patient_profiles[patient_id]:

future_risks = self.patient_profiles[patient_id]['future_predictions']

if any(risk >= 2 for risk in future_risks):

warnings.append({

'level': '预测预警',

'message': f'预测未来{len(future_risks)}天内可能出现中高风险',

'actions': ['提前预防', '调整治疗方案', '加强监测']

})

self.patient_profiles[patient_id]['warnings'] = warnings

return warnings

def plot_patient_timeline(self, patient_id):

"""绘制患者时间线"""

if patient_id not in self.patient_profiles:

raise ValueError(f"患者 {patient_id} 不存在")

data = self.patient_profiles[patient_id]['historical_data']

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 10))

# 呼吸率趋势

ax1.plot(data['date'], data['respiratory_rate'], label='呼吸率', color='blue')

ax1.axhline(y=20, color='red', linestyle='–', label='警戒线')

ax1.set_title('呼吸率趋势')

ax1.set_ylabel('次/分钟')

ax1.legend()

# 血氧饱和度趋势

ax2.plot(data['date'], data['oxygen_saturation'], label='血氧饱和度', color='green')

ax2.axhline(y=95, color='red', linestyle='–', label='警戒线')

ax2.set_title('血氧饱和度趋势')

ax2.set_ylabel('%')

ax2.legend()

# 咳嗽频率趋势

ax3.plot(data['date'], data['cough_frequency'], label='咳嗽频率', color='orange')

ax3.set_title('咳嗽频率趋势')

ax3.set_ylabel('次数/天')

ax3.legend()

# 风险等级趋势

risk_colors = {0: 'green', 1: 'yellow', 2: 'orange', 3: 'red'}

for risk_level in range(4):

risk_data = data[data['risk_level'] == risk_level]

ax4.scatter(risk_data['date'], risk_data['risk_level'],

color=risk_colors[risk_level], label=f'风险{risk_level}', alpha=0.6)

ax4.set_title('风险等级变化')

ax4.set_ylabel('风险等级')

ax4.set_yticks([0, 1, 2, 3])

ax4.legend()

plt.tight_layout()

plt.show()

(未完待续)

赞(0)
未经允许不得转载:171主机测评 » 机器学习预警模型时序预测(LSTM神经网络):哮喘发作提前预警和慢阻肺急性加重风险评估(上)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址