sklearn 维度问题“找到暗淡 3 的数组。预期的估计器 <= 2”

Posted

技术标签:

【中文标题】sklearn 维度问题“找到暗淡 3 的数组。预期的估计器 <= 2”【英文标题】:sklearn dimensionality issues "Found array with dim 3. Estimator expected <= 2" 【发布时间】:2018-06-08 17:57:31 【问题描述】:

我正在尝试使用 KNN 将 .wav 文件正确分类为两组,组 0 和组 1。

我提取数据、创建模型、拟合模型,但是当我尝试使用 .predict() 方法时,出现以下错误:

Traceback (most recent call last):   
File "/..../....../KNN.py", line 20, in <module>
    classifier.fit(X_train, y_train)   
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/neighbors/base.py", line 761, in fit
    X, y = check_X_y(X, y, "csr", multi_output=True)   
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/utils/validation.py", line 521, in check_X_y
    ensure_min_features, warn_on_dtype, estimator)   
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/sklearn/utils/validation.py", line 405, in check_array
    % (array.ndim, estimator_name)) 
ValueError: Found array with dim 3. Estimator expected <= 2.

我发现这两个描述类似问题的 *** 帖子:

sklearn Logistic Regression "ValueError: Found array with dim 3. Estimator expected <= 2."

Error: Found array with dim 3. Estimator expected <= 2

如果我错了,请纠正我,但 scikit-learn 似乎只能接受二维数据。

我的训练数据有形状 (3240, 20, 5255) 其中包括:

此数据集中的 3240 个 .wav 文件(这是训练数据的索引 0) 对于 对于 每个 .wav 文件,有一个 (20, 5255) numpy 数组表示 MFCC 系数(MFCC 系数尝试以数字方式表示声音)。

我的测试数据的形状为 (3240,) #category 为 0 或 1

我可以使用什么代码来处理我的训练和测试数据,以将其转换为可供 scikit-learn 使用的形式?还有,从3维降到2维怎么保证数据不丢失?

【问题讨论】:

您需要将MFCC数组转换为一维,然后形状将是(3240, 20*5255) 或者也许解释更多关于形状 (20, 5255) 的内置二维数组。行和列代表什么。你能从每一列或每一行中取一个代表数字吗? 【参考方案1】:

确实,sklearn 仅适用于 2D 数据。

你可以尝试做什么:

只需在训练数据上使用np.reshape 将其转换为形状(3240, 20*5255)。它将保留所有原始信息。但 sklearn 将无法利用此数据中的隐式结构(例如,特征 1、21、41 等是同一变量的不同版本)。 在原始数据上构建卷积神经网络(例如使用 tensorflow+Keras 堆栈)。 CNN 专门设计用于处理此类多维数据并利用其结构。但他们有很多超参数需要调整。 对重整为 (3240, 20*5255) 的数据使用降维(例如 PCA)。它试图保留尽可能多的信息,同时仍然保持较低的特征数量。 使用手动特征工程从数据结构中提取特定信息(例如,沿每个维度的描述性统计),并根据这些特征训练您的模型。

如果您有更多数据(例如 10 万个示例),第一种方法可能效果最好。在您的情况下(3K 示例和 10K 特征),您需要对模型进行大量正则化以避免过度拟合。

【讨论】:

您是否推荐任何特定的库来执行 PCA?另外,使用 PCA 后,我可以将数据插入 scikit 学习模型并看到准确性的提高吗? Scikit-learn 很好地实现了 PCA - scikit-learn.org/stable/modules/generated/… PCA 有助于减少特征数量。使用线性模型(如逻辑回归),它会降低训练数据的准确性,但可能会提高测试数据的准确性,您应该对其进行测试。我建议从第一个选项开始:在重构数据上拟合模型,并比较训练和测试数据集的准确性。如果差异很大,则说明出现过拟合,可能需要使用 PCA 等技术。 @DavidDale,你好!你能帮我吗?在对我的训练数据进行整形后,我得到“无法将大小为 22609920 的数组重新整形为形状(115,65536)”。我有 115 张图像作为我的训练数据集,它们的大小为 256x256 @hyper-cookie 您的图像是 3 维的,因为它们是 RGB 格式。您可以增加向量维度 x3(196608 而不是 65536)或通过沿通道维度平均来使图像灰度化。另一个可行的选择是使用预训练的 image-2-vector 模型,例如 github.com/christiansafka/img2vec 或 huggingface.co/openai/clip-vit-base-patch32

以上是关于sklearn 维度问题“找到暗淡 3 的数组。预期的估计器 <= 2”的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn PCA:PC 的正确维度

Sklearn之支持向量机分类

sklearn的PCA

sklearn实现决策树算法

sklearn pca降维

机器学习Sklearn库主成分分析PCA降维的运用实战