Вопрос или проблема
У меня есть набор данных с 580 образцами и 7 признаками. Я сравнил время работы трех ядер: линейного, квадратичного и гауссовского, используя RandomizedSearchCV следующим образом:
from sklearn.model_selection import RandomizedSearchCV
from sklearn.preprocessing import StandardScaler
paramSVMLinear = {
'kernel': ['linear'],
'C': [ii for ii in np.linspace(1,1e7,50000)]
}
scal = StandardScaler()
X = scal.fit_transform(X)
RandomizedSearchCV(SVC(), paramSVMLinear, n_iter=1, cv=2, scoring='accuracy', verbose=4).fit(X_train,Y_train)
SVC(kernel="linear").fit(X_train,Y_train)
SVC(kernel="poly",degree=2).fit(X_train,Y_train)
SVC(kernel="rbf").fit(X_train,Y_train)
Затраченное время на каждую подгонку: 187.64 сек, 0.001672 сек, 0.00187 сек, 0.001586 сек. Почему случайный поиск занимает так много времени для 1 итерации и 2 кросс-валидаций? Почему линейное ядро занимает больше времени, чем RBF? Спасибо!
Вероятная причина того, что линейное ядро занимает больше времени, заключается в том, что данные не являются линейно разделимыми, поэтому подгонка занимает больше времени, чем для нелинейного ядра, такого как RBF.
Ядерный трюк избегает явного отображения, которое требуется для того, чтобы линейные алгоритмы обучения научились нелинейной функции или границе решений.
[..] Некоторые алгоритмы, которые зависят от произвольных отношений в естественном пространстве $X$, на самом деле могут иметь линейную интерпретацию в другом контексте: диапазон $\varphi$. Линейная интерпретация предоставляет понимание алгоритма. Более того, часто нет необходимости вычислять $\varphi$ напрямую во время вычислений, как это происходит с методами опорных векторов. Некоторые указывают на это сокращение времени выполнения как на основное преимущество.
(выделение моё)
Ссылки:
Не является по своей природе быстрее: Гауссовские ядра не являются по своей природе быстрее, чем линейные ядра. Эффективность ядра зависит от различных факторов, включая конкретную задачу и реализацию.
Неявное сокращение размерности: Гауссовские ядра могут неявно выполнять сокращение размерности, что делает их эффективными в некоторых случаях, отображая данные в пространство более высокой размерности без явного преобразования данных.
Ядерный трюк: Гауссовские ядра используют ядерный трюк, который может экономить вычислительные ресурсы, работая в пространстве признаков без явного вычисления преобразованных векторных признаков.
Разреженные опорные векторы: В некоторых ситуациях гауссовские ядра приводят к разреженному набору опорных векторов, что ведет к более быстрому времени предсказания во время тестирования.
Ответ или решение
Сравнение времен выполнения различных ядерных функций в Support Vector Machine (SVM) может быть неожиданным. В вашем случае наблюдается, что ядро "линейное" требует больше времени на обучение по сравнению с ядром "Gaussian" (RBF), что может быть связано с несколькими факторами. Давайте рассмотрим некоторые из них.
Почему линейное ядро занимает больше времени?
-
Нелинейная разделимость: Если ваши данные не являются линейно отделимыми, линейное ядро может испытывать трудности с нахождением подходящей гиперплоскости, что может потребовать использования большего числа итераций и более сложных вычислений для оптимизации. В этом случае алгоритмы, использующие RBF (Gaussian) ядро, могут действовать быстрее, так как они могут более эффективно находить разделяющие границы за счет своей гибкости.
-
Предварительная обработка и масштабирование: Применение стандартизации данных (как в вашем случае) может повлиять на время обучения. Линейные модели чувствительны к масштабу данных, и если ваши данные не были хорошо масштабированы, это может привести к затруднениям в оптимизации.
Почему RBF является более быстрым:
-
Ядерный трюк: Ядро RBF использует так называемый "ядерный трюк", который позволяет SVM работать в высокоразмерном пространстве, не вычисляя явным образом координаты этих точек в этом пространстве. Это делает его более эффективным с точки зрения вычислительных ресурсов.
-
Имплицитное уменьшение размерности: Ядро RBF может эффективно представлять данные в более низком измерении без явного преобразования всех признаков, что также может сократить время, необходимое для обучения.
-
Разряженные опорные векторы: В некоторых случаях, ядрo RBF может привести к меньшему количеству опорных векторов, что сокращает время, необходимое для предсказаний при тестировании модели.
Время RandomizedSearchCV
Ваше время выполнения RandomizedSearchCV может быть долгим по нескольким причинам:
-
Итерации и перекрестная проверка: Даже одно итерационное выполнение с перекрестной проверкой (cv=2) имеющей 580 образцов и 7 признаков может создавать значительное время задачи, особенно во время подбора параметров.
-
Комплексные вычисления: Если диапазон значений для параметра C очень велик, как
np.linspace(1, 1e7, 50000)
, это приводит к большому количеству потенциальных моделей, которые необходимо оценить.
Подведем итоги
Таким образом, RBF не является по определению быстрее линейного ядра, но в зависимости от структуры данных и специфик модели он может продемонстрировать наименьшее время обучения. Ваша ситуация — хороший пример того, как соответствие между типом ядра и природой данных может существенно повлиять на производительность алгоритма. Настоятельно рекомендуется проводить дополнительные эксперименты с гиперпараметрами и уделять внимание свойствам ваших данных при выборе ядра.