2012-10-05 15 views
11

私はLaasoCVからsklearnまで、クロスバリデーションによって最良のモデルを選択しています。私はsklearnまたはmatlab統計ツールボックスを使用すると、クロスバリデーションが異なる結果になることがわかりました。LASSOはsklearn(python)とmatlabの統計パッケージが異なるのはなぜですか?

私は、私は、その後、私はmatlabデータを保存し、sklearnからlaaso_pathと数字を複製しようとしたmatlabを使用して、この

enter image description here

のような数字を取得するために http://www.mathworks.se/help/stats/lasso-and-elastic-net.html で与えられた例を複製gotこれらの2つの数字の間にはいくつかの類似点がありますが、特定の違いもあります。私が知る限り、パラメータlambdamatlabalphasklearnで同じですが、この図ではいくつかの違いがあるようです。誰かが正しいものを指摘することができますか、何か不足していますか?さらに、得られた係数も異なる(これが私の主な関心事である)。

MATLABコード:

rng(3,'twister') % for reproducibility 
X = zeros(200,5); 
for ii = 1:5 
     X(:,ii) = exprnd(ii,200,1); 
end 
r = [0;2;0;-3;0]; 
Y = X*r + randn(200,1)*.1; 

save randomData.mat % To be used in python code 

[b fitinfo] = lasso(X,Y,'cv',10); 
lassoPlot(b,fitinfo,'plottype','lambda','xscale','log'); 

disp('Lambda with min MSE') 
fitinfo.LambdaMinMSE 
disp('Lambda with 1SE') 
fitinfo.Lambda1SE 
disp('Quality of Fit') 
lambdaindex = fitinfo.Index1SE; 
fitinfo.MSE(lambdaindex) 
disp('Number of non zero predictos') 
fitinfo.DF(lambdaindex) 
disp('Coefficient of fit at that lambda') 
b(:,lambdaindex) 

Pythonのコード:

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() 
+0

することにより、複数のアルファに必要と思われます。 Matlabの結果は大きく異なっていました。私は、この問題が何を原因としているかを深く探っていませんでした。 – Bitwise

答えて

2

それはscikit-学ぶ

別の発言でn_samples = X.shape[0]がどこにあるかalpha = lambda/n_samples
いる可能性がありますあなたの道はそれができる/そうでなければならないほど非常に区分的ではないということです。 tolを減らし、max_iterを大きくすることを検討してください。

が、これは私が問題を引き起こしているかを把握することができませんが、継続する論理方向がある

+0

問題は正規化以上のものだと思います。私は上記の1つを試みたが、まだ異なる曲線を持っています。さらに、クロスバリデーションによって得られた係数は非常に異なっている。 – imsc

+0

これは私にとってパラメータ化の問題のように見えます.2つのカーブは同じように見えますが、X軸上にシフトしています。ログ空間で撮影されたscikit-learnでアルファをリスケーリングすると、これが発生する可能性があります。 scikit-learnで使用されるパラメータ設定は、[documentation](http://scikit-learn.org/stable/modules/linear_model.html#lasso)に記載されています。 同じ分布からより多くのデータを生成し、回帰スコア(例えば、r^2の決定係数またはRMSE)を計算して、アルファの最適値がアルファの相互検証された値に近いことを確認することもできます。 – ogrisel

+0

@imsc 'alpha = lambda /(2 * X.shape [0])'で試してみましたか? – ogrisel

-1

に役立ちます願っています。

これらは事実である:

  • Mathworks社は、例を選択し、MATLABコードは例として、正確に結果を生成する
  • その文書に含めることにしました。
  • 代替は、結果が一致しないと、これは私の仮定で過去

に不正確な結果を提供しています

  • MathWorks社は、そのドキュメントに間違った例を置くことを選択したことをチャンス代替的な方法でこの例を再現しても正しい結果が得られない可能性と比較して無視することができる。

論理的な結論:この例のmatlabの実装は信頼でき、もう一方は信頼できません。 これはコードの問題、または使用方法に問題があるかもしれませんが、唯一の論理的な結論は、Matlabでモデルを選択し続けることだけです。

+0

これは、1つのテクノロジーを別のテクノロジーにアドバタイズするための非常に弱い議論です。 sklearnもexemplesを提供します。それはmatlabのコードで再現可能でしょうか?実際には、LASSOは正確に定義されたアルゴリズムよりも一種のソルバーのようなものです。したがって、アルゴリズムがわずかに異なる可能性が高くなります。あなたの議論に基づいてscikit-learnが信頼できないと言うことはかなり厳しいです。 –

+0

私はこれを暗示したくなかった、私は少し明確にするために私の答えを少し言い換えた。 –

+0

答えをありがとう。 'scikit-learn'は確かによく実装されたモジュールです。しかし、上記の問題の原因となっている文書や例はまだ不足しています。適切な正規化によって問題を解決することができました。 – imsc

2

私はmatlabを持っていませんが、クロスバリデーションで得られた値が不安定になる可能性があることに注意してください。これは、サンプルを細分する方法に影響を受けたためです。

Pythonで相互検証を2回実行しても、2つの異なる結果が得られます。 この例を考えてみます。私は実際に(Rで)glmnetからLassoCVにオーバー、配管に取り組んでいる、と私は「はLassoCVはdoesnの見つけ

kf=sklearn.cross_validation.KFold(len(y),n_folds=10,shuffle=True) 
cv=sklearn.linear_model.LassoCV(cv=kf,normalize=True).fit(x,y) 
print cv.alpha_ 
kf=sklearn.cross_validation.KFold(len(y),n_folds=10,shuffle=True) 
cv=sklearn.linear_model.LassoCV(cv=kf,normalize=True).fit(x,y) 
print cv.alpha_ 

0.00645093258722 
0.00691712356467 
0

私は、これは古いスレッドですけど、たとえパラメータnormalize = Trueを指定しても、最初にX行列を正規化するとうまくできません。

LassoCVを使用するときは、最初にXマトリックスを正規化してみてください。

それはパンダのオブジェクトがある場合は、

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

あなたにも、私は、実際のデータで作業するとき、私は同様の調査結果を思い出すだけを言うことができる2

関連する問題