我正在使用Scikit learn SVM为STL-10数据集训练我的模型,该数据集包含5000个训练图像(10个预定义折叠)。因此,我有5000*96*96*3大小的数据集用于训练和测试目的。我使用以下代码来训练它,并测量测试集的准确性。(80%20%)。最终结果准确度为0.323。如何提高SVM的准确性。
这是STL10数据集
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的评论中所提到的:可能需要一些参数调整(尤其是内核SVM)
-
SVM用于分类
这里也不清楚使用颜色信息是否明智。对于更简单的方法,我希望黑白图像更出色(您正在丢失信息,但调整管道更稳健;高性能方法当然会使用颜色信息)。
有关描述类似问题的随机教程,请参阅此处。虽然我不知道这是否是一项好工作,但你可以立即识别上面提到的处理管道(预处理、特征提取、分类器学习)!
编辑:为什么要进行预处理?:一些算法假设样本中心具有单位方差,因此需要归一化。这(至少)对PCA、LDA和SVM非常重要。