如何以连续值数组为特征训练模型?适配该类数据的分类器有哪些
问题解决与模型推荐
报错原因
Random Forest这类传统机器学习模型要求输入是二维数值数组(形状为(样本数, 特征数)),但你的数据中每个特征列存储的是一维序列(比如鼻气流列每个单元格是750个数值的数组),导致输入数据维度变成三维,触发ValueError: setting an array element with a sequence错误。
无需大幅丢失信息的解决方案
1. 复合特征工程(适配传统模型)
如果仍想使用Random Forest,可对每个信号序列提取时域+频域复合特征,既保留序列关键信息,又将序列转为固定长度的特征向量:
- 时域特征:均值、方差、标准差、偏度、峰度、最大值、最小值、四分位数、信号过零率、绝对偏差等
- 频域特征:FFT变换后的峰值频率、主频率能量占比、小波变换多尺度系数统计量等
将这些特征拼接后,就能直接输入Random Forest训练。
2. 专门处理序列数据的分类模型
以下模型可直接处理固定长度的序列特征,无需手动压缩信息:
- 时间序列森林(Time Series Forest)
专为时间序列分类设计的集成模型,核心逻辑是对序列随机抽取多个区间,计算区间内的统计量(均值、方差、斜率等)作为特征,再用决策树集成训练。它能保留序列的局部时序信息,实现简单,适合快速验证效果。 - 一维卷积神经网络(1D-CNN)
擅长捕捉序列的局部模式和空间相关性,可对不同采样率的信号分别搭建CNN分支提取特征,再将分支输出融合后做分类,适合挖掘信号的隐含特征。 - 循环神经网络(LSTM/GRU)
专门用于捕捉序列的时间依赖关系,适合处理EEG这类具有时序关联的信号,可通过多分支结构分别处理鼻气流和EEG序列,再融合特征完成分类。 - Transformer
依靠自注意力机制捕捉序列的长距离依赖,对EEG这类长序列(6000个点)的全局特征提取效果优异,同样支持多分支处理不同采样率的信号。 - 隐马尔可夫模型(HMM)
适合处理具有马尔可夫特性的时序信号,通过学习信号的状态转移规律实现分类,在生理信号分类场景中应用广泛。
时间序列森林快速实现示例
from sktime.classification.compose import ColumnEnsembleClassifier from sktime.classification.interval_based import TimeSeriesForestClassifier import pandas as pd import numpy as np # 假设df是你的原始DataFrame # 整理输入数据:每个样本为包含两个序列的数组 X = [np.vstack([np.array(row['Nasal Airflow 25hz']), np.array(row['EEG 200hz'])]) for idx, row in df.iterrows()] y = df['Target (0,1,2)'].values # 为每个信号列单独构建时间序列森林分类器,再集成 clf = ColumnEnsembleClassifier( estimators=[ ("nasal_tsf", TimeSeriesForestClassifier(n_estimators=100), 0), ("eeg_tsf", TimeSeriesForestClassifier(n_estimators=100), 1), ] ) # 训练与预测 clf.fit(X, y) y_pred = clf.predict(X)
内容的提问来源于stack exchange,提问作者JOHN EDWARD BINAY
相关产品推荐
相关产品推荐

