2017-10-19 14 views
1

Perceptron, lorsqu'il est donné la matrice en format dense, donne des résultats différents par rapport à donner la même matrice dans un format clairsemé. Je pensais que cela pourrait être un problème de mélange, donc j'ai couru la validation croisée en utilisant cross_validate de sklearn.model_selection mais pas de chance.SKLearn Perceptron se comporte différemment pour faible et dense

Un problème similaire est traité here. Mais il y a une justification donnée. Y a-t-il une justification ici?

Pour votre information, les paramètres que je utilise Perceptron avec sont: 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

J'utilise sparse.csr_matrix pour convertir la matrice dense à clairsemée comme réponse acceptée here

+1

Veuillez montrer un exemple reproductible. – sascha

+0

@sascha, Désolé pour le miss. Donc, vous pouvez vous référer à l'exemple de la réponse acceptée :) –

Répondre

1

Il y a une raison d'être ici.

Perceptronshares 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.

+0

Donc, idéalement parlant, si je change le délai à 1, ils devraient effectuer la même chose mais je pourrais faire face à des problèmes comme mentionné (oscillation d'interception). [email protected] –

+0

Droite. Mais si vos données ne sont pas éparses (même si l'objet est une matrice CSR), vous n'aurez pas de problèmes. À l'inverse, si vos données sont très clairsemées mais stockées dans un objet dense, vous risquez de rencontrer des problèmes d'oscillations d'interception. – TomDLT