Преобразование LinearSVC функции решения к вероятностям (Scikit learn python)
Я использую линейный SVM из scikit learn (LinearSVC) для задачи двоичной классификации. Я понимаю, что LinearSVC может дать мне предсказанные ярлыки, а оценки решений, но мне нужны оценки вероятности (уверенность в ярлыке). Я хочу продолжить использование LinearSVC из-за скорости (по сравнению с sklearn.svm.SVC с линейным ядром). Разумно ли использовать логистическую функцию для преобразования оценок решений в вероятности?
import sklearn.svm as suppmach
# Fit model:
svmmodel=suppmach.LinearSVC(penalty='l1',C=1)
predicted_test= svmmodel.predict(x_test)
predicted_test_scores= svmmodel.decision_function(x_test)
Я хочу проверить, имеет ли смысл получать оценки вероятности просто как [1/(1 + exp (-x))], где x - оценка решения.
В качестве альтернативы, есть ли другие опции, которые можно использовать для эффективного использования?
Спасибо.
Ответы
Ответ 1
Я взглянул на apis в семействе sklearn.svm. *. Все ниже модели, например,
- sklearn.svm.SVC
- sklearn.svm.NuSVC
- sklearn.svm.SVR
- sklearn.svm.NuSVR
имеют общий интерфейс, который предоставляет
probability: boolean, optional (default=False)
для модели. Если для этого параметра установлено значение "Истина", libsvm будет обучать модель преобразования вероятностей поверх выходов SVM на основе идеи Platt Scaling. Форма преобразования аналогична логистической функции, как вы указали, однако две конкретные константы A
и B
изучаются на этапе последующей обработки. Также см. Эту статью fooobar.com/questions/170137/... для более подробной информации.
![enter image description here]()
Я действительно не знаю, почему эта пост-обработка недоступна для LinearSVC. В противном случае вы просто вызываете predict_proba(X)
, чтобы получить оценку вероятности.
Конечно, если вы просто применяете наивное логистическое преобразование, оно не будет выполнять, а также откалиброванный подход, например Platt Scaling. Если вы можете понять подстрочный алгоритм масштабирования platt, возможно, вы можете написать свой собственный или внести свой вклад в семейство scikit-learn svm.:) Также не стесняйтесь использовать приведенные выше четыре варианта SVM, поддерживающие predict_proba
.
Ответ 2
scikit-learn предоставляет CalibratedClassifierCV, который может быть использован для решения этой проблемы: он позволяет добавить вывод вероятности в LinearSVC или любой другой классификатор который реализует метод solve_function:
svm = LinearSVC()
clf = CalibratedClassifierCV(svm)
clf.fit(X_train, y_train)
y_proba = clf.predict_proba(X_test)
В руководстве пользователя есть хороший раздел. По умолчанию CalibratedClassifierCV + LinearSVC получит вам масштабирование Platt, но также предоставляет другие варианты (метод изотонической регрессии) и не ограничивается классификаторами SVM.
Ответ 3
Если вы хотите скорость, просто замените SVM на sklearn.linear_model.LogisticRegression
. Это использует тот же самый алгоритм обучения, что и LinearSVC
, но с лог-потерей вместо потери петли.
Использование [1/(1 + exp (-x))] приведет к появлению вероятностей в формальном смысле (числа от нуля до единицы), но они не будут придерживаться какой-либо оправданной вероятностной модели.
Ответ 4
Если вам нужна скорость и вероятность, проверьте xgboost. Xgboost помог людям выиграть много соревнований по обучению машин Kaggle.
Обратите внимание, что вы можете использовать xgboost с sklearn, например:
from xgboost.sklearn import XGBClassifier