sklearn 维度问题 “发现数组维度为3。估计器期望 <= 2"

我试图使用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.

我找到了这两个stackoverflow帖子,它们描述了类似的问题:

sklearn逻辑回归 “ValueError: 发现数组维度为3。估计器期望 <= 2."

错误:发现数组维度为3。估计器期望 <= 2

如果我没记错的话,看来scikit-learn只能接受二维数据。

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

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

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

我可以使用什么代码来操作我的训练和测试数据,将其转换为scikit-learn可以使用的形式?另外,我如何确保在从3维降到2维时数据不会丢失?


回答:

确实,sklearn只能处理二维数据。

你可以尝试做的:

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

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注