Il y a une raison d'être ici.
Perceptron
shares la plupart du code avec SGDClassifier
Perceptron et SGDClassifier partagent la même mise en œuvre sous-jacente. En fait, Perceptron() est équivalent à SGDClassifier (loss = "perceptron", eta0 = 1, learning_rate = "constant", penalty = None).
et SGDClassifier
est better documented:
Note: La mise en œuvre clairsemée produit des résultats légèrement différents que la mise en œuvre dense en raison d'un taux d'apprentissage diminué pour l'interception.
nous avons plus de détails latter:
Dans le cas des vecteurs de caractéristiques rares, l'interception est mis à jour avec un plus petit taux d'apprentissage (multiplié par 0,01) pour tenir compte du fait qu'il est mis à jour plus fréquemment.
Notez que cette détails d'implémentation vient de Leon Bottou:
Le taux d'apprentissage pour le biais est multiplié par 0,01, car cela améliore souvent le nombre de conditions.
Pour être complet, en scikit-learn code:
SPARSE_INTERCEPT_DECAY = 0.01
# For sparse data intercept updates are scaled by this decay factor to avoid
# intercept oscillation.
exemple Bonus:
import numpy as np
import scipy.sparse as sp
from sklearn.linear_model import Perceptron
np.random.seed(42)
n_samples, n_features = 1000, 10
X_dense = np.random.randn(n_samples, n_features)
X_csr = sp.csr_matrix(X_dense)
y = np.random.randint(2, size=n_samples)
for X in [X_dense, X_csr]:
model = Perceptron(penalty='l2', alpha=0.0001, fit_intercept=True,
max_iter=10000, tol=1e-8, shuffle=True, verbose=0,
eta0=1.0, n_jobs=1, random_state=0, class_weight=None,
warm_start=False, n_iter=None)
model.fit(X, y)
print(model.coef_)
Vous pouvez vérifier que les coefficients sont différents. Modification fit_intercept
à False
rend les coefficients égaux, mais l'ajustement peut être plus pauvre.
Veuillez montrer un exemple reproductible. – sascha
@sascha, Désolé pour le miss. Donc, vous pouvez vous référer à l'exemple de la réponse acceptée :) –