Metodą trenowania regresji logistycznej jest użycie stochastycznego spadku gradientu, do którego scikit-learn oferuje interfejs.
Co chciałbym zrobić, to wziąć scikit-learn na SGDClassifier i mieć go zdobyć taki sam jak regresja logistyczna tutaj . Jednak muszę brakować niektórych ulepszeń uczenia maszynowego, ponieważ moje wyniki nie są równoważne.
To jest mój obecny kod. Czego mi brakuje w SGDClassifier, który dałby takie same wyniki jak regresja logistyczna?
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)
Moja produkcja:
Accuracy score of LogisticRegression: 0.946666666667
Accuracy score of SGDClassifier: 0.76
Odpowiedzi:
Komentarze na temat numeru iteracji są na miejscu. Domyślnie oznacza
SGDClassifier
n_iter
to,5
że wykonujesz5 * num_rows
kroki w przestrzeni wagowej. Reguła sklearn kciuka wynosi ~ 1 milion kroki dla typowych danych. Na przykład ustaw go na 1000, aby najpierw osiągnąć tolerancję. Twoja dokładność jest niższa,SGDClassifier
ponieważ osiąga limit iteracji przed tolerancją, więc „wcześnie przestajesz”Szybko i brudnie modyfikując kod otrzymuję:
źródło
SGDClassifier, jak sama nazwa wskazuje, wykorzystuje algorytm gradientu stochastycznego jako algorytm optymalizacji.
Jeśli spojrzysz na implementację LogisiticRegression w Sklearn, dostępnych jest pięć technik optymalizacji (solver), a domyślnie jest to „LibLinear”, który używa zbieżności współrzędnych (CD).
Oprócz liczby iteracji optymalizacja, rodzaj regularyzacji (kara) i jej wielkość (C) również wpływają na wydajność algorytmu.
Jeśli używasz go do strojenia zestawu danych Iris, wszystkie te hiper-parametry mogą nie przynieść znaczących zmian, ale w przypadku złożonego zestawu danych odgrywają znaczącą rolę.
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją regresji logistycznej Sklearn .
źródło
Powinieneś także wyszukać w siatce hiperparametr „alfa” dla SGDClassifier. Jest to wyraźnie wymienione w dokumentacji sklearn i z mojego doświadczenia ma duży wpływ na dokładność. Drugi hiperparametr, na który powinieneś spojrzeć, to „n_iter” - jednak widziałem mniejszy efekt w moich danych.
źródło
TL; DR : Możesz określić siatkę alfa i n_iter (lub max_iter ) i użyć parfit do hiperoptymalizacji na SGDClassifier
Mój kolega, Vinay Patlolla, napisał doskonały post na blogu na temat tego, jak sprawić, by SGD Classifier działał, a także regresji logistycznej za pomocą parfit .
Parfit to pakiet optymalizacji hiperparametrów, który wykorzystał do znalezienia odpowiedniej kombinacji parametrów, które posłużyły do zoptymalizowania SGDClassifier do wykonania, a także regresji logistycznej na jego przykładowym zestawie danych w znacznie krótszym czasie.
Podsumowując, dwa kluczowe parametry SGDClassifier to alfa i n_iter . Cytując bezpośrednio Vinay:
źródło