system: [SYSTEM]

user: 2. 数据和分析方法 2.1. 数据来源 本数据来源某体检医院，包含两个数据表，分别是MEDICAL_DIAG_EXPORT2010和MEDICAL_ INO_EXPORT2010，MEDICAL_INO_EXPORT2010为体检项目记录表，含有数据记录3，529，829条，MEDICAL_DIAG_EXPORT2010为体检诊断结果表，含有数据记录202，203条 [ 5 ]。利用Python的Pandas模块提取并转换为Dataframe格式，数据基本情况如表1、表2所示。 Table 1 Results of physical examinatio 列名 类型 非空条目数 病人ID Int64 202，203 体检号 Int64 202，203 性别 Object 202，203 年龄 Int64 202，203 诊断名称 Object 202，197 诊断类型 Object 202，203 表1. 体检诊断结果表 Table 2 Items of physical examinatio 列名 类型 非空条目数 病人ID int64 3，529，828 性别 Object 3，529，828 年龄 Int64 3，529，828 项目名称 Object 3，529，828 检查结果 Object 3，469，105 参考范围 Object 2，019，933 异常提示 Object 2，279，112 诊断标志 Float64 587，979 表2. 体检项目表 2.2. 数据预处理 2.2.1. 缺失值处理 体检信息数据中45，375例体检者原始数据进行初步筛选，设定阈值剔除缺失值超过体检者2/3的体检指标，剩余102项指标，同时加入“年龄”连续变量数值指标。针对体检诊断结果表格，将“诊断类型”数量为0的患者归为“健康”，用“0”编码；诊断类型数量大于0的为“非健康”，用“1”编码。数据显示，这种归类下健康的病例为25，543例，非健康的病例为19，832例。 2.2.2. 异常值处理 体检信息表诊断标志作为分类变量，存在小数的异常情况，取其整数部分。 连续变量中的年龄数值，如图1所示，存在197岁的异常值，使用中位数替换。同时1岁的体检数据最多，初步推断是婴幼儿体检，而[2， 16]这个年龄区间内数量很少，如果特征没有离散化，可能用户年龄增长一岁就会产生完全不同的输入，会给模型造成很大的干扰。为了让模型具有更好的鲁棒性，应用kmeans聚类方法进行连续变量离散化，分为6个区间：[0， 13.6]，[13.6， 31.1]，[31.1， 41.1]，[41.1， 52]，[41.1， 52]，[52， 65]，[65， 99]，对应年龄_0到年龄_6，同时按照表3对区间独热(one-hot)编码化代替对数值变量的归一化 [ 6 ]。 图1. 年龄分布图 Table 3 Binning and one-hot encoding of age 年龄区间 独热编码：[年龄_0，年龄_1，年龄_2，年龄3，年龄_4，年龄_5] (0，13.6] [1， 0， 0， 0， 0， 0] (13.6，31.1] [0， 1， 0， 0， 0， 0] (31.1，41.1] [0， 0， 1， 0， 0， 0] (41.1，52] [0， 0， 0， 1， 0， 0] (52，65] [0， 0， 0， 0， 1， 0] (65，99] [0， 0， 0， 0， 0， 1] 表3. 年龄值分箱以及对应独热编码 采用独热编码，将一个很大权值管理一个特征，拆分成了许多小的权值管理这个特征多个表示，例如 x 1 表示原本的连续型特征(年龄)，离散化后拆分为3个特征 θ 1 ， θ 2 ， θ 3 ，分别用权重参数 w 1 ， w 2 ， w 3 进行管理，见公式(1)，使得参数管理的更加精细，降低了特征值扰动对模型为稳定性影响。 p = w 1 x 1 + b → p = w 1 θ 1 + w 2 θ 2 + w 3 θ 3 + b #(1) 2.2.3. 非数值变量处理 某些体检指标的分类变量是离散的，比如“阴离子间隙”这一个指标中，0代表正常，1代表偏低，2代表偏高，而数值大小和真实的数值大小无关，本质上属于非数字列值，同样需要对数据变量独热(one-hot)编码化处理。处理后的“阴离子间隙”这一列数据将扩充为3列，如表4所示分别是“阴离子间隙_正常”“阴离子间隙_低”“阴离子间隙_高”。 Table 4 One-hot encoding and expanded columns of taxonomic variabl 原列“阴离子间隙”分类数值 独热编码：[阴离子间隙_正常，阴离子间隙_低，阴离子间隙_高] 0 [1， 0， 0] 1 [0， 1， 0] 2 [0， 0， 1] 表4 分类变量独热编码扩增列 经过独热编码化加工处理后，提取的二元逻辑变量为180个。 2.3. LASSO回归模型 LASSO (The Least Absolute Shrinkage and Selection Operator)回归是一种线性回归的缩减方法(也称正则化)，将回归系数收缩在一定的区域内 [ 7 ]。LASSO回归的特点是在拟合广义估计方程的同时进行变量筛选和复杂度调整，从而有效解决变量共线性问题并最终获得精简的统计模型。 [ 8 ] Huang等 [ 9 ] 利用LASSO从150多个临床指标中筛选出24个关键指标并以此开发并验证了影像组学联合CT和临床危险因素列线图模型，用于预测结直肠癌术前淋巴结转移的风险。LASSO的主要思想是在残差平方和上添加惩罚函数来限制权重 w 1 ，以此来压缩和简化模型，也就是特征筛选。因此我们在LASSO回归中损失函数上添加一个惩罚项 ∑ i = 1 n | w i | ，m是样本个数，n是特征个数，那么损失函数 f ( w ) 是： f ( w ) = 1 2 m ∑ i = 1 m ( y i − y i ^ ) 2 + λ ∑ i = 1 n | w i | #(2) LASSO回归模型在大规模数据变量模型中具有良好的变量选择性质，当残差平方 λ T λ 很小的时候，一些自变量的系数会随着变为0，这样不仅可以筛选出线性回归模型中具有多重共线性的特征，还能通过量化的权重来直观地展示体检指标对健康的影响情况。 2.4. 健康指数模型 与金融风险控制领域的个人信用风险评分类似，体检健康领域同样需要评分模型的稳健性和可解释性。但是在输入数据上，体检分类指标数据和历史信用记录数据相比，具有离散化的特点，更加适合结合LASSO回归模型的信用评分卡。因此在个人信用风险评分模型 [ 10 ] 的基础上，将预测模型由梯度集成决策树改进为LASSO回归模型，增加评分卡的可解释性，同时结合体检的应用场景和输入数据，建立体检评分模型。评分卡的分值刻度将分值Score表示为比率对数的线性表达式： Score = A − B * log ( odds ) #(3) 其中，A为补偿，B为刻度，都为常数。 odds = p 1 − p #(4) p = w 1 X 1 + w 2 X 2 + w 3 X 3 + ⋯ + w n X n + b = W T X + b #(5) 其中 X n 表示体检者各项检测指标，p由LASSO线性回归模型得到，取值范围[0， 1]，表示非健康的概率。引入违约翻倍系数PDO，即当odds (非健康：健康比例)为两倍的时候，分数为Score + PDO： Score + PDO = A − B * log ( 2 * odds ) #(6) 需要计算参数A，B，解两个方程，得到： B = PDO ln ( 2 ) #(7) A = Score 0 + B * ln ( odds 0 ) #(8) odds 0 为基准坏/好比例，这里取非健康/健康比例，得到 odds = 19832 25543 = 0.776416 。为了将大部分的分数限制在100分以内， ln ( odds 0 ) = − 0.253066 设置基准分 Score 0 = 70 ， PDO = 20 。代入公式(7) (8)得到 A = 62.698 ，   B = 28.854 。