我正在尝试使用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 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维时,如何确保数据不会丢失?

最佳答案

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

您可以尝试做的是:


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


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

10-05 23:17