Learning Sleep Quality from Daily Logs

论文题目:Learning Sleep Quality from Daily Logs (KDD2019)

一、阅读报告

​ 该文章通过让轻度(39位)和重度(3位)失眠人员佩戴运动手环来采集其睡眠及日常活动等数据,采集数据包括 14 个行为特征,例如睡眠开始、结束时间,清醒时间,小睡时间,以及卡路里消耗量、步行距离等,并通过调查的方式获得 4 个人口统计学的特征,包括年龄、性别、BMI 指数以及 ISI 指数(失眠严重指数),共计 24864 个数据点,其中缺失数据的比例为 2.83%。首先对数据进行缺失处理,接着实现了两个模型分别进行睡眠质量预测及用户失眠可能性排序。

​ 针对相关工作,作者指出在预测睡眠质量方面的 [20] 的 K 近邻方法与 [28] 中使用的机器学习与深度学习方法仅关注于预测准确率,但由于黑盒模型而缺乏解释性,而 [27] 基于多导睡眠图信号的数据进行实验,该类型数据较难获取且价格昂贵。因此,该文的贡献主要在于设计了一种不仅具有更高的预测准确率,而且具有较好的解释性的深度学习模型。同时不仅能够预测睡眠质量,还能够给不同用户根据失眠风险进行排序。该文章的模型观察到了两条规律:1. 失眠患者的行为展现了两种模式的规律性,五天与七天。2. 不仅是最近一两天的睡眠质量,周期性的睡眠习惯也对未来的睡眠习惯具有很大影响。

​ 缺失数据处理使用改进的 GAIN 模型,GAIN 是基于 GAN 的数据缺失处理方法,该文章的改进主要在模型前后的数值调节处理,以解决在应用 GAIN 时出现的数据不符合实际的情况,例如睡眠结束时间早于睡觉开始时间,负值(在该实验的任何一个特征都不符合实际),超出合理范围的过大或者过小的量,通过比较原始 GAIN、用户平均数填充和 KNN 方法,该改进的 GAIN 模型在大部分特征上的 MAE 都更小,除了 4 个特征使用用户平均数填充取得了更好的效果,在之后的实验中也将使用两种方法结合的方式进行填充。

​ 在睡眠质量预测模型中,主要分为两阶段,第一阶段使用 LSTM+Attention 的方法。LSTM 适合于用在时序数据。 Attention 机制可以帮助模型对输入的 X 每个部分赋予不同的权重,抽取出更加关键及重要的信息。使用 8 个睡眠特征加 6 个行为特征作为输入,该模型将 8 天作为一个窗口以保证一定能包含周末,因此每个用户的 batch size 为 35。同时设置 1-7 的不同的步长,通过 Attention 机制以发现哪一天对预测日的影响最大。第一阶段模型训练使用随机梯度下降加上 dropout 来最小化 MSE 损失。增加 Attention 机制有利于模型学习用户全局趋势,但是却缺失了对各个用户个人特质的考虑。因此第二阶段增加用户个人特征来更好地局部优化,以提高模型准确率和可解释性。在第一阶段训练出的结果上,将增加人口统计学特征作为输入,以发现更多个体化潜在因素对注意力得分的影响。同时对 Attention 机制增加集成模型。第二阶段使用随机梯度下降训练。该睡眠质量预测模型使用网格搜索来调节超参数,与回归方法 linear、KNN、LASSO,集成方法随机森林,深度学习方法 RNN 和 LSTM 进行比较。同时准备了空白填充、平均值填充和 Imp-GAIN 填充三种数据集。该模型加上 Imp-GAIN 数据集获得了最低 MSE。同时,基于对 Attention 得到了对模型的一定解释。大多数参与者有两种不同的周期性睡眠节奏,5 天和 7 天。5 天的原因可能是均为同一个学校的学生,受学校日程安排影响。同时发现睡眠质量的影响因素不能仅仅考虑仅两天的睡眠情况,更应注重睡眠周期性。

​ 在失眠可能性排序中,作者不使用睡眠质量预测模型得到的睡眠质量直接进行排序,是因为得到的数值结果相差很少,且直接按照该大小排序得到的准确度较低,因此提出了一种基于成对学习的排序生成方法。该方法主要分为四个步骤:1. 构建排序对:主要对两个用户的特征值作差。2. 学习序列特征和睡眠质量特征与其他特征的相互作用。前者使用 LSTM 实现,后者使用一个 Semi-Dense 层实现。3. 排序关系预测,使用 Deep Forest 加 XGBoost 实现。使用 Deep Forest 而不是用第二步的结果是因为过小的数据集不利于训练较好的神经网络,且神经网络需要调节的超参数过多。具有级联结构的深层森林通过交叉验证自适应地进行深层次验证,从而具有表示学习能力,降低了过度学习的风险。选择 XGBoost 因为与其他基于树的方法相比,模型方差更低。4. 排序生成。将用户作结点,失眠可能性对比作边作双向完整图,将其作为非对称旅行商问题进行解决。该模型与 RankNet、LambdaMart(最先进的排名学习方法)、LSTM-R(直接将每个用户的特征输入)、LSTM-B(不用第三步)、DF-XGB(仅用3、4步)进行比较,获得最好效果。

​ 针对文章存在几个问题与建议,作者在失眠可能性排序中,没有直接使用之前提出的睡眠质量预测模型得出的睡眠质量进行排序,而是提出了一种新的排序方法,但在实验部分,却没有将所提出模型与该种方法进行比较,仅比较了基于 LSTM 得出睡眠质量的方法,这部分应该增加对比实验,否则说服力不足。另外,在睡眠质量预测模型中,线性模型在平均值填充和 Imp-GAIN 填充的数据集上表现均好于其他基线方法,是否说明该数据集过小或者存在一定的问题。

二、代码阅读

1. Imp-GAIN

主要步骤如下:

  • 数据预处理:
    • 原始缺失值均为 -1,将其改为 nan。
    • 将 nan 均赋值为 0.8
    • 获取每个特征的最大最小值,用于将其归一化。
    • 将数据转为字典进行存储
    • 从字典计算每个用户以 8 为宽度的窗口数据
    • 生成 Mask Matrix,用于指示数据缺失的位置;
  • GAIN 模型:
    • Generator: 在缺失值处填入随机噪音,将 Data + Mask 作为 Generator 的输入;
    • Dicriminator: 将缺失值替换为填补值,将 Data + Hints 作为 Dicriminator 的输入;
    • 使用 Adam 优化算法最小化 MSE

GAIN 中主要包括以下三个部分:

Generator,G:它用来观察真实数据的每一部分,然后根据观察的结果填补缺失数据的部分,输出一个填补后完整的向量;
Discriminator,D:它接受一个完整的向量,来判别哪一部分数据是真实观察到的,哪一部分是被填补的;
Hint Vector,hint:它揭示了原始数据中缺失部分的某些信息,让D更加关注它所提示的部分,同时也逼迫G生成更加接近真实的数据用来填补;

在GAIN中,生成器的目标是精确的填补缺失的数据,判别器的目标是准确的分辨数据是填补的还是真实的。

2. Sleep_Efficiency_Prediction

主要步骤如下:

  • 数据预处理:主要包括删去日期、月份等字段、按照指定方式进行缺失值填补、按照窗口进行数据划分,划分训练集和测试集;
  • Phase 1:
    • 调用 Tensorflow 中的 BasicLSTMCell,同时使用了 dynamic_run,使用 step_size 作为其中的 sequence_length;
    • Attention 层:计算 query,对 LSTM 的输出进行 L2 正则化
    • 加上 Dropout
    • 单层前馈神经网络
    • 使用 Adam 优化算法最小化 MSE
  • 获取 Metadata(用户个人特征)
  • Phase 2:
    • 全连接层 + Dropout
    • Attention 层
    • 使用 Adam 优化算法最小化 MSE

3. Insomnia_Ranking

主要步骤如下:

  • 数据预处理:包括对用户数据使用最大最小值归一化;
  • 构建用户排序对,划分训练集和测试集;
  • 特征表示学习:
    • LSTM 层的输出 hidden state 乘以 input vector 得到 sequential features;
    • Semi-Dense 层使用同样的 input vector,输出表示睡眠质量属性与其他属性关联性的权重;
    • 将前两层的输出结合,输入 Dense Layer 并加 Sigmoid 进行用户对比较的预测;
    • 使用二元交叉熵和 Adam 优化算法进行预训练;
  • 排序关系预测:调用 GCForest 方法;
  • 排序生成:
    • 构建双向完成图
    • 使用贪心算法解决非对称旅行商问题

三、实验报告

实验情况

代码来源: https://github.com/Sungwon-Han/Learning-Sleep-Quality-from-Daily-Logs

执行环境:Python 3.7

所需 Packages:

  • numpy == 1.16.0
  • pandas == 0.23.4
  • pyprind == 2.11.2
  • tensorflow == 1.12.0
  • scikit-learn == 0.20.2

数据获取/选择:作者采集到的数据的具体的字段如下,前两部分来自 Fitbit 和第三部分来自调查的数据分别存储在两个文件中。因为文章作者仅给出了随机选择的四个用户的数据,因此只能通过代码进行试验,无法复现论文中的效果。

1. Imp-GAIN

参数:epoch;

先跑 8500 epoch,train loss 和 test loss 在 200 epoch 之后均只有小范围波动,不再降低,故调节到 200 epoch。

最初的 Train loss 为 0.207, test loss 为 0.26,最终的 Train loss 为 0.01783, test loss 为 0.01112。可以看到训练集和测试集上的 loss 均有一定程度的降低,但是由于作者给的数据量太少,训练会出现一定的过拟合。

2. Sleep_Efficiency_Prediction

参数:model_ name,模型名称;impute,缺失数据填补方法(可选 BLANK、Average、GAIN);LOAD,可加载存储的 phase1 和 phase 2 的模型,否则训练一个新的;printlog,打印 log 信息。

使用 GAIN 进行填充,Phase 1 和 Phase 2 均跑 400 epoch,其中 Phase 1 的七个模型(1-7 天不同长度)的训练和测试 Loss 为:

Phase\Epoch 0 200 400 Test
Phase1_1 0.762515 0.020651 0.009667 0.01216882560402155
Phase1_2 0.772904 0.014446 0.011387 0.009813605807721615
Phase1_3 0.738220 0.009667 0.011534 0.009135104715824127
Phase1_4 0.776782 0.008949 0.005299 0.006413760129362345
Phase1_5 0.744706 0.007850 0.005566 0.006769408937543631
Phase1_6 0.713259 0.006764 0.004351 0.005862790625542402
Phase1_7 0.555307 0.001845 0.001622 0.002313781064003706
Phase2 0.776782 0.776782 0.776782 0.7994117736816406

在 Phase 1 的各个模型中,均在 epoch =100 左右之后 loss 只有小范围波动。Phase 2 模型中,训练损失一直不变,应是因为只有四个人的个人特征数据,难以学习。

3. Insomnia_Ranking

参数:threshold,判断用户之间排序的阈值;main_effect_location:睡眠质量参数所在的位置;

使用 threshold 为默认值 0.006,main_effect_location 为 4。最终得到的排序结果为 [3, 2, 4, 1]。

0%