☰
传统机器学习做心电信号分类:从预处理到分类器的完整流程与实战经验
2026/10/17 3:41:38 网站建设 项目流程

1. 为什么我要从这篇心电信号分类的论文开始啃

心电信号分类这个方向,我前前后后接触了大概三年多。最开始是因为手头一个健康监测相关的项目,需要从单导联心电数据里判断异常节律,当时想得很简单——不就是把信号丢进一个分类器里跑一下吗?结果真正上手才发现,从原始信号到最终分类结果之间,每一步都有大量需要做决策的地方,而这些决策直接决定了模型能不能用。

这篇论文的标题是《Classification of ECG signals using Machine Learning Techniques》,属于比较典型的“传统机器学习方法做心电分类”的综述加实验类文章。它没有用深度学习那套端到端的思路,而是老老实实走完了“预处理—特征提取—特征选择—分类器训练—评估”这条完整链路。我之所以选择从这篇开始做阅读笔记,是因为它把传统机器学习在心电信号上的完整流程讲得比较清楚,对于刚进入这个方向、或者想理解“深度学习之前大家是怎么做”的人来说,是一个很好的起点。

心电信号分类到底在做什么?简单说,就是给一段心电波形,判断它属于哪一类——正常、房颤、室性早搏、房性早搏、左束支传导阻滞等等。这件事的难点不在于分类器本身,而在于心电信号是一种非平稳、个体差异极大、噪声干扰严重的时序信号。同一种心律失常,在不同人身上波形可能差很多;而同一个人在不同时间、不同身体状态下,正常心拍的形态也会有变化。所以这篇论文的核心价值,其实是在告诉你:在深度学习还没有统治这个领域之前,研究者是怎么通过信号处理加特征工程加传统分类器,把这件事做到可用的。

适合读这篇笔记的人,我大致分三类:第一类是做健康监测、可穿戴设备相关开发的工程师,需要理解心电分类的基本流程;第二类是刚进入生物医学信号处理方向的学生或研究者,想快速建立对这个领域的整体认知;第三类是对特征工程和传统机器学习感兴趣的人,因为心电分类是一个特征工程极其重要的场景,比很多通用数据集更能体现“好特征比好模型更重要”这句话。

接下来的内容,我会按照论文的逻辑顺序,把每个环节拆开来讲,同时补充我在实际项目中踩过的坑和总结的经验。论文本身没有展开的细节,我会基于常见实践做合理补充,并明确标注哪些是我个人的经验判断。

2. 心电信号预处理:论文里一笔带过,实际最耗时间

2.1 为什么原始心电信号不能直接拿来用

论文在预处理部分写得比较简洁,大致提了去噪和基线漂移校正。但如果你真的拿过原始心电数据,就会知道这一步有多关键。心电信号的主要噪声来源有几类:工频干扰(50Hz或60Hz)、基线漂移(由呼吸和电极移动引起,频率通常在0.5Hz以下)、肌电噪声(肌肉活动产生的高频干扰)、以及电极接触噪声。这些噪声如果不处理,后续的特征提取基本没法看。

我刚开始做的时候,犯过一个很典型的错误:拿到数据直接做R峰检测,结果因为基线漂移严重,阈值法完全失效,检测出来的R峰位置乱七八糟。后来老老实实先做带通滤波,把0.5Hz到40Hz之外的成分滤掉,R峰检测才稳定下来。这个频带的选择是有依据的——心电信号的主要能量集中在0.5Hz到40Hz之间,QRS波群的主要能量在10Hz到25Hz左右,所以40Hz的低通截止频率既能保留QRS波的形态,又能滤掉大部分肌电噪声。

论文里提到的去噪方法,常见的有几种:巴特沃斯带通滤波器、小波变换去噪、自适应滤波。巴特沃斯滤波器是最常用的,因为它通带平坦、设计简单。小波变换去噪在处理非平稳信号时更有优势,但参数选择(小波基、分解层数、阈值规则)比较依赖经验。自适应滤波主要用于处理工频干扰,但需要参考信号,实际应用中不一定方便。

2.2 基线漂移校正的几种做法与选择逻辑

基线漂移的校正方法,论文里提了中值滤波和多项式拟合。中值滤波的思路是:用两个不同窗口大小的中值滤波器串联,先提取出基线漂移的估计,再从原始信号里减掉。具体来说,先用200ms窗口的中值滤波去掉QRS波和P波,再用600ms窗口的中值滤波进一步平滑,得到的就近似是基线漂移成分。这个方法的优点是简单、不需要额外参数,缺点是在信号两端会有边缘效应。

多项式拟合的做法是:先检测出每个心拍的等电位点(通常在PR段),然后用这些点拟合一条低阶多项式曲线作为基线,再从原始信号中减去。这个方法在信号质量好的时候效果不错,但如果等电位点检测不准,拟合出来的基线反而会引入新的失真。

我在实际项目里的选择是:如果数据质量整体可控,优先用中值滤波法,因为它的鲁棒性更好,不需要依赖任何检测步骤。如果数据质量很好、且对波形形态保真度要求极高,才会考虑多项式拟合。这里有一个经验判断:中值滤波会轻微改变QRS波的形态,如果你的后续特征依赖于QRS波的精确形态(比如QRS宽度、R波振幅),那就要谨慎使用,或者在使用后重新校准特征提取的参数。

2.3 心拍分割:容易被忽视但影响巨大的环节

论文在预处理之后直接进入了特征提取,但中间其实还有一个关键步骤:心拍分割。也就是把连续的心电信号切分成一个个单独的心拍,每个心拍对应一次心跳。这个步骤通常依赖于R峰检测,而R峰检测的准确性直接决定了后续所有环节的质量。

R峰检测最经典的算法是Pan-Tompkins算法,它通过带通滤波、微分、平方、移动窗口积分、自适应阈值这一套流程来检测R峰。这个算法在MIT-BIH心律失常数据库上的检测准确率可以做到99%以上,但前提是信号质量不能太差。如果信号里有大量噪声或者形态变异,Pan-Tompkins也会漏检或误检。

我在实际使用中发现,Pan-Tompkins对参数比较敏感,尤其是自适应阈值的更新速率。如果阈值更新太快,遇到一段噪声就会把阈值拉得很高,导致后面的真实R峰被漏掉;如果更新太慢,又跟不上信号幅度的变化。我的经验是:在标准数据集上可以直接用默认参数,但在实际采集的数据上,最好先用一小段标注好的数据做参数校准,把阈值更新的学习率调到一个适合当前数据质量的水平。

心拍分割的另一个决策是:每个心拍取多长的窗口。常见的选择是R峰前250ms到R峰后400ms,总共650ms左右。这个窗口长度要能覆盖P波、QRS波群和T波。如果窗口太短,T波信息丢失,会影响那些依赖T波形态的分类任务(比如区分室性早搏和正常心拍);如果窗口太长,会引入相邻心拍的干扰。论文里没有明确说窗口长度,但根据它后续提取的特征类型,我推测应该在600ms到700ms之间。

3. 特征提取:传统机器学习在心电分类上的真正核心

3.1 时域特征:最直观但信息量有限

论文里提取的时域特征主要包括:RR间期(相邻R峰之间的时间间隔)、心率、QRS波宽度、P波存在与否、PR间期、QT间期等。这些特征的好处是物理意义明确,计算简单,而且很多心律失常的诊断标准本身就是基于这些时域参数的。比如房颤的典型特征就是RR间期绝对不规则,同时P波消失。

但时域特征的问题也很明显:它们对噪声和检测误差非常敏感。RR间期的准确性完全依赖于R峰检测,如果漏检一个R峰,RR间期就会翻倍;如果误检一个R峰,RR间期就会减半。QRS波宽度的测量依赖于QRS波起点和终点的准确检测,而这个检测本身就是一个难题。P波检测更是困难,因为P波幅度小,容易被噪声淹没。

我在实际项目里,时域特征一般只作为辅助,不会作为主要特征来源。但有一个时域特征我觉得被低估了:RR间期的非线性特征,比如RR间期的标准差、相邻RR间期差值的均方根、RR间期的样本熵。这些特征在区分房颤和其他心律失常时非常有效,而且计算简单,对R峰检测误差的鲁棒性也比单纯的RR间期均值要好。

3.2 频域特征:从功率谱里挖信息

频域特征的核心思路是:心电信号在不同频率上的能量分布,反映了不同的生理信息。论文里提到的频域特征主要是功率谱密度,以及从功率谱中提取的一些统计量,比如总功率、各频带功率占比、功率谱峰值频率等。

心电信号的频域分析有一个基本认识:正常心电信号的功率主要集中在0.5Hz到40Hz,其中QRS波群的能量主要在10Hz到25Hz,P波和T波的能量主要在0.5Hz到10Hz。当发生心律失常时,这个能量分布会发生变化。比如房颤时,由于心房活动变得不规则,高频成分会增加;室性早搏时,由于QRS波群变宽,低频成分会增加。

频域特征的提取通常用快速傅里叶变换或者自回归模型。FFT的优点是计算快,缺点是频率分辨率受窗口长度限制,而且假设信号是平稳的——但心电信号显然不是。自回归模型的优点是频率分辨率高,而且对短数据段也能给出较好的谱估计,缺点是模型阶数的选择需要经验。

我在实际使用中的体会是:频域特征单独用效果一般,但和时域特征结合起来,能显著提升分类性能。尤其是对于房颤检测这个任务,频域特征里的高频能量占比是一个很有判别力的指标。但要注意,频域特征对预处理的要求更高,如果基线漂移没有滤干净,低频部分的功率谱会被严重污染。

3.3 小波变换特征:非平稳信号的有力工具

小波变换是心电信号特征提取里用得非常多的一种方法,论文里也专门提到了。它的核心优势是:同时提供时域和频域的信息,而且可以根据信号的频率特性自适应地调整时间分辨率和频率分辨率——高频部分时间分辨率高,低频部分频率分辨率高。这正好契合心电信号的特点:QRS波群是高频瞬态事件,需要高的时间分辨率;而ST段和T波是低频缓变事件,需要高的频率分辨率。

论文里用的小波特征主要是:对每个心拍做小波分解,然后提取各层小波系数的统计量,比如均值、标准差、能量、熵等。常用的分解层数是4到6层,小波基通常选Daubechies系列(db4或db6)或者Symlets系列。选择这些小波基的原因是它们的波形和QRS波群有一定的相似性,能更好地捕捉QRS波的特征。

我在实际项目里用过db4做5层分解,提取每层的能量和标准差作为特征。效果确实比单纯的时域或频域特征要好,尤其是在区分正常心拍和室性早搏时,小波系数的能量分布差异非常明显。但小波变换有一个坑:边界效应。信号两端的小波系数会因为边界延拓而失真,如果心拍分割的窗口刚好把QRS波放在边缘,那这一层的小波系数就不可靠了。我的做法是:心拍窗口取得稍微宽一点,然后在提取小波特征时把边缘的系数丢掉,只用中间稳定部分的系数。

3.4 形态特征:波形形状里藏着的信息

形态特征是指直接描述心拍波形形状的特征,比如QRS波群的上升斜率、下降斜率、R波峰值、S波谷值、Q波深度、R波与S波的幅度比等。这些特征在论文里也有提及,但不如时域和频域特征那么突出。

形态特征的优势是直观、可解释性强,而且很多心律失常的诊断本身就是基于形态的。比如左束支传导阻滞的典型特征就是QRS波群增宽、R波形态改变;室性早搏的QRS波群通常宽大畸形。但形态特征的提取依赖于精确的波形定位,而且个体差异大,同一种心律失常在不同人身上的形态可能差别很大,所以泛化能力是一个问题。

我在实际使用中,形态特征一般会做归一化处理,比如把每个心拍的幅度归一化到[-1, 1],时间轴归一化到固定长度。这样可以在一定程度上消除个体差异和幅度变化的影响。但归一化也会丢失一些信息,比如R波的绝对幅度在区分某些心律失常时是有用的。所以我的做法是:同时保留归一化后的形态特征和原始幅度特征,让分类器自己去选择。

4. 特征选择与降维:不是特征越多越好

4.1 为什么必须做特征选择

论文里提取的特征数量,我粗略估计在30到50个之间。这个数量对于传统分类器来说已经偏多了,尤其是当训练样本数量有限的时候。特征过多会带来几个问题:第一,维度灾难——在高维空间里,样本变得稀疏,分类器很难找到好的决策边界;第二,过拟合——分类器可能会学到一些只在训练集上有效的噪声模式;第三,计算成本增加——特征提取和分类的时间都会变长。

论文里用的特征选择方法,常见的有几种:过滤法(比如卡方检验、互信息、方差阈值)、包裹法(比如递归特征消除)、嵌入法(比如L1正则化)。过滤法的优点是计算快,缺点是忽略了特征之间的组合效应;包裹法的优点是考虑了特征组合,缺点是计算量大;嵌入法介于两者之间。

我在实际项目里的做法是:先用过滤法快速筛掉明显无关的特征(比如方差接近零的),然后用嵌入法(L1正则化的逻辑回归)做进一步选择,最后用包裹法(递归特征消除配合交叉验证)做精细调整。这个过程听起来繁琐,但实际跑起来很快,而且效果比只用一种方法要好。

4.2 主成分分析在心电特征上的适用性

论文里提到了主成分分析用于降维。PCA的核心思想是:把原始特征投影到方差最大的几个方向上,用少数几个主成分来代替原始特征。这样做的好处是降维、去相关、减少噪声。但PCA在心电特征上有一个问题:它生成的主成分是原始特征的线性组合,物理意义不明确。也就是说,你很难解释“第一主成分”到底代表什么生理含义。

我在实际使用中,对PCA持谨慎态度。如果后续分析不需要解释特征含义,只是追求分类精度,那PCA可以用。但如果需要理解哪些特征对分类最重要,或者需要向临床医生解释模型的决策依据,那PCA就不合适了。这种情况下,我更倾向于用基于特征重要性的选择方法,比如随机森林的特征重要性排序,或者L1正则化。

另外,PCA还有一个假设:主成分方向是正交的,而且方差大的方向就是信息量大的方向。但心电特征里,有些方差小的特征可能恰恰是判别力强的特征。比如P波的存在与否,在特征空间里可能只占很小的方差,但它对区分房颤和正常心拍非常关键。所以PCA降维有可能会丢掉这些关键特征。

4.3 特征选择的实操经验:交叉验证是底线

特征选择有一个很容易犯的错误:在全量数据上做特征选择,然后再用交叉验证评估分类器性能。这样做会导致信息泄露——特征选择过程中已经看到了测试集的信息,所以评估结果会偏乐观。正确的做法是:把特征选择放在交叉验证的每一折里面,用训练折做特征选择,用测试折评估性能。

我在早期项目里就犯过这个错误,当时用全量数据做了递归特征消除,然后做10折交叉验证,得到的准确率是98%。后来改成在每一折里面单独做特征选择,准确率降到了94%。虽然94%也不差,但98%那个数字是虚高的,如果拿去写论文或者做报告,就是学术不严谨。

这个经验我想特别强调:特征选择、归一化、降维这些步骤,只要它们使用了数据的信息,就必须放在交叉验证的训练折里面做。这是机器学习实践的基本纪律,但在心电信号处理领域,因为数据量通常不大,很多人会忽略这一点。

5. 分类器选型:论文用了哪些,为什么这么选

5.1 支持向量机:小样本高维数据的首选

论文里重点用了支持向量机。SVM在心电分类里非常常见,原因有几个:第一,心电分类的训练样本通常不多(几百到几千个心拍),SVM在小样本上表现好;第二,特征维度可能很高(几十到几百维),SVM通过核函数可以处理高维数据;第三,SVM有坚实的统计学习理论基础,泛化能力有保障。

SVM的核心参数是核函数类型和正则化参数C。核函数常用的有线性核、多项式核、径向基核。径向基核是最常用的,因为它可以映射到无限维空间,而且只有一个参数gamma需要调。C控制的是对误分类的惩罚程度:C越大,越不允许误分类,容易过拟合;C越小,允许更多误分类,容易欠拟合。

我在实际使用中的经验是:对于心电分类,径向基核的SVM通常比线性核好,但差距不会特别大。如果特征数量已经很多(比如超过100维),线性核可能反而更好,因为径向基核在高维空间里容易过拟合。参数调优方面,我一般用网格搜索配合交叉验证,C的搜索范围是10的-3次方到10的3次方,gamma的搜索范围是10的-4次方到10的0次方。这个范围基本能覆盖大多数情况。

5.2 神经网络:论文里的浅层网络与深度学习的区别

论文里也用了神经网络,但根据标题和摘要描述,应该是浅层网络,比如多层感知机。多层感知机的结构是:输入层、一个或多个隐藏层、输出层。隐藏层的激活函数通常用sigmoid或tanh,输出层用softmax做多分类。

浅层神经网络和深度学习在心电分类上的区别,不仅仅是层数的问题。深度学习(比如卷积神经网络)可以直接从原始信号或原始波形的频谱图里学习特征,不需要手工设计特征。而浅层神经网络通常还是需要输入手工提取的特征。论文里的做法应该是后者:把提取好的特征向量输入到多层感知机里做分类。

我在实际项目里对比过这两种思路。在数据量充足(比如超过10万个心拍)的情况下,卷积神经网络确实比“手工特征加浅层网络”要好,准确率能高出3到5个百分点。但在数据量有限(比如只有几千个心拍)的情况下,手工特征加SVM或多层感知机的效果反而更好,因为深度学习模型容易过拟合。所以论文选择传统机器学习方法,在它那个数据规模下是合理的。

5.3 K近邻与决策树:简单但有效的基线

论文里应该也用了K近邻和决策树作为对比方法。K近邻的思路很简单:对于一个新样本,找到训练集里离它最近的K个样本,看这K个样本里哪个类别最多,就判为新样本的类别。K近邻的优点是无需训练、天然支持多分类,缺点是预测速度慢(需要计算与所有训练样本的距离)、对特征尺度敏感。

决策树的思路是:通过一系列if-else规则把特征空间划分成若干区域,每个区域对应一个类别。决策树的优点是解释性强、不需要特征归一化,缺点是容易过拟合、对数据扰动敏感。随机森林通过集成多棵决策树来解决过拟合问题,在实际心电分类里表现通常比单棵决策树好很多。

我在实际项目里,K近邻和决策树一般只作为基线方法,用来验证特征的有效性。如果K近邻和决策树都能做到不错的准确率,说明特征本身判别力强;如果它们表现很差而SVM表现很好,说明特征可能需要非线性变换才能发挥判别力。这个对比分析对于理解数据特性很有帮助。

6. 评估方法与指标:准确率不是唯一标准

6.1 心电分类里的类别不平衡问题

心电分类有一个很现实的问题:类别不平衡。正常心拍的数量通常远远多于异常心拍。在MIT-BIH心律失常数据库里,正常心拍占比大约70%到80%,某些异常类型(比如房性早搏)占比可能只有几个百分点。在这种情况下,如果只看准确率,一个把所有样本都判为正常的分类器也能做到70%到80%的准确率,但这个分类器毫无用处。

论文里应该提到了这个问题,但我不确定它用了什么方法来解决。常见的处理方法有:重采样(对少数类过采样或对多数类欠采样)、代价敏感学习(给少数类的误分类更高的惩罚)、集成方法(比如EasyEnsemble、BalanceCascade)。我在实际项目里最常用的是代价敏感学习,因为它不需要改变数据分布,只需要在分类器的损失函数里给不同类别不同的权重。

具体来说,在SVM里可以通过设置class_weight参数来调整不同类别的惩罚系数。在scikit-learn里,class_weight='balanced'会自动根据类别频率设置权重,权重与类别频率成反比。这个设置通常能显著提升少数类的召回率,但可能会降低多数类的召回率。所以需要根据实际需求来权衡:如果漏检异常心拍的代价很高,那就应该偏向少数类;如果误报的代价很高,那就应该偏向多数类。

6.2 灵敏度、特异度、F1分数:比准确率更有信息量

论文里用的评估指标,除了准确率,应该还包括灵敏度、特异度、F1分数。灵敏度是召回率,衡量的是“所有真实异常里,被正确识别出来的比例”;特异度衡量的是“所有真实正常里,被正确识别为正常的比例”;F1分数是精确率和召回率的调和平均,综合衡量分类器对某个类别的识别能力。

在心电分类里,灵敏度和特异度通常需要一起看。一个高灵敏度低特异度的分类器会大量误报,把正常心拍判为异常;一个高特异度低灵敏度的分类器会大量漏报,把异常心拍判为正常。这两种情况在临床上的后果完全不同,所以需要根据应用场景来选择合适的阈值。

我在实际项目里,通常会画ROC曲线和PR曲线来全面评估分类器性能。ROC曲线以假阳性率为横轴、真阳性率为纵轴,AUC值越大越好。PR曲线以召回率为横轴、精确率为纵轴,在类别不平衡时比ROC曲线更能反映实际性能。如果两个分类器的ROC曲线差不多,但PR曲线差别很大,那PR曲线更好的那个分类器在实际使用中会更可靠。

6.3 交叉验证的策略选择:患者独立还是心拍独立

交叉验证的策略在心电分类里有一个特殊考虑:是按心拍随机划分,还是按患者划分?按心拍随机划分的话,同一个患者的心拍可能同时出现在训练集和测试集里,这样评估出来的性能会偏乐观,因为分类器可能学到了这个患者的个体特征,而不是真正学到了心律失常的通用特征。按患者划分的话,训练集和测试集里的患者完全不重叠,评估出来的性能更接近实际应用场景。

论文里如果没有明确说明,我推测它用的是按心拍随机划分,因为这是更常见的做法。但我在实际项目里,如果数据允许,一定会做患者独立的交叉验证。虽然这样得到的准确率会低一些,但那个数字更真实、更有参考价值。如果数据量太小,做不到患者独立划分,那至少要在论文或报告里说明这一点,让读者知道评估结果可能存在乐观偏差。

7. 这篇论文的方法在实际项目里能不能直接用

7.1 论文方法的适用边界

这篇论文的方法,我认为在以下场景里是可以直接参考的:数据量不大(几千到几万个心拍)、类别数量不多(2到5类)、对可解释性有要求、计算资源有限。在这些场景里,传统机器学习方法加手工特征工程,往往比深度学习更实用。

但如果场景变成:数据量很大(几十万到几百万个心拍)、类别很多(10类以上)、对准确率要求极高、计算资源充足,那深度学习方法是更好的选择。卷积神经网络可以直接从原始信号里学习特征,不需要手工设计,而且随着数据量增加,性能会持续提升。循环神经网络(尤其是LSTM)可以捕捉心拍之间的时序依赖,对于需要分析心律整体模式的任务(比如房颤检测)特别有效。

我在实际项目里的选择策略是:先用传统机器学习方法快速建立一个基线,看看在这个数据规模下能做到什么水平。如果基线已经满足需求,就不需要上深度学习。如果基线不够,再考虑用深度学习,并且用传统方法的结果作为对比,确保深度学习带来的提升是真实的,而不是因为过拟合或者评估方法不当。

7.2 从论文到产品:还需要补哪些环节

论文里的方法是在标准数据库上验证的,离实际产品还有一段距离。从论文到产品,至少还需要补以下几个环节:

第一,实时性。论文里的方法通常是离线处理,可以对整段信号做全局优化。但实际产品往往需要实时或准实时处理,这就要求算法在有限的计算资源下快速完成。特征提取和分类的时间复杂度需要仔细评估,必要时要做简化或近似。

第二,鲁棒性。标准数据库里的信号质量相对较好,但实际采集的信号可能包含各种噪声和伪差。算法需要在信号质量下降时仍然保持可接受的性能,或者至少能检测出信号质量差并给出提示。

第三,个体化。不同人的心电波形差异很大,一个在标准数据库上训练好的模型,直接应用到新用户身上可能性能下降。需要考虑个体化校准或者迁移学习的方法。

第四,可解释性。在医疗相关应用里,医生和用户都需要理解算法为什么做出某个判断。传统机器学习方法在这方面有天然优势,因为特征和决策规则相对容易解释。但如果用深度学习,就需要额外的可解释性技术,比如注意力机制、梯度类激活映射等。

7.3 我踩过的一个典型坑:数据泄露

最后分享一个我在实际项目里踩过的坑。有一次做心电分类,我按照标准流程做了预处理、特征提取、特征选择、交叉验证,得到的准确率是96%,看起来很不错。但后来发现,我在做心拍分割的时候,用到了整段信号的R峰检测结果,而R峰检测的参数是在全量数据上校准的。这就导致了信息泄露——测试集的信息通过R峰检测参数间接影响了训练。

这个坑很隐蔽,因为R峰检测通常被认为是预处理步骤,很多人不会把它和交叉验证联系起来。但严格来说,任何使用了全量数据信息的步骤,都应该放在交叉验证的训练折里面做。如果R峰检测的参数需要校准,那校准过程也应该只在训练折上做。

修复方法很简单:把R峰检测的参数校准也放进交叉验证的每一折里。但这样做计算量会增加很多,因为每一折都要重新做R峰检测。如果计算资源有限,至少要在报告结果时说明这一点,让读者知道评估结果可能存在乐观偏差。这个经验让我在后来的项目里养成了一个习惯:在写评估代码之前,先画一张数据流图,标出哪些步骤使用了全量数据的信息,然后确保这些步骤都在交叉验证的训练折里面做。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询