Способ обучения Логистической регрессии - использование стохастического градиентного спуска, к которому Scikit-Learn предлагает интерфейс.
То , что я хотел бы сделать , это принять scikit-Learn - х SGDClassifier и он забьет такой же , как логистическая регрессия здесь . Тем не менее, мне не хватает некоторых улучшений машинного обучения, так как мои оценки не эквивалентны.
Это мой текущий код. Чего мне не хватает в SGDClassifier, чтобы он давал те же результаты, что и логистическая регрессия?
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
import numpy as np
import pandas as pd
from sklearn.cross_validation import KFold
from sklearn.metrics import accuracy_score
# Note that the iris dataset is available in sklearn by default.
# This data is also conveniently preprocessed.
iris = datasets.load_iris()
X = iris["data"]
Y = iris["target"]
numFolds = 10
kf = KFold(len(X), numFolds, shuffle=True)
# These are "Class objects". For each Class, find the AUC through
# 10 fold cross validation.
Models = [LogisticRegression, SGDClassifier]
params = [{}, {"loss": "log", "penalty": "l2"}]
for param, Model in zip(params, Models):
total = 0
for train_indices, test_indices in kf:
train_X = X[train_indices, :]; train_Y = Y[train_indices]
test_X = X[test_indices, :]; test_Y = Y[test_indices]
reg = Model(**param)
reg.fit(train_X, train_Y)
predictions = reg.predict(test_X)
total += accuracy_score(test_Y, predictions)
accuracy = total / numFolds
print "Accuracy score of {0}: {1}".format(Model.__name__, accuracy)
Мой вывод:
Accuracy score of LogisticRegression: 0.946666666667
Accuracy score of SGDClassifier: 0.76
Ответы:
Комментарии о номере итерации находятся на месте. По умолчанию
SGDClassifier
n_iter
это5
означает , что вы делаете5 * num_rows
шаги в весовом пространстве. Правило sklearn эмпирического составляет ~ 1 миллиона шагов для типичных данных. Для вашего примера, просто установите его на 1000, и он может сначала достичь допуска. Ваша точность ниже,SGDClassifier
потому что она достигает предела итерации до допуска, поэтому вы «рано останавливаетесь»Быстро и грязно модифицируя ваш код я получаю:
источник
SGDClassifier, как следует из названия, использует стохастический градиентный спуск в качестве алгоритма оптимизации.
Если вы посмотрите на реализацию LogisiticRegression в Sklearn, есть пять методов оптимизации (решатель), и по умолчанию это LibLinear, который использует Coordinate Descent (CD) для сближения.
Помимо количества итераций, оптимизация, тип регуляризации (штраф) и его величина (C) также влияют на производительность алгоритма.
Если вы используете его при настройке набора данных Iris, все эти гиперпараметры могут не принести существенных изменений, но для сложных наборов данных они играют значимую роль.
Для получения дополнительной информации вы можете обратиться к документации Sklearn Logistic Regression .
источник
Вам также следует выполнить поиск по сетке для «альфа» гиперпараметра для SGDClassifier. Это явно упомянуто в документации по sklearn и, по моему опыту, сильно влияет на точность. Второй гиперпараметр, на который вы должны обратить внимание, это «n_iter» - однако я увидел меньший эффект с моими данными.
источник
TL; DR : вы можете указать сетку альфа и n_iter (или max_iter ) и использовать parfit для гипероптимизации в SGDClassifier
Мой коллега, Винай Патлолла, написал отличную запись в блоге о том, как заставить классификатор SGD работать так же, как и логистическую регрессию с использованием parfit .
Parfit - это пакет оптимизации гиперпараметров, который он использовал, чтобы найти подходящую комбинацию параметров, которая служила для оптимизации SGDClassifier для выполнения, а также для логистической регрессии на его примере набора данных за гораздо меньшее время.
Таким образом, два ключевых параметра для SGDClassifier - это альфа и n_iter . Чтобы процитировать Vinay напрямую:
источник