这几天一直想总结一下课题的思路和一些构想,正好借着最近找实习学习的机会回顾了一下用过的模型和方法。好像现在基于多生理信号进行情绪识别的课题渐渐发展起来,所以给正入坑的同学一些研究思路吧。文章可能很多地方是自己口语写的,不够学术。
一、简介
首先介绍一下什么是情绪识别,什么是多生理信号。情绪一定要和情感分开,情绪(mood)是指的顺时或者短时的情绪波动,而情感(emotion)是指一个人长时间的状态。很多文章包括中文英文都把这个要点混淆了,想要检测情感是一件很难的事,至少暂时不太可能,所以我们主要是针对情绪进行识别。
多生理信号指的是常用的一些医学上的生理信号如:EEG、ECG、HRV、SC、PPG、EMG(肌电这个是真不好用,不知道为什么很多文章都用了)等。很多时候我们看文章都有一句话:生理信号是人体副交感神经的反应,是无法掩盖的。。。具体是不是还真不确定,不过我个人分析利用多生理信号有几个好处:隐私性好不会像脸那样泄漏隐私、现在随着穿戴式的发展生理信号的获取变得简单(准确性待提高)、对于这些多生理信号有许多医学上成熟的特征或是代表意义能够比较好的解释情绪的发生。当然利用多生理信号还能检查人的健康性。
针对情绪识别公认做的最好的应该是MIT的Picard可以看看她实验室的一些论文,不过虽然比较出名,但是个人来看可能在情绪识别上他们实验室应该不是最出色的,因为遇到过很多更好的文章。
二、难点
基于多生理信号的情绪识别有几个难点:
1、生理信号的处理比较复杂,很多很多去噪算法都在提出。
如果你们信号采集设备很出色,那么你们做的工作就会少一些,如果不是那就有的做了,因为生理信号毕竟是一个比较精确的信号,一点噪声就可能引起很大的变化。就噪声而言,每种信号都有自己独特的去噪方法,我也是属于调用代码包的人,个人的信号处理水平真的处理不好这种信号。通常的噪声就那几种:由于传感器移动产生的运动伪迹、工频噪声(50Hz)、基线漂移。后两种还比较好处理,运动伪迹真是头疼,前几天看到一种用机器学习方法识别运动伪迹并去除的方法,个人感觉不一定好用,不过不失为一种方法。
2、情绪的定性问题。
目前的情绪就两大类定性方法:离散情绪定义和维度情绪定义。不管哪种定义都需要一个自评估或者是人工打标签的过程,这就给情绪识别的整体框架带来了很大的主观性。而且现在心理学上也没说那种方法好,但是从实验的角度而言,离散情绪在情绪种类少且明确的时候识别效果比较好(但不等于这样就好,因为只是在实验场景下的结果,真的到了现实不可能人就有比如高兴或悲伤两种情绪,一个针对几种特殊情绪的模型个人感觉是过于狭隘了)。利用维度情绪是现在的大趋势,很多文章都在用,因为这样情感描述的比较模糊,带一点误差也是允许的,但是也就是说情绪的定性更加不确定了。总之这一问题不解决,情绪识别这么大的命题就不可能完成。
3、生理信号的个人差异问题。
用生理信号建模型的时候最恶心的地方就是个人差异。有的数据库就针对一个人建的模型,这样效果很好。可是一到多个人识别度就差的要命。一个场景可能有的人反映强烈有的人毫无波动,生理信号也是一个人可能血压心跳本来就快,总不能就说是有情绪变化。这个目前我个人认为有两种方法解决,一个就是检测一个平静状态下的基础状态,与情绪状态下特征规则化一下(这个方法我现在在用,但是效果不好不坏,有点提升但是不多)。另一个就是建立一个单独的个人模型,多给这个人测一些数据建模,识别时根据这个人有没有历史数据,有的话就用个人模型,没有就用上面那种规则化模型。(这里讲的不是很明白我也知道)
三、整体流程
四、建模过程具体叙述
建模思路:如果你也用的是维度模型那下面的模型思路你也可以试试。假设用效价(valence)唤醒度(arousal)模型。
分类or回归
其实这个问题用什么都可以,比如你可以把效价唤醒度分为4类:HVHA高效价高唤醒度、HVLA、LVHA、LVLA四种,也可以用两个标签,变为两个二分类问题(这里只是举个例子,你如果分高低中三种也可以)。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
特征首先要进行归一化,毕竟是不同信号,可能量纲也不一样,
这里叙述一下为什么要进行归一化:
首先要知道,能不归一化最好不归一化。归一化主要针对量纲不同的特征进行。
有些模型在进行不均匀的伸缩之后,最优解与原理不等价(如SVM)。因为SVM用的欧拉距离,一个很大的值就会使其他特征失效
有些模型伸缩后和原理差不多(如LR,只要调整权重就好了)。但是因为一般用的都是梯度下降求解,如果目标函数太扁就可能不收敛,所以也需要归一化。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、分类。
这里针对分类的思路可以用的模型有很多,但是无论分类还是回归都要遵循一个原则就是模型的可解释性,也就是不要破坏原来特征,因为这样可以通过模型结果分析特征,而所有特征都带有其生理意义。不破坏可解释性的模型有:逻辑回归、决策树、甚至XGBoost等,还可以向更有深度的角度发展:多标签学习(正好我们有两个标签)、多任务学习(后面论述)等。这些模型各有特点,首先从最简单的模型线性回归说起。
逻辑回归:优点模型简单,训练速度比较快。缺点:在样本数少特征多的情况下有很严重的过拟合也就是需要规则化、线性模型不能处理非线性(可以用映射的方法解决,但是怎么映射是个问题)、而且由于我们的生理特征之间可能有很明显相关性产生多重共线性这也使得模型会有失真。这里不得不提的是一种规则化方法叫弹性网络,大概思想就是如果单纯用LASSO进行规则化会把相关的特征只取一个,而先用Ridge减小系数降低过多重共线性的问题后,就可以用LASSO进行选择,这时的特征既能够保证有相关性的特征没有完全去掉,又能够提高模型稳定性。再加上逻辑回归在处理非线性连续的数据时需要进行特征离散化,以保证能够 更准确的拟合数字(这个我接下来会分析一下离散化和不离散化的区别)。
决策树:可以使用CART树因为GINI指数已经证明了是有效的一种方式。用决策树的好处是因为决策树是非线性的分类器,而且对特征之间的相关性不是很敏感,再加上不需要进行特征离散化,所以总的来说还是比较方便的,当然最好的还是决策树的可视化形式,非常适合进行特征分析。当然决策树也有其缺点,首先是容易过拟合,而且决策树是一种利用贪心思想构建的,以局部的最优化为主,没有考虑整体性。而且决策树是一种离散的模型,不需要进行特征的离散化。
随机森林:一种树的混合方法吧。
XGBOOST:用这个有点大材小用了,不考虑了。
总之各有缺点,但是可能用逻辑回归处理时需要进行的工作更多一点,但是怎么才能够利用树和逻辑回归两者的优点进行识别是我一直在想的。我之所以没有使用SVM或是其他的分类方法,是因为首先逻辑回归很快,再有就是模型比较直观,解释性比较好适合做分析。没有用降维的思路和这个是一样的。
我的想法是首先用随机森林或是决策树对所有的特征进行一个建模,利用这个模型的结果进行人工的特征选择,选择那些表现优异的特征作为逻辑回归所使用的特征。这种方法虽然比较初级,但是毕竟是起始阶段,尝试一下未尝不可。比如我们有100个特征,利用树选择了40个有效的特征,又能降维去除一定的多重共线性,又能对所有的特征进行一下人工理解,这是不错的。
再加上两种新的方式我在这里给个思路,一种是多标签学习,一种是多任务学习。
多标签学习是指我们因为有几个维度标签,所以想尝试能不能利用标签之间的相似性对模型做一个提升,多标签的方法有很多可以自己查一查,但是我个人水平有限自己实现不了,所以可以用sklearn的工具包试一试。
多任务学习,这个我感觉有很大的潜力,想法就是利用每一个任务之间的相似性对模型进行提升。任务是指一个识别任务,比如我有10个人的数据,每个人有100个数据,那么我当然可以把对每个人的识别当成一个任务,然后分别进行建模识别。但是如果多任务的思路就在于把这10个任务结合起来,利用任务之间的相关性提升整体的性能。多任务的方法也有很多,现成的工具包也有,但是这个方法比较难,资料比较少,而且需要的数据相对比较大。不过我们再一想现在有很多关于情绪识别的数据库,我们用这种方法正好能把所有的数据库结合起来使用,这样数据量顿时就增加了,我相信还没有人这么做过(可能是我读的论文太少)。
2、回归
回归的大体思路和分类差不多,回归针对的是离散模型,而且用了自评表这种东西得到了一堆连续的值表示情绪。用回归也可以先得到回归的值,在把这些值离散化得到类别标签,这里就不介绍了。
就这么多,后面想到了再写