在CNN提取的功能之上使用SVM-如何进行多类分类?

时间:2019-01-15 09:05:50

标签: python machine-learning svm multiclass-classification

在MNIST数据集中,有10个分类输出。现在,我想使用 SVM 作为此分类任务的分类器。我使用CNN架构(不包括顶层或分类器)从原始图像中提取特征,然后将其放入SVM分类器中。

SVM是二进制分类器,因此我们可以使用一对一一对一静止的方法来进行此类操作。我使用以下来自sci-kit的已实现代码学习官方文档。但无法意识到我在哪里指定要针对多类别标签进行建模,或者这是 One 或 One-Rest 方法。

数据集形状如下:

train : (2045, 32, 32)
label : (2045, 10)

使用非顶级CNN代码提取功能后,我们得到:

train : (7636, 256)  < - cnn_Xtrain
label : (7636,)      < - Ytrain

我尝试过的SVM分类器

# SVC classifier
SVMC = SVC(probability=True)
svc_param_grid = {'kernel': ['rbf'], 
                  'gamma': [0.0001, 0.001],
                  'C': [1, 10, 50]}

gsSVMC = GridSearchCV(SVMC, param_grid = svc_param_grid, cv = K_fold,
                      scoring="accuracy", n_jobs= -1, verbose = 1)

gsSVMC.fit(cnn_Xtrain, Ytrain) # fitting extracted features

SVMC_best = gsSVMC.best_estimator_

在此分类器中,SVM如何理解这是一个多类问题,还是一对多或一对多?得分结果对我来说更令人怀疑,我的确评估了将近98%。网格搜索(RBF)中指定的内核是否对此负责?还是我在这里做错了什么?

此外,可以使用CNN代码从原始图像中提取特征,然后将其适合SVM或类似的分类器吗?

1 个答案:

答案 0 :(得分:0)

在分类器的“ decision_function_shape”参数中设置使用“一对多休息”还是“一对多”的决策天气(请参见doc for svc)。上面写着:

  

是否返回形状为(n_samples,n_classes)的一对一休息('ovr')决策函数作为所有其他分类器,还是返回libsvm原始的一对一(vs)决策函数?形状(n_samples,n_classes *(n_classes-1)/ 2)。但是,始终将一对一(“ ovo”)用作多类别策略。   在版本0.19中进行了更改:默认情况下Decision_function_shape为'ovr'。   0.17版中的新功能:建议Decision_function_shape ='ovr'。   在版本0.17中进行了更改:不建议使用Decision_function_shape ='ovo',并且不设置。

所以现在默认是一个vs rest,因为您没有指定此参数,所以可能是代码中使用的参数。

关于在装配之前使用CNN进行特征提取的问题:通常,它应该可以工作。但是,使用正确的内核实际上并没有必要。如果要减小特征向量的维数,可以只使用pca或非线性嵌入方法(例如manifold embedding)来减少特征。

希望这会有所帮助。