【问题标题】:Scikit SVM gives very poor accuracy for STL-10 datasetScikit SVM 对 STL-10 数据集的准确性非常差
【发布时间】:2016-09-28 13:03:05
【问题描述】:

我正在使用 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)))

【问题讨论】:

  • 如何提高 SVM 的准确性? 可能是特征工程,并尝试使用不同的内核,但您也可以提供有关数据集的更多详细信息。
  • 我认为问题在于将我的数据从 (5000*96*96*3) 重塑为 (5000, 27648) 数据集。用数据集的链接更新了问题

标签: scikit-learn svm scikit-image


【解决方案1】:

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

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

  • 第一步

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

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

    • SVM 用于分类
      • 在此之前可能还需要一个标准化步骤,正如 @David Batista 在 cmets 中所提到的:可能需要一些参数调整(尤其是对于 Kernel-SVM)

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

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

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

【讨论】:

    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 2021-01-15
    • 2012-04-13
    • 2015-05-04
    • 2015-06-08
    • 2018-10-27
    • 2021-11-12
    • 2019-01-03
    相关资源
    最近更新 更多