11

LaasoCVfromを使用しsklearnて、クロス検証によって選択された最適なモデルを選択しています。sklearnまたはmatlab統計ツールボックスを使用すると、交差検証の結果が異なることがわかりました。

http://www.mathworks.se/help/stats/lasso-and-elastic-net.htmlに示されている例を使用matlabして複製し、 このような図を取得しました

ここに画像の説明を入力

次に、データを保存し、fromでmatlab図を複製しようとしましたが、得られましたlaaso_pathsklearn

ここに画像の説明を入力

これら 2 つの図にはいくつかの類似点がありますが、特定の相違点もあります。私が理解している限り、パラメータlambdainmatlabalphainsklearnは同じですが、この図ではいくつかの違いがあるようです。誰かが正しいものを指摘できますか、それとも何か不足していますか? さらに、得られた係数も異なります(これが私の主な関心事です)。

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()
4

4 に答える 4

3

私はmatlabを持っていませんが、交差検証で得られた値が不安定になる可能性があることに注意してください。これは、サンプルを細分化する方法の影響を受けるためです。

Python でクロス検証を 2 回実行しても、2 つの異なる結果が得られます。この例を考えてみましょう:

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
于 2013-12-08T18:45:11.013 に答える
2

scikit-learn のalpha = lambda / n_samples
どこにある可能性がありますn_samples = X.shape[0]

別の発言は、あなたのパスはそれほど区分的に線形ではないということです。tol を減らし、max_iter を増やすことを検討してください。

お役に立てれば

于 2012-10-05T16:55:02.123 に答える
-2

問題の原因を突き止めることはできませんが、続行する論理的な方向性はあります。

これらは事実です:

  • Mathworks は例を選択し、ドキュメントに含めることにしました
  • あなたの matlab コードは、例とまったく同じ結果を生成します。
  • 代替案は結果と一致せず、過去に不正確な結果を提供しました

これは私の仮定です:

  • mathworks が誤った例をドキュメントに掲載することを選択した可能性は、この例を別の方法で再現しても正しい結果が得られない可能性に比べれば無視できます。

論理的な結論: この例の matlab 実装は信頼できますが、他の実装はそうではありません。これはコードの問題か、使用方法に問題がある可能性がありますが、いずれにせよ唯一の論理的な結論は、Matlab を使用してモデルを選択する必要があるということです。

于 2012-10-10T11:23:47.340 に答える