有没有办法将数组数组或列表列表传递给sklearn分类器?

问题描述 投票:0回答:1

我正在尝试对一些 p300 拼写脑电图数据进行分类。所以我有一个很长的时间序列,这个时间序列被分成相同长度的纪元(时间窗口),并且每个纪元都有一个标签。所以我想做的是创建一个数据矩阵,其中列是我们测量大脑活动的脑电通道,行是纪元,这样我最终会得到一个矩阵,其中每个条目都是一个时间序列。 我想这样做是因为同一纪元内的点的顺序不应改变,并且我希望能够在纪元之间进行洗牌。

所以,在数据预处理之后,我最终得到了一个 pandas 数据框 dataframe,其中“条件”是标签,我通过

到达这里
    df = df.groupby(["epoch", "condition"], as_index = False).agg(
        Fz = ("Fz", pd.Series.to_list),
        C3 = ("C3", pd.Series.to_list),
        Cz = ("Cz", pd.Series.to_list),
        C4 = ("C4", pd.Series.to_list),
        Pz = ("Pz", pd.Series.to_list),
        PO7 = ("PO7", pd.Series.to_list),
        Oz = ("Oz", pd.Series.to_list),
        PO8 = ("PO8", pd.Series.to_list),
    )

然后我尝试将其转换为数组的数组,以便将数据传递给分类器进行训练:

    unicorn_channels = ["Fz", "C3", "Cz", "C4", "Pz", "PO7", "Oz", "PO8"]
    pot = df[unicorn_channels].to_numpy()

    for i in range(pot.shape[0]):
      for j in range(pot.shape[1]):
        pot[i,j] = np.array(pot[i,j])

    X = pot
    y = df.condition.to_numpy()

因此,此时 X 是形状为 (1200,8)、1200 个历元和 8 个通道的数组的数组,y 是 (1200,)。而且,对我来说,一切似乎都很顺利。

然后我将其传递给 train_test_split 以划分训练集和测试集,并将训练集传递给分类器,在本例中为逻辑回归,但它给了我以下错误:

   TypeError                                 Traceback (most recent call last)
   TypeError: only size-1 arrays can be converted to Python scalars

   The above exception was the direct cause of the following exception:

   ValueError                                Traceback (most recent call last)
   <timed exec> in <module>

   /usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_logistic.py in fit(self, X, y, sample_weight)
   1194             _dtype = [np.float64, np.float32]
   1195 
-> 1196         X, y = self._validate_data(
   1197             X,
   1198             y,

3 frames
/usr/local/lib/python3.10/dist-packages/sklearn/utils/_array_api.py in _asarray_with_order(array, dtype, order, copy, xp)
    183     if xp.__name__ in {"numpy", "numpy.array_api"}:
    184         # Use NumPy API to support order
--> 185         array = numpy.asarray(array, order=order, dtype=dtype)
    186         return xp.asarray(array, copy=copy)
    187     else:

ValueError: setting an array element with a sequence.

我尝试使用列表列表执行相同的段落,但它给了我类似的错误。看来问题在于它是一个嵌套矩阵,但我希望以某种方式可以做到这一点。否则,我可以将单个纪元放在整行上,这样结果将是一个形状为 (1200, 2808) 的矩阵,其中 2808 = 351 * 8,每个纪元有 351 个时间点和 8 个通道,但我担心该算法将通过特征进行洗牌,从而通过数据点,这是不应该发生的。

我希望一切都清楚了:)

python numpy multidimensional-array time-series classification
1个回答
0
投票

不知道你明白了没有。正如 @Nick-Odell 提到的,对于 3 维数组,您应该使用神经网络。我正在考虑使用 EEGNet [https://arxiv.org/abs/1611.08024],据我了解,你可以将 3 个维度视为 3 个通道。

© www.soinside.com 2019 - 2024. All rights reserved.