Eine Möglichkeit, eine logistische Regression zu trainieren, besteht in der Verwendung einer stochastischen Gradientenabnahme, zu der scikit-learn eine Schnittstelle bietet.
Was ich möchte , ist zu tun , nehmen Sie einen Scikit-Learn des SGDClassifier und haben sie das gleiche wie eine logistische Regression punkten hier . Ich muss jedoch einige Verbesserungen beim maschinellen Lernen verpassen, da meine Punktzahlen nicht gleichwertig sind.
Das ist mein aktueller Code. Was fehle ich am SGDClassifier, der die gleichen Ergebnisse wie eine logistische Regression liefern würde?
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)
Meine Ausgabe:
Accuracy score of LogisticRegression: 0.946666666667
Accuracy score of SGDClassifier: 0.76
Antworten:
Die Kommentare zur Iterationsnummer sind genau richtig. Der Standard
SGDClassifier
n_iter
wird das5
heißt , Sie tun5 * num_rows
Schritte in Gewicht Raum. Die Sklearn-Faustregel für typische Daten lautet ~ 1 Million Schritte. Für Ihr Beispiel setzen Sie es einfach auf 1000 und es könnte zuerst die Toleranz erreichen. Ihre Genauigkeit ist geringer,SGDClassifier
da sie die Iterationsgrenze vor der Toleranz erreicht, sodass Sie "vorzeitig anhalten".Wenn ich deinen Code schnell und schmutzig ändere, bekomme ich:
quelle
SGDClassifier verwendet, wie der Name schon sagt, Stochastic Gradient Descent als Optimierungsalgorithmus.
Wenn Sie sich die Implementierung von LogisiticRegression in Sklearn ansehen, stehen fünf Optimierungstechniken (Solver) zur Verfügung. Standardmäßig verwendet 'LibLinear' die Funktion Coordinate Descent (CD) zur Konvergenz.
Neben der Anzahl der Iterationen beeinflussen auch die Optimierung, die Art der Regularisierung (Penalty) und deren Größe (C) die Leistung des Algorithmus.
Wenn Sie es mit der Optimierung von Iris-Datensätzen ausführen, bringen all diese Hyperparameter möglicherweise keine signifikanten Änderungen mit sich, aber für komplexe Datensätze spielen sie eine bedeutende Rolle.
Weitere Informationen finden Sie in der Dokumentation zur logistischen Regression von Sklearn .
quelle
Sie sollten auch eine Rastersuche nach dem Hyperparameter "alpha" für den SGDClassifier durchführen. Es wird ausdrücklich in der sklearn-Dokumentation erwähnt und hat nach meiner Erfahrung einen großen Einfluss auf die Genauigkeit. Der zweite Hyperparameter, den Sie sich ansehen sollten, ist "n_iter" - allerdings habe ich bei meinen Daten einen geringeren Effekt gesehen.
quelle
TL; DR : Sie können ein Raster aus alpha und n_iter (oder max_iter ) angeben und parfit für die Hyperoptimierung in SGDClassifier verwenden
Mein Kollege, Vinay Patlolla, schrieb einen hervorragenden Blogbeitrag über die Leistung von SGD Classifier und die logistische Regression mit Parfit .
Parfit ist ein Hyperparameter-Optimierungspaket, mit dem er die geeignete Kombination von Parametern fand, die dazu diente, SGDClassifier für die Ausführung sowie die logistische Regression seines Beispieldatensatzes in viel kürzerer Zeit zu optimieren.
Zusammenfassend sind die beiden Schlüsselparameter für SGDClassifier alpha und n_iter . Um Vinay direkt zu zitieren:
quelle