Вызов метода классификатора Python Scikit `.fit` многократно влияет на что-либо?

Я использую scikit SVM, и я хотел бы протестировать SVM как с настроенным sample_weights, так и с переданным классификатору, а также с обычной реализацией, где sample_weights является значением по умолчанию 1 для каждого образца. (sample_weight позволяет пользователю оказывать одним образцам большее влияние, чем другим.) Таким образом, рабочий процесс является стандартным — подгонка каждой модели к обучающему подмножеству, тестирование каждой модели на отложенном наборе для разработки, чтобы увидеть, следует ли мне использовать веса или нет. Мой код таков:

clf = svm.SVC( kernel = 'rbf', gamma = .001) ## initialize the model- i only do this once!

clf.fit(X_train, y_train) ## fit the model/do the optimization
accuracy[name + "_no_weights"] = clf.score(X_test, y_test) ## store results

clf.fit(X_train, y_train, sample_weight = sample_weight_test) ## fit the model/do the optimization w/ different regularization
accuracy[name + "_w_weights"] = clf.score(X_test, y_test) ## store results

Обратите внимание, что если бы мне нужно было проверить, какое ядро ​​использовать, мне пришлось бы повторно инициализировать классификатор, переопределив clf. Дело в том, что выше я тренирую один и тот же классификатор в обоих случаях, но я не инициализирую классификатор повторно. Так что может быть, что во второй раз, когда я вызываю .fit, его параметры уже инициализированы (не случайным образом, а из предыдущего обучения). Это означало бы, что результаты после второго метода .fit могут иметь несправедливое преимущество — их начальная точка для оптимизации была очень близка к границе хорошего решения.

Кто-нибудь знает, как это работает или есть предложения?


person travelingbones    schedule 16.08.2016    source источник


Ответы (1)


Это просто не имеет значения для SVM, так как он всегда сходится к глобальным минимумам. Он не «начинается с хорошего решения», SVM не является нейронной сетью — ему не нужна хорошая инициализация. Другими словами, вы можете вызывать fit сколько угодно раз, и вам не нужно повторно инициализировать классификатор. В случае sklearn это еще более очевидно, поскольку его метод .fit даже не передает текущие множители Ларанжа, он просто вызывает внешнюю низкоуровневую реализацию SVM-решателя.

person lejlot    schedule 16.08.2016
comment
Ааа... задача квадратичной оптимизации имеет уникальный глобальный минимум?! это доказательство твоего утверждения? Кроме того, отличный ответ. Вы сказали, что это спорный вопрос, потому что мы всегда в лучшем случае. - person travelingbones; 17.08.2016
comment
@travelingbones Решение проблемы svm не обязательно уникально, но здесь это не имеет значения. Тот факт, что это проблема выпуклой оптимизации, приводит к тому, что многие алгоритмы приближаются к глобальному минимуму. Но это верно только для некоторых алгоритмов (например, готовых решателей QP, координатного спуска, SMO и т. д.). Популярные в настоящее время методы на основе SGD (часто используемые для больших данных) могут дать сбой в зависимости от некоторых метапараметров (самые простые: недостаточно итераций/эпох и скорости обучения). - person sascha; 17.08.2016
comment
@travelingbones Такое доказательство вы можете найти в любой книге по численному анализу. Выпуклые функции имеют единственный (по значению) минимум (а строго выпуклые и единственный по координатам). Вопреки тому, что предлагает саша - это относится и к проблеме svm - у нее есть уникальное решение. Однако из-за численных приближений и отсутствия точности практические реализации не сходятся к реальному глобальному решению, а просто достаточно близко (хотя стоит отметить, что это верно для любого вида итеративной оптимизации). - person lejlot; 18.08.2016
comment
@lejlot: спасибо за подтверждения. Знал математику выпуклых функций. Хотел убедиться, что причина здесь. - person travelingbones; 18.08.2016