SVM очень медленный при обучении классификатора на большом количестве классов - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь обучить классификатор SVM большому количеству предметов и классов, что становится очень, очень медленным.

Прежде всего, я извлек набор функций из своих данных, чтобыконкретные 512 функций в целом и положить его в массиве NumPy.В этом массиве 13 тыс. Элементов.Это выглядит так:

>>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 часов (и я использую графическую реализацию sci-learn kit в форме thundersvm), операция подгонки продолжается.Принимая во внимание, что это довольно маленький набор данных в моем случае, мне определенно нужно что-то более эффективное, но я, кажется, не добился хорошего успеха в этом.Например, я попробовал этот тип модели 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 для этого типа проблемы?Если да, в чем проблема с моей моделью?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

SVM наиболее естественен для бинарной классификации.Для мультикласса scikit-learn использует один-против-одного для объединения O (K ^ 2) двоичных классификаторов (https://scikit -learn.org / stable / modules / svm.html ), с K числомклассов.Итак, время работы пропорционально K ^ 2, или, в вашем случае, 16 миллионам.Это причина, почему это так медленно.

Вы должны либо уменьшить количество классов, либо переключиться на другие модели, такие как нейронные сети или деревья решений.

PS: у scikit-learn также есть подход «один против всех» для SVM (https://scikit -learn.org / stable / modules / multiclass.html ), то есть O (K).Вы также можете попробовать это.

0 голосов
/ 05 февраля 2019

Вы не должны использовать эту реализацию SVC, если она опирается на реализацию scikit-learn мультиклассового SVC.В документации говорится: «Поддержка мультикласса обрабатывается по схеме« один против одного ».»Это означает, что вы обучаете один классификатор для каждой пары классов, то есть ~ 2 ^ 4k классификаторов обучаются.Вы можете использовать что-нибудь из перечисленного здесь в разделе «По сути мультикласс»

Также вашей реализации Keras, вероятно, нужен другой слой.Я предполагаю, что у выходного слоя есть 1 нейрон для каждого класса, и в этом случае вы захотите использовать категориальную кроссентропию и активацию softmax, а также одно горячее кодирование.

Я предполагаю, что все ваши примеры имеют только одну метку класса.

...