SVM是非常缓慢的大数量的类训练分类时

问题描述 投票:1回答:2

我想火车大数量的项目和课程,这成为真的,真的很慢SVM分类。

首先,我提取从我的数据的功能集,具体的整体功能512,并把它在numpy的阵列。有此数组中的13K项目。它看起来像这样:

>>print(type(X_train))
<class 'numpy.ndarray'>

>>print(X_train)
[[ 0.01988654 -0.02607637  0.04691431 ...  0.11521499  0.03433102
  0.01791015]
[-0.00058317  0.05720023  0.03854145 ...  0.07057668  0.09192026
  0.01479562]
[ 0.01506544  0.05616265  0.01514515 ...  0.04981219  0.05810429
  0.00232013]
...

另外,还有一些不同类别的〜4K:

>> print(type(labels))
<class 'list'>
>> print(labels)
[0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, ... ]

这里是分类:

import pickle
from thundersvmScikit import SVC

FILENAME = 'dataset.pickle'

with open(FILENAME, 'rb') as infile:
    (X_train, labels) = pickle.load(infile)

clf = SVC(kernel='linear', probability=True)
clf.fit(X_train, labels)

固定操作仍在运行后〜90小时过后(在thundersvm的一种形式,我使用的GPU实现科幻学习套件)。考虑到这是在我的情况下,一个非常小的数据集我肯定需要一些更有效的,但我似乎并没有与任何良好的成功。举例来说,我已经试过这种类型Keras模式:

model = Sequential()
model.add(Dense(input_dim=512, units=100, activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(units=n_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=['accuracy'])
model.fit(X_train, labels, epochs=500, batch_size=64, validation_split=0.1, shuffle=True)

我结束了在训练阶段还不错精度:

Epoch 500/500
11988/11988 [==============================] - 1s 111us/step - loss: 2.1398 - acc: 0.8972 - val_loss: 9.5077 - val_acc: 0.0000e+00

然而,即使对存在于训练数据集我有非常低的准确性,预测基本上随机类数据的实际测试过程中:

Predictions (best probabilities):
  0  class710015: 0.008
  1  class715573: 0.007
  2  class726619: 0.006
  3  class726619: 0.010
  4  class720439: 0.007
Accuracy: 0.000

你能,请点我在这个正确的方向?我应该以某种方式调整SVM方法,或者我应该切换到定制Keras模型对于这种类型的问题?如果是的话,什么是我的模型可能出现的问题?

非常感谢。

tensorflow machine-learning keras neural-network svm
2个回答
2
投票

如果它依赖于多类SVC的scikit学习实现你不应该使用SVC实现。在documentation它指出“多类别支持根据一VS-一个方案进行处理。”这意味着你训练一个分类,每两个类,即〜2 ^ 4K分类正在接受培训。你可以使用任何上市here下的“固有多类”

此外,您的Keras实现可能需要另一个层。我假设输出层有1个神经元为每个类,在这种情况下,你要使用绝对crossentropy和SOFTMAX激活,以及一个热码。

现在,所有你的例子只有一个类的标签,我假设。


2
投票

SVM是最自然的二元分类。对于多类,scikit学习使用一个抗一个至O结合(K ^ 2)二元分类器(https://scikit-learn.org/stable/modules/svm.html),其中K的类的数量。因此,运行时间是成正比的K ^ 2,或在你的情况下,1600万。这就是为什么它是如此缓慢的原因。

您应该减少类的数量,或者切换到其他模式,如神经网络或决策树。

P.S:还scikit学习有一个-VS-所有方法的SVM(https://scikit-learn.org/stable/modules/multiclass.html),这是O(K)。你也可以试试这个。


推荐问答