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

时间:2016-05-30 16:20:43

标签: scikit-learn svm scikit-image

我正在使用Scikit-learn SVM来训练我的STL-10数据集模型,该数据集包含5000个训练图像(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)))

1 个答案:

答案 0 :(得分:2)

因此,您似乎直接在图像上使用原始SVM。这通常不是一个好主意(实际上相当糟糕)。

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

  • 第一步

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

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

    • SVM 进行分类
      • 在此之前可能还需要一个规范化步骤,如@David Batista的评论所述:可能需要进行一些参数调整(特别是对于Kernel-SVM)

如果在这里使用颜色信息是明智的,也不清楚。对于更简单的方法,我希望黑白图像更优越(您正在丢失信息,但调整管道更加强大;高性能方法当然会使用颜色信息)。

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

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