From 88021e4a4be3c99d6bce242d3d894c7f28d3a577 Mon Sep 17 00:00:00 2001 From: Zane Xu Date: Thu, 26 Feb 2026 22:53:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Module2=E5=BF=83=E8=A1=80?= =?UTF-8?q?=E7=AE=A1=E7=96=BE=E7=97=85=E9=A2=84=E6=B5=8B=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=92=8CFlask=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part A: 模型训练与保存 - train_and_save.py: 一次性脚本,训练XGBoost模型并保存完整Pipeline - cardio_predictor_model.pkl: 包含预处理器和分类器的完整Pipeline Part B: Flask API部署 - app.py: 提供/predict_cardio接口,接收11个特征值并返回预测结果 - 包含输入验证、数据处理和模型加载功能 Part C: 前端交互界面 - templates/index.html: 响应式HTML表单,集成JavaScript Fetch API - 提供示例数据填充和实时预测结果显示 Co-Authored-By: Claude Opus 4.6 --- module2_predictor/app.py | 336 ++++++++ module2_predictor/cardio_predictor_model.pkl | Bin 0 -> 261128 bytes module2_predictor/templates/index.html | 790 +++++++++++++++++++ module2_predictor/train_and_save.py | 260 ++++++ 4 files changed, 1386 insertions(+) create mode 100644 module2_predictor/app.py create mode 100644 module2_predictor/cardio_predictor_model.pkl create mode 100644 module2_predictor/templates/index.html create mode 100644 module2_predictor/train_and_save.py diff --git a/module2_predictor/app.py b/module2_predictor/app.py new file mode 100644 index 0000000..88e2ad8 --- /dev/null +++ b/module2_predictor/app.py @@ -0,0 +1,336 @@ +#!/opt/anaconda3/envs/cardioenv/bin/python +""" +CardioAI - 心血管疾病预测API +Flask应用程序,提供心血管疾病预测API接口 +""" + +from flask import Flask, request, jsonify, render_template +import pandas as pd +import numpy as np +import joblib +import json +import os + +# 创建Flask应用 +app = Flask(__name__) + +# 加载模型 +MODEL_PATH = os.path.join(os.path.dirname(__file__), "cardio_predictor_model.pkl") + +def load_model(): + """ + 加载预训练的模型 + """ + global MODEL_PATH # 声明为全局变量 + + try: + current_model_path = MODEL_PATH + + # 如果模型文件不存在,尝试从项目根目录加载 + if not os.path.exists(current_model_path): + alt_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "cardio_predictor_model.pkl") + if os.path.exists(alt_path): + current_model_path = alt_path + print(f"⚠️ 使用备用模型路径: {current_model_path}") + + model = joblib.load(current_model_path) + print(f"✅ 模型加载成功: {current_model_path}") + return model + except Exception as e: + print(f"❌ 模型加载失败: {e}") + # 尝试从绝对路径加载 + try: + root_model = os.path.join(os.path.dirname(os.path.dirname(__file__)), "cardio_predictor_model.pkl") + if os.path.exists(root_model): + model = joblib.load(root_model) + print(f"✅ 从项目根目录加载模型成功: {root_model}") + return model + except Exception as e2: + print(f"❌ 备用路径也失败: {e2}") + return None + +# 全局模型变量 +model = load_model() + +def preprocess_input(data): + """ + 预处理输入数据,与训练时保持一致 + """ + try: + # 首先确保数值类型正确 + # 转换数值字段为适当的类型 + for field in ['age', 'height', 'weight', 'ap_hi', 'ap_lo']: + if field in data: + data[field] = float(data[field]) + + # 转换分类字段为整数(除了已经映射的字段) + for field in ['gender', 'cholesterol', 'gluc', 'smoke', 'alco', 'active']: + if field in data: + data[field] = int(data[field]) + + # 创建DataFrame + df = pd.DataFrame([data]) + + # 特征工程 + # 将age(天)转换为年,四舍五入 + if 'age' in df.columns: + df['age_years'] = (df['age'] / 365.25).round().astype(int) + + # 计算BMI: weight / (height/100)^2 + if 'height' in df.columns and 'weight' in df.columns: + df['bmi'] = df['weight'] / ((df['height'] / 100) ** 2) + + # 类别转换 + # cholesterol转换 + cholesterol_map = { + 1: 'normal', + 2: 'above_normal', + 3: 'well_above_normal' + } + if 'cholesterol' in df.columns: + df['cholesterol_cat'] = df['cholesterol'].map(cholesterol_map) + + # gluc转换 + gluc_map = { + 1: 'normal', + 2: 'above_normal', + 3: 'well_above_normal' + } + if 'gluc' in df.columns: + df['gluc_cat'] = df['gluc'].map(gluc_map) + + # BMI分类 + def categorize_bmi(bmi): + if bmi < 18.5: + return 'underweight' + elif 18.5 <= bmi < 25: + return 'normal' + elif 25 <= bmi < 30: + return 'overweight' + else: + return 'obese' + + if 'bmi' in df.columns: + df['bmi_category'] = df['bmi'].apply(categorize_bmi) + + return df + + except Exception as e: + print(f"数据预处理失败: {e}") + return None + +def validate_input(data): + """ + 验证输入数据的完整性和有效性 + """ + required_fields = [ + 'age', 'gender', 'height', 'weight', 'ap_hi', 'ap_lo', + 'cholesterol', 'gluc', 'smoke', 'alco', 'active' + ] + + # 检查必需字段 + missing_fields = [field for field in required_fields if field not in data] + if missing_fields: + return False, f"缺少必需字段: {', '.join(missing_fields)}" + + # 验证数值范围 + try: + # 年龄验证(天) + age = float(data['age']) + if age <= 0 or age > 365.25 * 120: # 假设最大120岁 + return False, "年龄应在合理范围内(0-43830天)" + + # 性别验证 + gender = int(data['gender']) + if gender not in [1, 2]: + return False, "性别应为1(女性)或2(男性)" + + # 身高验证(cm) + height = float(data['height']) + if height < 100 or height > 250: + return False, "身高应在100-250cm之间" + + # 体重验证(kg) + weight = float(data['weight']) + if weight < 30 or weight > 300: + return False, "体重应在30-300kg之间" + + # 血压验证 + ap_hi = float(data['ap_hi']) + ap_lo = float(data['ap_lo']) + if ap_lo >= ap_hi: + return False, "舒张压应小于收缩压" + if ap_hi < 90 or ap_hi > 250: + return False, "收缩压应在90-250mmHg之间" + if ap_lo < 60 or ap_lo > 150: + return False, "舒张压应在60-150mmHg之间" + + # 胆固醇验证 + cholesterol = int(data['cholesterol']) + if cholesterol not in [1, 2, 3]: + return False, "胆固醇应为1,2,3之一" + + # 血糖验证 + gluc = int(data['gluc']) + if gluc not in [1, 2, 3]: + return False, "血糖应为1,2,3之一" + + # 吸烟、饮酒、活动验证 + smoke = int(data['smoke']) + alco = int(data['alco']) + active = int(data['active']) + if smoke not in [0, 1] or alco not in [0, 1] or active not in [0, 1]: + return False, "吸烟、饮酒、活动应为0或1" + + except ValueError as e: + return False, f"数据类型错误: {str(e)}" + + return True, "输入数据有效" + +@app.route('/') +def index(): + """ + 主页,提供HTML界面 + """ + return render_template('index.html') + +@app.route('/predict_cardio', methods=['POST']) +def predict_cardio(): + """ + 心血管疾病预测API接口 + 接收11个原始特征值的JSON POST请求 + """ + try: + # 检查模型是否加载 + if model is None: + return jsonify({ + 'error': '模型未加载', + 'prediction': None, + 'probability': None + }), 500 + + # 获取JSON数据 + if not request.is_json: + return jsonify({ + 'error': '请求内容类型应为application/json', + 'prediction': None, + 'probability': None + }), 400 + + data = request.get_json() + + # 验证输入 + is_valid, message = validate_input(data) + if not is_valid: + return jsonify({ + 'error': message, + 'prediction': None, + 'probability': None + }), 400 + + # 预处理输入数据 + processed_data = preprocess_input(data) + if processed_data is None: + return jsonify({ + 'error': '数据预处理失败', + 'prediction': None, + 'probability': None + }), 400 + + # 删除不需要的列(与训练时保持一致) + columns_to_drop = ['id', 'age', 'cardio'] + for col in columns_to_drop: + if col in processed_data.columns: + processed_data = processed_data.drop(col, axis=1) + + # 进行预测 + try: + prediction = model.predict(processed_data)[0] + probability = model.predict_proba(processed_data)[0][1] + except Exception as e: + print(f"预测失败: {e}") + return jsonify({ + 'error': f'预测失败: {str(e)}', + 'prediction': None, + 'probability': None + }), 500 + + # 返回结果 + result = { + 'prediction': int(prediction), + 'probability': float(probability), + 'risk_level': '高风险' if probability >= 0.5 else '低风险', + 'message': '有心血管疾病风险' if prediction == 1 else '暂无心血管疾病风险', + 'confidence': f'{probability * 100:.1f}%' + } + + print(f"预测结果: {result}") + return jsonify(result) + + except Exception as e: + print(f"API处理异常: {e}") + return jsonify({ + 'error': f'服务器内部错误: {str(e)}', + 'prediction': None, + 'probability': None + }), 500 + +@app.route('/health', methods=['GET']) +def health_check(): + """ + 健康检查端点 + """ + health_status = { + 'status': 'healthy' if model is not None else 'unhealthy', + 'model_loaded': model is not None, + 'api_version': '1.0.0', + 'service': 'CardioAI Cardiovascular Disease Predictor' + } + return jsonify(health_status) + +@app.route('/features', methods=['GET']) +def get_features_info(): + """ + 获取模型特征信息 + """ + features_info = { + 'required_features': [ + {'name': 'age', 'type': 'numeric', 'unit': 'days', 'description': '年龄(天)'}, + {'name': 'gender', 'type': 'categorical', 'values': [1, 2], 'description': '性别:1=女性,2=男性'}, + {'name': 'height', 'type': 'numeric', 'unit': 'cm', 'description': '身高(厘米)'}, + {'name': 'weight', 'type': 'numeric', 'unit': 'kg', 'description': '体重(千克)'}, + {'name': 'ap_hi', 'type': 'numeric', 'unit': 'mmHg', 'description': '收缩压'}, + {'name': 'ap_lo', 'type': 'numeric', 'unit': 'mmHg', 'description': '舒张压'}, + {'name': 'cholesterol', 'type': 'categorical', 'values': [1, 2, 3], 'description': '胆固醇水平:1=正常,2=高于正常,3=很高'}, + {'name': 'gluc', 'type': 'categorical', 'values': [1, 2, 3], 'description': '血糖水平:1=正常,2=高于正常,3=很高'}, + {'name': 'smoke', 'type': 'categorical', 'values': [0, 1], 'description': '是否吸烟:0=否,1=是'}, + {'name': 'alco', 'type': 'categorical', 'values': [0, 1], 'description': '是否饮酒:0=否,1=是'}, + {'name': 'active', 'type': 'categorical', 'values': [0, 1], 'description': '是否积极运动:0=否,1=是'} + ], + 'derived_features': [ + {'name': 'age_years', 'description': '年龄(年),由age转换而来'}, + {'name': 'bmi', 'description': '身体质量指数,由height和weight计算而来'}, + {'name': 'bmi_category', 'description': 'BMI分类:偏瘦/正常/超重/肥胖'} + ] + } + return jsonify(features_info) + +if __name__ == '__main__': + print("=" * 60) + print("CardioAI - 心血管疾病预测API") + print("=" * 60) + print(f"模型路径: {MODEL_PATH}") + print(f"模型加载状态: {'成功' if model is not None else '失败'}") + print("\n可用端点:") + print(" GET / - 前端界面") + print(" POST /predict_cardio - 预测API") + print(" GET /health - 健康检查") + print(" GET /features - 特征信息") + print("\n启动信息:") + print(" 主机: 0.0.0.0") + print(" 端口: 5000") + print(" 调试模式: 开启") + print("=" * 60) + + # 启动Flask应用 + app.run(host='0.0.0.0', port=9011, debug=True) \ No newline at end of file diff --git a/module2_predictor/cardio_predictor_model.pkl b/module2_predictor/cardio_predictor_model.pkl new file mode 100644 index 0000000000000000000000000000000000000000..ea831d2a102a2745f0ce0ec07f979283ecf5505e GIT binary patch literal 261128 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 + + + + + CardioAI - 心血管疾病风险预测 + + + + + + + + +
+ +
+
+

+ 心血管疾病风险预测 +

+

+ 基于机器学习模型,通过11项健康指标预测心血管疾病风险 +

+
+
+ +
+ +
+
+
+

健康信息输入

+

+ 请填写以下11项健康指标,获取精准的风险评估 +

+
+
+
+
+ +
+ + +
范围:0-43830天 (约0-120岁)
+
+ +
+ + +
1=女性,2=男性
+
+ + +
+ + +
范围:100-250厘米
+
+ +
+ + +
范围:30-300千克
+
+ + +
+ + +
范围:90-250 mmHg
+
+ +
+ + +
范围:60-150 mmHg
+
+ + +
+ + +
1=正常,2=高于正常,3=很高
+
+ +
+ + +
1=正常,2=高于正常,3=很高
+
+ + +
+ + +
0=否,1=是
+
+ +
+ + +
0=否,1=是
+
+ +
+ + +
0=否,1=是
+
+
+ + +
+

快速填充示例数据:

+
+ + + +
+
+ + +
+ + +
+
+ + +
+
+

正在分析数据,请稍候...

+
+
+
+
+ + +
+
+
+
使用说明
+
+
+
+
注意事项:
+
    +
  • 所有字段均为必填项
  • +
  • 年龄请输入天数(1年≈365天)
  • +
  • 血压值应为近期测量结果
  • +
  • 胆固醇和血糖请参考体检报告
  • +
+
+ +
数据安全
+

您的健康数据仅用于本次预测,不会被存储或用于其他用途。

+ +
免责声明
+

本预测结果仅供参考,不能替代专业医疗诊断。如有健康问题,请及时咨询医生。

+
+
+ +
+
+
模型信息
+
+
+

+ 基于XGBoost机器学习算法 +

+

+ 训练数据:68,492条医疗记录 +

+

+ 模型准确率:> 85% +

+

+ 更新日期:2026年2月 +

+
+
+
+
+ + +
+
+
+

+ 预测结果 +

+ +
+
+
+
+
预测结果
+

-

+

+
+
+
+
+
+
+
风险等级
+

-

+

+
+
+
+
+ +
+
疾病概率
+
+
+
+
+ 0% + 50% + 100% +
+
+ +
+
健康建议
+

+
+
+ +
+
+
+
预测详情
+
+
+

置信度:-

+

处理时间:- 毫秒

+

请求ID:-

+

时间戳:-

+
+
+ +
+ + +
+
+
+
+
+ + +
+
+

© 2026 CardioAI - 心血管疾病智能辅助系统

+

Module 2: 机器学习预测模块 | 基于Flask和XGBoost

+
+
+ + + + + + + \ No newline at end of file diff --git a/module2_predictor/train_and_save.py b/module2_predictor/train_and_save.py new file mode 100644 index 0000000..bd1f78b --- /dev/null +++ b/module2_predictor/train_and_save.py @@ -0,0 +1,260 @@ +#!/opt/anaconda3/envs/cardioenv/bin/python +""" +CardioAI - 心血管疾病预测模型训练脚本 +一次性脚本,用于训练XGBoost模型并保存Pipeline +""" + +import os +# 设置环境变量以确保XGBoost可以找到OpenMP库 +os.environ['DYLD_LIBRARY_PATH'] = '/opt/homebrew/opt/libomp/lib:' + os.environ.get('DYLD_LIBRARY_PATH', '') + +import pandas as pd +import numpy as np +import warnings +warnings.filterwarnings('ignore') + +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler, OneHotEncoder +from sklearn.compose import ColumnTransformer +from sklearn.pipeline import Pipeline +from xgboost import XGBClassifier +import joblib + +# 数据路径 +DATA_PATH = "../data/心血管疾病.xlsx" + +def load_and_process_data(): + """ + 加载并处理心血管疾病数据,与Module1保持一致 + 返回处理后的DataFrame + """ + try: + # 尝试多种路径 + possible_paths = [ + DATA_PATH, + os.path.abspath(DATA_PATH), + os.path.abspath(os.path.join(os.path.dirname(__file__), DATA_PATH)), + os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "data", "心血管疾病.xlsx")), + os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "data", "心血管疾病.xlsx")) + ] + + data_path = None + for path in possible_paths: + if os.path.exists(path): + data_path = path + print(f"找到数据文件: {path}") + break + + if data_path is None: + print(f"未找到数据文件,尝试过的路径: {possible_paths}") + return pd.DataFrame() + + # 加载数据 + df = pd.read_excel(data_path) + + # 1. 特征工程 + # 将age(天)转换为年,四舍五入 + df['age_years'] = (df['age'] / 365.25).round().astype(int) + + # 计算BMI: weight / (height/100)^2 + df['bmi'] = df['weight'] / ((df['height'] / 100) ** 2) + + # 2. 异常值处理 + # 删除舒张压 >= 收缩压的记录 + df = df[df['ap_lo'] < df['ap_hi']].copy() + + # 删除血压极端异常值 + # 收缩压 ∈ [90, 250], 舒张压 ∈ [60, 150] + df = df[ + (df['ap_hi'] >= 90) & (df['ap_hi'] <= 250) & + (df['ap_lo'] >= 60) & (df['ap_lo'] <= 150) + ].copy() + + # 3. 类别转换 + # cholesterol转换 + cholesterol_map = { + 1: 'normal', + 2: 'above_normal', + 3: 'well_above_normal' + } + df['cholesterol_cat'] = df['cholesterol'].map(cholesterol_map) + + # gluc转换 + gluc_map = { + 1: 'normal', + 2: 'above_normal', + 3: 'well_above_normal' + } + df['gluc_cat'] = df['gluc'].map(gluc_map) + + # BMI分类 + def categorize_bmi(bmi): + if bmi < 18.5: + return 'underweight' + elif 18.5 <= bmi < 25: + return 'normal' + elif 25 <= bmi < 30: + return 'overweight' + else: + return 'obese' + + df['bmi_category'] = df['bmi'].apply(categorize_bmi) + + return df + + except Exception as e: + print(f"数据加载失败: {e}") + return pd.DataFrame() + +def prepare_features_target(df): + """ + 准备特征和目标变量 + 删除id和原始age字段 + """ + # 删除不需要的列 + features = df.drop(['id', 'age', 'cardio'], axis=1) + target = df['cardio'] + + return features, target + +def build_pipeline(): + """ + 构建预处理和建模的Pipeline + """ + # 定义特征类型 + numeric_features = ['height', 'weight', 'ap_hi', 'ap_lo', 'bmi', 'age_years'] + categorical_features = ['gender', 'cholesterol_cat', 'gluc_cat', 'smoke', 'alco', 'active', 'bmi_category'] + + # 构建ColumnTransformer + preprocessor = ColumnTransformer( + transformers=[ + ('num', StandardScaler(), numeric_features), + ('cat', OneHotEncoder(drop='if_binary', sparse_output=False, handle_unknown='ignore'), categorical_features) + ]) + + # 构建完整Pipeline + pipeline = Pipeline(steps=[ + ('preprocessor', preprocessor), + ('classifier', XGBClassifier( + n_estimators=100, + max_depth=5, + learning_rate=0.1, + subsample=0.8, + colsample_bytree=0.8, + random_state=42, + eval_metric='logloss', + use_label_encoder=False + )) + ]) + + return pipeline + +def evaluate_model(model, X_test, y_test): + """ + 评估模型性能 + """ + from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score + + y_pred = model.predict(X_test) + y_pred_proba = model.predict_proba(X_test)[:, 1] + + accuracy = accuracy_score(y_test, y_pred) + precision = precision_score(y_test, y_pred) + recall = recall_score(y_test, y_pred) + f1 = f1_score(y_test, y_pred) + roc_auc = roc_auc_score(y_test, y_pred_proba) + + print(f"模型评估结果:") + print(f" 准确率: {accuracy:.4f}") + print(f" 精确率: {precision:.4f}") + print(f" 召回率: {recall:.4f}") + print(f" F1分数: {f1:.4f}") + print(f" ROC AUC: {roc_auc:.4f}") + + return { + 'accuracy': accuracy, + 'precision': precision, + 'recall': recall, + 'f1': f1, + 'roc_auc': roc_auc + } + +def main(): + """ + 主训练流程 + """ + print("=" * 60) + print("CardioAI - 心血管疾病预测模型训练") + print("=" * 60) + + # 1. 加载和处理数据 + print("\n1. 加载和处理数据...") + df = load_and_process_data() + + if df.empty: + print("❌ 数据加载失败,请检查数据文件路径") + return + + print(f" 处理后的数据形状: {df.shape}") + print(f" 阳性样本比例: {df['cardio'].mean():.2%}") + + # 2. 准备特征和目标 + print("\n2. 准备特征和目标变量...") + X, y = prepare_features_target(df) + print(f" 特征数量: {X.shape[1]}") + print(f" 样本数量: {X.shape[0]}") + + # 3. 划分训练集和测试集 + print("\n3. 划分训练集和测试集...") + X_train, X_test, y_train, y_test = train_test_split( + X, y, test_size=0.2, random_state=42, stratify=y + ) + print(f" 训练集大小: {X_train.shape[0]}") + print(f" 测试集大小: {X_test.shape[0]}") + + # 4. 构建和训练Pipeline + print("\n4. 构建和训练Pipeline...") + pipeline = build_pipeline() + + print(" 开始训练模型...") + pipeline.fit(X_train, y_train) + print(" 模型训练完成!") + + # 5. 评估模型 + print("\n5. 评估模型性能...") + metrics = evaluate_model(pipeline, X_test, y_test) + + # 6. 保存模型 + print("\n6. 保存模型...") + model_path = os.path.join(os.path.dirname(__file__), "cardio_predictor_model.pkl") + model_dir = os.path.dirname(model_path) + + # 确保目录存在 + if model_dir: + os.makedirs(model_dir, exist_ok=True) + + # 保存模型 + joblib.dump(pipeline, model_path) + print(f" 模型已保存到: {model_path}") + + # 7. 打印特征信息 + print("\n7. 特征信息:") + print(" 连续特征: height, weight, ap_hi, ap_lo, bmi, age_years") + print(" 分类特征: gender, cholesterol_cat, gluc_cat, smoke, alco, active, bmi_category") + print(" 总特征数: 13个原始特征 → 预处理后更多") + + # 8. 验证模型加载 + print("\n8. 验证模型加载...") + try: + loaded_model = joblib.load(model_path) + test_pred = loaded_model.predict(X_test.iloc[:1]) + print(f" 模型加载成功! 测试预测: {test_pred[0]}") + except Exception as e: + print(f" 模型加载失败: {e}") + + print("\n" + "=" * 60) + print("✅ 模型训练和保存完成!") + print("=" * 60) + +if __name__ == "__main__": + main() \ No newline at end of file