我正在使用Scikit-learn SVM来训练我的STL-10数据集模型,该数据集包含5000个训练图像(10个预定义的折叠)。所以我有5000 * 96 * 96 * 3大小的数据集用于培训和测试目的。我使用以下代码来训练它并测量测试集的准确性。 (80%20%)。最终结果是0.323准确度。如何提高SVM的准确性。
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)))
答案 0 :(得分:2)
因此,您似乎直接在图像上使用原始SVM。这通常不是一个好主意(实际上相当糟糕)。
我将描述过去几十年流行的经典图像分类管道!请记住,目前性能最高的方法现在可能会使用深度神经网络来结合其中的一些步骤(一种非常不同的方法;过去几年的大量研究!)
第一步:
第二步:
<强>第三强>:
如果在这里使用颜色信息是明智的,也不清楚。对于更简单的方法,我希望黑白图像更优越(您正在丢失信息,但调整管道更加强大;高性能方法当然会使用颜色信息)。
有关描述类似问题的随机教程,请参阅here。虽然我不知道它是否做得很好,但你可以立即认识到上面提到的处理流程(预处理,特征提取,分类器学习)!
修改强> 为什么要预处理?:有些算法假设居中样本具有单位方差,因此需要进行归一化。这对于PCA,LDA和SVM来说(至少)非常重要。