11
votes

Pourquoi Lasso à Sklearn (Python) et Matlab Statistical Package?

J'utilise LAASOCV code> à partir de sklearn code> pour sélectionner le meilleur modèle est sélectionné par la validation croisée. J'ai constaté que la validation croisée donne un résultat différent si j'utilise la boîte à outils statistiques Sklearn ou Matlab.

J'ai utilisé matlab code> et reproduit l'exemple donné dans http://www.mathworks.se/help/stats/lasso -et-elastic-net.html Pour obtenir une figure comme celle-ci p>

Entrez la description de l'image ici p>

Ensuite, j'ai sauvegé les données matlab code> et j'ai essayé de reproduire la figure avec lauaso_path code> de sklearn code>, j'ai reçu p>

Entrez la description de l'image ici p>

Bien qu'il existe une similitude entre ces deux chiffres, il existe également certaines différences . Aussi loin que je comprenne le paramètre lambda code> dans matlab code> et alpha code> dans sklearn code> est identique, cependant dans ce chiffre qu'il semble qu'il y a des différences. Quelqu'un peut-il souligner lequel est le bon ou que je manque quelque chose? En outre, le coefficient obtenu est également différent (qui est ma principale préoccupation). P>

Code MATLAB: strong> P>

import scipy.io
import numpy as np
import pylab as pl
from sklearn.linear_model import lasso_path, LassoCV

data=scipy.io.loadmat('randomData.mat')
X=data['X']
Y=data['Y'].flatten()

model = LassoCV(cv=10,max_iter=1000).fit(X, Y)
print 'alpha', model.alpha_
print 'coef', model.coef_

eps = 1e-2 # the smaller it is the longer is the path
models = lasso_path(X, Y, eps=eps)
alphas_lasso = np.array([model.alpha for model in models])
coefs_lasso = np.array([model.coef_ for model in models])

pl.figure(1)
ax = pl.gca()
ax.set_color_cycle(2 * ['b', 'r', 'g', 'c', 'k'])
l1 = pl.semilogx(alphas_lasso,coefs_lasso)
pl.gca().invert_xaxis()
pl.xlabel('alpha')
pl.show()


1 commentaires

Je peux simplement dire que je me souviens de constatations similaires lorsque vous travaillez sur des données réelles. Les résultats MATLAB étaient différents et significativement mieux. Je n'ai pas exploré très profondément ce que ce problème découle de ce problème.


4 Réponses :


2
votes

Il est possible que alpha = lambda / n_semples
n_samples = x.shape [0] en scikit-apprendre

Une autre remarque est que votre chemin n'est pas très linéaire car il pourrait / devrait être. Envisagez de réduire la tol et augmente Max_Itre.

J'espère que cela aide


3 commentaires

Je suppose que le problème est plus que la normalisation. J'ai essayé ce qui précède et j'ai toujours eu des courbes différentes. En outre, les coefficients obtenus par la validation croisée sont très différents.


Cela ressemble toujours à un problème de paramétrage pour moi: les 2 courbes sont similaires mais décalées sur l'axe X. Un répression sur l'alpha en scikit-apprentissage pris dans l'espace journal peut provoquer cela. Le paramétrage utilisé dans SCIKIT-HORK est donné dans le Documentation . Vous pouvez également générer plus de données de la même distribution et calculer un score de régression (par exemple le coefficient de détermination R ^ 2 ou RMSE) et vérifiez que la valeur optimale de l'alpha est trouvée près de la valeur de la croix validée de l'alpha.


@IMSC Avez-vous essayé avec alpha = lambda / (2 * x.shape [0]) ?



-2
votes

Bien que je ne puisse pas comprendre ce qui cause le problème, il y a une direction logique dans laquelle continuer.

Ce sont les faits:

  • Mathworks ont sélectionné un exemple et ont décidé d'y inclure dans leur documentation
  • Votre code MATLAB produit exactement le résultat comme exemple.
  • L'alternative ne correspond pas au résultat et a fourni des résultats inexacts dans le passé

    C'est mon hypothèse:

    • La chance que Mathworks aient choisi de mettre un exemple incorrect dans leur documentation est négligeable par rapport aux chances que la reproduction de cet exemple de manière alternative ne donne pas le résultat correct.

      Conclusion logique: votre implémentation de MATLAB de cet exemple est fiable et l'autre n'est pas. Cela pourrait être un problème dans le code, ou peut-être dans la façon dont vous l'utilisez, mais de toute façon la seule conclusion logique serait que vous devriez continuer avec MATLAB pour sélectionner votre modèle.


3 commentaires

C'est un argument très faible pour annoncer une technologie sur une autre. Sklearn fournit également des exemples. Serait-il reproductible par le code Matlab? En fait, Lasso ressemble plus à une classe de solutaire qu'un algorithme défini avec précision. Il est donc plus probable que l'algorithme diffère légèrement. Indiquant que Scikit-apprendre n'est pas fiable sur la base de vos arguments est assez dur.


Je ne voulais pas impliquer cela, j'ai répété ma réponse légèrement plus claire.


Merci d'avoir répondu. Scikit-apprendre est en effet un module bien implémenté. Cependant, la documentation et les exemples manquent toujours de ce qui cause le problème ci-dessus. Je pourrais résoudre le problème par une bonne normalisation.



3
votes

Je n'ai pas de matlab mais veillez à ce que la valeur obtenue avec la validation croisée puisse être instable. C'est parce qu'il a influencé par la façon dont vous subdivisez les échantillons.

Même si vous exécutez 2 fois la validation croisée dans Python, vous pouvez obtenir 2 résultats différents. Considérez cet exemple: xxx


0 commentaires

0
votes

Je sais que c'est un vieux fil, mais:

Je travaille réellement sur la tuyauterie sur lassocv code> à partir de GLMNET code> (in r), et j'ai trouvé que lassocv code> ne fonctionne pas trop bien avec la normalisation de la matrice X (même si vous spécifiez le paramètre normalisé = true code>). p>

Essayez de normaliser le X matrice d'abord lorsque vous utilisez LassOCV. P>

S'il s'agit d'un objet Pandas, P>

(X - X.mean())/X.std()


0 commentaires