私はLaasoCV
からsklearn
まで、クロスバリデーションによって最良のモデルを選択しています。私はsklearnまたはmatlab統計ツールボックスを使用すると、クロスバリデーションが異なる結果になることがわかりました。LASSOはsklearn(python)とmatlabの統計パッケージが異なるのはなぜですか?
私は、私は、その後、私はmatlab
データを保存し、sklearn
からlaaso_path
と数字を複製しようとしたmatlab
を使用して、この
のような数字を取得するために http://www.mathworks.se/help/stats/lasso-and-elastic-net.html で与えられた例を複製gotこれらの2つの数字の間にはいくつかの類似点がありますが、特定の違いもあります。私が知る限り、パラメータlambda
はmatlab
とalpha
はsklearn
で同じですが、この図ではいくつかの違いがあるようです。誰かが正しいものを指摘することができますか、何か不足していますか?さらに、得られた係数も異なる(これが私の主な関心事である)。
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()
することにより、複数のアルファに必要と思われます。 Matlabの結果は大きく異なっていました。私は、この問題が何を原因としているかを深く探っていませんでした。 – Bitwise