Scikit SVM 对 STL-10 数据集的准确性非常差

Scikit SVM gives very poor accuracy for STL-10 dataset

我正在使用 Scikit-learn SVM 为包含 5000 个训练图像(10 个预定义折叠)的 STL-10 数据集训练我的模型。所以我有 5000*96*96*3 大小的数据集用于训练和测试目的。我使用以下代码对其进行训练并测量测试集的准确性。 (80% 20%)。最终结果为 0.323 精度。如何提高 SVM 的准确性。

这是STL10 dataset

def train_and_evaluate(clf, train_x, train_y):
    clf.fit(train_x, train_y)

#make 2D array as we can apply only 2d to fit() function
nsamples, nx, ny, nz = images.shape
reshaped_train_dataset = images.reshape((nsamples, nx * ny * nz))

X_train, X_test, Y_train, Y_test = train_test_split(reshaped_train_dataset, read_labels(LABEL_PATH), test_size=0.20, random_state=33)

train_and_evaluate(my_svc, X_train, Y_train)

print(metrics.accuracy_score(Y_test, clf2.predict(X_test)))

看来您是直接在图像上使用原始 SVM。这通常不是一个好主意(实际上是相当糟糕的)。

我将描述过去几十年流行的经典图像分类管道!请记住,目前 性能最高的方法可能会使用深度神经网络来组合其中一些步骤(一种非常不同的方法;过去几年进行了大量研究!)

  • 第一步:

    • 需要预处理
      • 标准化均值和方差(我不希望你的数据集已经标准化)
      • 可选:直方图均衡化
  • 第二步:

    • 特征提取 -> 你应该从这些图像中学习一些特征。有很多方法,包括
      • (内核-)PCA
      • (内核-)LDA
      • 词典学习
      • 矩阵分解
      • 本地二进制模式
      • ...(最初只用 LDA 测试)
  • 第三:

    • SVM用于分类
      • 在此之前可能还需要一个规范化步骤,正如@David Batista 在评论中提到的那样:可能需要进行一些参数调整(尤其是对于 Kernel-SVM)

也不清楚在这里使用颜色信息是否明智。对于更简单的方法,我希望黑白图像更好(你正在丢失信息,但调整你的管道更稳健;高性能方法当然会使用颜色信息)。

有关描述类似问题的随机教程,请参阅 here。虽然我不知道它是否好用,但你可以立即认出上面提到的处理管道(预处理、特征提取、分类器学习)!

编辑: 为什么要预处理?:一些算法假设中心样本具有单位方差,因此需要归一化。这(至少)对于 PCA、LDA 和 SVM 非常重要。