gpt4 book ai didi

python - 为什么sklearn(python)和matlab统计包中的LASSO不同?

转载 作者:太空狗 更新时间:2023-10-29 18:08:47 25 4
gpt4 key购买 nike

我正在使用 sklearn 中的 LaasoCV 来选择通过交叉验证选择的最佳模型。我发现如果我使用 sklearn 或 matlab 统计工具箱,交叉验证会给出不同的结果。

我使用了 matlab 并复制了中给出的示例 http://www.mathworks.se/help/stats/lasso-and-elastic-net.html得到这样的图

enter image description here

然后我保存了 matlab 数据,并尝试用 sklearn 中的 laaso_path 复制图形,我得到了

enter image description here

虽然这两个数字之间有一些相似之处,但也有一定的差异。据我了解 matlab 中的参数 lambdasklearn 中的 alpha 是相同的,但是在这个图中似乎有一些差异。有人可以指出哪个是正确的还是我遗漏了什么?此外,获得的系数也不同(这是我主要关心的问题)。

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,但请注意交叉验证获得的值可能不稳定。这是因为它受到您分割样本的方式的影响。

即使您在 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

关于python - 为什么sklearn(python)和matlab统计包中的LASSO不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12746479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com