Я пытаюсь обучить классификатор 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 для этого типа проблемы?Если да, в чем проблема с моей моделью?
Большое спасибо.