
我做行为感知方向这几年手头翻来覆去用的公开数据集不算少但如果有人问我“哪个数据集最适合入门大学生心理健康与行为建模”我的答案基本不会变StudentLife 数据集。这个由达特茅斯学院团队在 2013 年春季学期发起的纵向研究用 Android 手机后台传感器持续跟踪了 48 名本科生的整个学期覆盖 GPS、加速度计、通话记录、应用使用、蓝牙扫描同时配合每日生态瞬时评估EMA和 PHQ-9、PSS 等心理量表最后还能拿到学校教务处提供的 GPA 数据。换句话说它把“人这一学期是怎么过的”这件事从物理轨迹到心理状态全部数字化了。这篇文章我就从数据设计、传感器结构、申请流程到实际建模的踩坑经验完整拆一遍这个数据集给做行为感知、可穿戴计算、计算精神健康方向的同学一份可以直接照着上手的指南。1. 数据集整体设计与研究背景1.1 StudentLife 到底在研究什么先说清楚它解决的原始问题。大学阶段是心理问题高发期学业压力、社交变化、作息紊乱都会直接影响学生状态但传统心理学研究要么靠问卷回顾要么靠实验室环境下的短期测量很难捕捉到真实生活中持续数周甚至数月的行为变化。StudentLife 的设计思路很直接既然学生几乎整天带着智能手机那就用手机里的传感器持续记录行为痕迹再把这些行为信号和每日自我报告的心理状态、学期末的学业成绩做关联从而回答“行为模式如何反映心理健康”和“能不能用被动感知预测学业表现”这两个核心问题。所以这个数据集不是简单的“手机传感器日志”而是一套完整的研究设计感知层传感器、主观报告层EMA 和心理量表、结果层GPA、期末成绩。三层数据都能按时间对齐到同一个人身上这一点在当时的公开数据集里非常少见。1.2 为什么这个数据集到现在依然能打我第一次接触这个数据集是 2018 年当时觉得 2013 年的数据可能已经过时了。但实际用下来发现它在很多场景下反而是最合适的真纵向设计10 周持续跟踪不是几小时或者几天的短程采集能支撑时间序列分析和个体内部变化研究。多模态对齐同一批被试同时有客观传感器和主观量表避免了“只拿着加速度计猜心情”的尴尬。有真实标签GPA、学期绩点这些是硬标签不像众包标注那样有主观偏差。规模适中48 人完整数据对计算精神健康方向来说是一个足够跑通全套 pipeline、又不至于像 MIMIC 那样需要重型基础设施的规模。更关键的是这个数据集几乎成了该领域的“基准盘”。论文里做对比实验时StudentLife 经常和 Trier Social Stress Test 采集的数据、或后来一些自采的感知数据集一起出现作为“自然场景纵向感知”的代表。哪怕现在多模态大模型和数据采集平台已经很成熟想找一个有完整心理量表被动传感器学业结果的开放数据StudentLife 依然是绕不开的选择。2. 传感器数据类型与原始结构2.1 Android 后台采集的整体框架整个采集工作由一部 Android 手机上预装的 StudentLife App 完成后台静默记录。2013 年左右的 Android 机型内存和电池管理远没有现在智能App 在后台被杀掉的情况很常见所以数据里会有些断档GPS 在室内也经常丢信号。这一点在后续数据处理时必须提前做应对不能拿着原始 CSV 直接建模。数据最终以 CSV 格式按被试、按传感器类型组织每类传感器一个文件夹文件夹里按天或按时间段切分文件。原始数据不直接提供“已经清洗好的特征表”而是把最底层的记录交给你由你自己完成清洗和特征工程。2.2 传感器数据的字段含义我挑几个核心传感器把它们的字段和实际使用时的注意点列出来传感器类型关键字段典型频率数据处理注意点GPS经纬度、时间戳、精度几分钟一次或位置变化时室内丢星严重先做精度过滤一般保留精度小于 50 米的点加速度计三轴加速度 x/y/z、时间戳20Hz 左右需要按滑动窗口切分计算均值、方差、频域能量等特征蓝牙扫描附近蓝牙设备 MAC、时间戳、RSSI扫描到即记录MAC 已做匿名化但仍可用于估计社交接近性通话/短信日志通话方向、时长、时间短信方向事件触发注意区分“主动交流”和“被动通知”应用使用前台应用名/包名、开始时间切换时触发用于推断学习、娱乐、社交的时间分配屏幕亮灭屏幕开关事件和时间戳事件触发是判断昼夜节律和睡眠时间的重要来源2.3 辅助感知数据通话、短信、应用使用的价值很多人一上来只盯着 GPS 和加速度计把通话记录和短信记录当成“隐私负担”扔到一边这挺可惜的。实际上在 StudentLife 后续的分析里通话时长、短信条数、以及每天解锁手机的次数是和压力水平相关性最高的几个特征之一。我当时做压力回归实验时把“每天主动拨出电话的时长”和“每天前台使用社交类应用的时长”作为两个特征加进模型R² 直接提升了 0.08 左右。背后的逻辑也好理解一个人在压力大的时候社交模式会发生明显改变——要么回避社交要么频繁向熟人倾诉。这些信号在 GPS 轨迹里很难体现但通话和应用使用记录可以很直观地捕捉到。2.4 GPS 与蓝牙带来的隐私边界这一节我得单独拎出来说因为它涉及数据使用合规。StudentLife 在发布时对 GPS 轨迹和蓝牙 MAC 做了脱敏处理但脱敏后的数据仍然属于敏感个人信息范畴因为从这个数据里完全可以反推出一个人常去的教学楼、图书馆、食堂以及他每天和谁在物理上接近。在论文中使用时必须如实声明数据用途并遵守申请时签署的使用协议。千万别为了做 demo 就把 GPS 可视化图直接截到论文里真要展示的话建议先做网格化或加噪声处理。另一个更务实的建议是建模时尽量用聚合特征比如回家时间、在校时间、出行熵不要直接输入原始 GPS 轨迹这样既保护被试隐私又能避免模型过拟合到不重要的地点细节。3. 非传感器数据EMA、量表、GPA3.1 EMA 生态瞬时评估EMAEcological Momentary Assessment是在真实生活场景中反复采集被试当下状态的方法用来减少回忆偏差。StudentLife 的做法是在学期中的固定时间点比如每天中午、傍晚App 弹出简短问卷问被试当前的压力水平、情绪状态、疲劳程度、社交满意度等。这里有一个很值得留意的细节EMA 数据是“按时间点采集”的不是“按天汇总”的所以你可以把上午的 EMA 压力和前一天的睡眠时长、当天的运动量做对齐。我做时序分析时发现前一天晚上的睡眠时长对第二天上午的压力评分有显著预测作用但如果按天平均就很容易丢掉这种滞后效应。EMA 数据的缺失率通常不低因为学生可能在上课、开会或者干脆不想点。处理时不要做简单的均值填充建议用时间戳最近的一次 EMA 做 forward-fill或者直接按“个体-天数”重建平衡面板缺失值在模型中做掩码处理。3.2 PHQ-9、PSS 等心理量表除了每天的 EMA数据集中还有在入组时和出组时采集的标准化心理量表最核心的是 PHQ-9抑郁筛查量表和 PSS感知压力量表。这两个量表是计算精神健康研究里最常用的“金标准”标签。PHQ-9 的总分范围是 0-27一般以 10 分为界筛查抑郁倾向。我在实际实验中除了直接回归 PHQ-9 总分还喜欢把它二值化成“是否超过临床阈值”比如 ≥10然后在分类任务下对比不同特征组的 AUC。这样既照顾了临床可解释性又避免了回归任务中分数分布偏斜带来的训练不稳定的问题。需要提醒的是量表数据只有两次测量学期初和学期末属于典型的“少样本标签”。你不能拿它做逐日预测更适合的研究设计是用学期中的被动传感器数据构造整学期特征预测学期末的心理状态或 GPA。换句话说StudentLife 的量表数据是“结果标签”不是“逐日标签”。3.3 学业表现数据与时间戳对齐学业表现部分提供的是 GPA 和部分课程成绩。我对齐数据时的做法是先算出每个被试从学期开始到 EMA 时间点之间的累积平均绩点趋势再把这个趋势特征和传感器行为特征放在一起预测期末 GPA 区间。这么做比直接预测绝对 GPA 值稳定很多因为绝对 GPA 受课程难度和选课结构影响很大而趋势特征能更好地反映“这个学生本学期状态是在上升还是下滑”。由于学业数据来自教务处采样粒度通常是整学期的时间对齐的精度要求不高但要特别注意学期初的 GPA 和学期末的 GPA 不能混用。如果论文里要区分“基线状态”和“结果状态”务必说明你用的是哪个时间点的成绩。4. 申请获取与本地化预处理实操4.1 申请流程与合规要求StudentLife 数据集不是直接点击下载的匿名公开资源需要通过官方研究门户提交申请。大体流程是访问达特茅斯学院的 StudentLife 研究项目页面找到数据请求入口或联系邮箱。提交一份简短的研究说明写清楚你的机构、研究目的、计划使用的字段、数据保存方式。签署数据使用协议DUA承诺仅用于非商业学术研究不尝试重新识别被试不公开原始数据。等待审核通过后获取下载链接或网盘访问权限。整个周期我遇到过从三天到三周不等的快慢取决于教授团队的审核节奏。建议申请时直接把研究方案写清楚尤其是“不会做个体识别”“不会公开 MAC 或 GPS 原始轨迹”这两点写进去通过率会明显提高。4.2 目录结构与文件命名规律拿到压缩包解压后目录大致按被试编号组织比如u00、u01一直到u48左右每个被试文件夹下按传感器类型分子目录。文件名里通常包含传感器名和日期段但不同版本的发布包在命名上略有差异。我自己习惯先写一个脚本把所有 CSV 的文件头打印出来确认字段名再决定后续处理。有一个合理的猜测是团队在公开版本里尽量保持了字段命名的一致性但你还是要在自己的 pipeline 里加一层“字段适配器”避免换一台机器或换一个数据版本之后脚本全部报错。4.3 时间对齐和缺失值处理的关键思路多模态数据整合的最大坑就是时间对齐。不同传感器的事件时间戳精度不一样GPS 可能几分钟一个点加速度计每秒几十个点EMA 一天只有几次。我的处理思路是把整个学期按 1 小时或 1 天为粒度切分时间窗。对每个时间窗为每个模态分别聚合特征比如该小时的平均加速度方差、GPS 总位移、蓝牙扫描到的唯一设备数。再把多模态特征横向拼接成一张宽表行是“被试-时间窗”列是“各模态特征”。EMA 和量表作为标签列按时间戳匹配到对应时间窗。缺失值处理上我试过删除缺失严重的被试、也试过用群体均值填充最终发现效果最稳的是“特征工程时就避免产生缺失”。比如 GPS 缺失频繁时不要直接用地点的经纬度作为特征而是用“该小时内有效 GPS 点数”和“该小时最大位移距离”这种对缺失不敏感的统计量。4.4 Python 快速上手示例下面给一段我常用的数据加载和特征聚合的示例代码结构很清晰拿到数据集后可以直接替换路径使用import pandas as pd import numpy as np from datetime import datetime def load_ema_data(file_path): 加载EMA数据并解析时间戳 df pd.read_csv(file_path) df[timestamp] pd.to_datetime(df[timestamp]) df df.sort_values(timestamp) return df def aggregate_sensor_by_hour(df, time_coltimestamp, value_cols[x,y,z]): 将细粒度传感器数据按小时聚合成特征 df[hour] df[time_col].dt.floor(h) grouped df.groupby(hour)[value_cols].agg([mean,std,min,max]) grouped.columns [_.join(col).strip() for col in grouped.columns.values] grouped grouped.reset_index() return grouped # 示例: 对加速度计数据做小时聚合 # accel pd.read_csv(u01/accel.csv) # accel[timestamp] pd.to_datetime(accel[timestamp]) # hourly_accel aggregate_sensor_by_hour(accel, value_cols[x,y,z]) # print(hourly_accel.head())这个小片段虽然简单但能覆盖大部分“先聚合再建模”的需求。如果你要做更精细的特征比如频域特征可以用 scipy 的welch方法在窗口内计算功率谱密度再取频段能量作为特征实测对压力分类任务有不错的提升。5. 典型科研方向与扩展玩法5.1 预测 GPA——经典基线任务StudentLife 论文里最知名的任务之一就是用传感器行为预测学期 GPA。研究者们发现仅仅使用 GPS 轨迹的不规律性、睡眠时长、课堂出勤模式这几个基础特征就能解释 GPA 差异中相当大的一部分。我在复现时用的特征组合是每日步数变异系数、平均睡眠时长、每天首次离开宿舍的时间用 GPS 居住点聚类得到、每天解锁手机次数、通话时长占比。用随机森林回归做五折交叉验证比直接用全部传感器原始特征效果更好。这给我的启发是把特征做成“有行为含义的统计量”比盲目堆特征重要得多。5.2 压力与抑郁倾向识别压力识别是另一个核心方向。这里的关键不是用什么高端模型而是怎么构造标签。如果直接用 PHQ-9 总分做回归容易遇到分数集中在中低区间导致回归不稳定如果转成二分类则需要注意正负样本比例因为 48 人里高分人群通常偏少。我推荐的做法是“回归阈值”两步走先预测 PHQ-9 分数再按分数的预测区间映射到风险等级。这样既保留了分数的连续信息又能输出临床可解释的风险等级。5.3 作息、运动、社交节奏分析除了预测任务这个数据集也很适合做描述性分析比如不同压力水平群体之间的每日作息差异。我当时画过一张分群体热力图横轴是 24 小时纵轴是被试颜色代表活动强度结果非常直观地看出高压力人群的夜间活跃时间更长、早晨活动启动更晚。这类分析虽然没有建立复杂的预测模型但作为论文里的动机图表效果极好。5.4 和后续公开数据集的横向对比如果你手头还有 TSU、Friends and Family、或自己采集的感知数据不妨做一次跨数据集对比实验。这里要注意不同数据集的传感器配置和标签粒度差异很大直接拼接做联合训练很容易翻车。更稳妥的做法是“先在各自的集上训练再在目标集上做迁移评估”。6. 常见问题与排查技巧实录这一节是我实际跑数据时踩过的坑汇总整理成表格方便查阅问题现象可能原因解决办法GPS 轨迹大量缺失室内丢星、手机省电模式杀进程只保留精度在 50 米以内的点用 WiFi 指纹或地点访问频率做补充特征EMA 数据分布不均被试错过弹窗提醒用前向填充不要一律删除缺失样本加速度计量纲不一致不同机型或版本 API 差异读取文件头确认单位必要时做归一化时间戳不是 UTC本地时区未统一统一转成 UTC 再做时间窗切分蓝牙扫描数据量巨大扫描频次高、设备多按小时聚合“唯一设备数”和“平均 RSSI”即可PHQ-9 分数分布偏斜健康受试者为主用阈值二分类或做分数分箱小样本过拟合只有 48 人使用留一被试交叉验证优先选择低容量模型隐私合规要求不明确申请时没说清用途主动在论文方法部分写清数据使用协议编号6.1 小样本下的模型选择与验证策略48 人的数据量对深度学习很不友好但不代表不能用复杂模型。我的经验是先把传统机器学习模型作为基线逻辑回归、随机森林、XGBoost如果效果不够再尝试浅层 MLP。小样本下最忌讳的是直接上大型模型然后拿随机种子碰运气。验证策略建议用Leave-One-Subject-Out交叉验证也就是每次留出一个人作为测试集这样能最大程度避免个体差异带来的数据泄漏。如果你按随机行划分训练测试集同一个人的数据会同时出现在训练集和测试集中模型评估结果会虚高很多。6.2 特征泄漏的几个隐蔽来源特征泄漏是这类数据集里最容易犯的错误。我遇到过的几种典型情况用学期末 GPA 反推学期中行为如果你把 GPA 转成特征参与行为预测那不是预测而是数据泄漏。用被试 ID 编码代替个体特征模型会直接死记 ID导致验证集上表现暴跌。在整个人群上做归一化后再划分训练集归一化参数包含了测试集信息等于提前看了答案。正确做法是所有归一化和特征筛选只基于训练集拟合再用同一套参数变换测试集。6.3 隐私合规自查清单最后再强调一次合规问题。在写论文和发布代码时建议你对照以下清单自查代码仓库中不包含原始 CSV 数据只保留特征工程后的表格或特征列表。论文图中的 GPS 轨迹经过网格化或加噪处理。明确标注数据来源和申请机构引用原始 StudentLife 论文。若需二次公开特征数据先征得数据集团队同意。个人一点实操体会StudentLife 数据集真正教会我的不是怎么用某个模型而是“多模态感知数据应该如何被组织、对齐和理解”。它既有完整的纵向设计又包含真实的心理量表标签这种结构在今天的开源数据里依然难得。如果你正打算做大学生心理健康、学业表现预测或者行为感知方向的研究不用犹豫直接把 StudentLife 作为第一站完整跑一遍数据预处理、特征工程、建模和评估的流程你会收获比空泛读十篇论文都要多的直觉。