Почему "partial_fit" в "SGDClassifier" страдает от постепенного снижения точности модели

Я готовлюсь к онлайн-опершись SVM классификатор с использованиемSGDClassifier в sklearn. Я узнал, что можно использоватьpartial_fit.

Мое определение модели:

model = SGDClassifier(loss="hinge", penalty="l2", alpha=0.0001, max_iter=3000, tol=1e-3, shuffle=True, verbose=0, learning_rate='invscaling', eta0=0.01, early_stopping=False)

и создается он только первый раз.

Чтобы проверить это, я сначала обучил свою модель классификатора 1 на всех данных, используя fit и получили точность модели 87% (используя model.score(X_test, y_test)). Затем, чтобы продемонстрировать онлайн-обучение, я разбил одни и те же данные на 4 набора, а затем скормил все 4 части в 4 разных прогонах, используяpartial_fit. Это была модель 2.

Но в этом случае моя точность упала: 87,9 -> 98,89 -> 47,7 -> 29,4.

Что могло быть причиной этого?

1 ответ

Решение

Вот как я это преодолел.

Обычно, partial_fitбыло замечено, что оно подвержено снижению или колебаниям в точности. В некоторой степени это можно немного смягчить, перетасовывая и проверяя только небольшие части всего набора данных. Но для больших данных онлайн-обучение, похоже, дает только снижение точности с SGDClassifier/SVM Classifier.

Я попытался поэкспериментировать с этим и обнаружил, что использование низкой скорости обучения иногда может нам помочь. Грубая аналогия состоит в том, что повторное обучение одной и той же модели на больших данных приводит к тому, что модель забывает то, что она извлекла из предыдущих данных. Таким образом, использование крошечной скорости обучения замедляет скорость обучения, а также снижает скорость забывания!

Вместо того, чтобы указывать ставку вручную, мы можем использовать adaptive функция скорости обучения, предоставляемая sklearn.

model = SGDClassifier(loss="hinge", penalty="l2", alpha=0.0001, max_iter=3000, tol=None, shuffle=True, verbose=0, learning_rate='adaptive', eta0=0.01, early_stopping=False)

Это описано в [scikit docs] как:

"адаптивный": eta = eta0, пока обучение продолжает уменьшаться. Каждый раз, когда n_iter_no_change последовательных эпох не может уменьшить потери на обучение на tol или не может увеличить оценку валидации на tol, если Early_stopping имеет значение True, текущая скорость обучения делится на 5.

Первоначально, с каждым раундом новых данных, мы получали снижение точности как:

7,9 -> 98,89 -> 47,7 -> 29,4

Теперь мы получаем лучшие результаты со 100% точностью, хотя есть большая вероятность переобучения из-за увеличения эпох. Я попытался продемонстрировать наблюдения в этом блокноте kaggle

Другие вопросы по тегам