Почему "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