Почему LASSO в sklearn (python) и статистическом пакете Matlab отличается?
Я использую LaasoCV
из sklearn
, чтобы выбрать лучшую модель, выбранную путем перекрестной проверки. Я обнаружил, что перекрестная проверка дает другой результат, если я использую статистическую панель инструментов sklearn или matlab.
Я использовал matlab
и повторил пример, приведенный в
http://www.mathworks.se/help/stats/lasso-and-elastic-net.html
чтобы получить такую цифру
![enter image description here]()
Затем я сохранил данные matlab
и попытался воспроизвести фигуру с laaso_path
с sklearn
, я получил
![enter image description here]()
Несмотря на некоторое сходство между этими двумя цифрами, есть также определенные различия. Насколько я понимаю, параметр 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()
Ответы
Ответ 1
возможно, что alpha = lambda / n_samples
где n_samples = X.shape[0]
в scikit-learn
другое замечание состоит в том, что ваш путь не слишком кусочно-линейный, как мог/должен быть. Рассмотрим уменьшение tol и увеличение max_iter.
надеюсь, что это поможет
Ответ 2
У меня нет 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
Ответ 3
Я знаю, что это старый поток, но:
Я действительно работаю над переходом на LassoCV
из glmnet
(в R), и я обнаружил, что LassoCV
не слишком хорошо справляется с нормализацией матрицы X (даже если вы укажете параметр normalize = True
).
Сначала попробуйте нормализовать матрицу X при использовании LassoCV.
Если это объект pandas,
(X - X.mean())/X.std()
Кажется, вам также нужно несколько альфа на 2
Ответ 4
Хотя я не могу понять, что вызывает проблему, существует логическое направление, в котором можно продолжить.
Вот факты:
- Mathworks выбрали пример и решили включить его в свою документацию
- Ваш код matlab производит именно результат в качестве примера.
- Альтернатива не соответствует результату и дала неточные результаты в прошлом
Это мое предположение:
- Вероятность того, что mathworks выбрала неправильный пример в своей документации, является пренебрежимым по сравнению с тем, что воспроизведение этого примера альтернативным способом не дает правильного результата.
Логический вывод: ваша реализация Matlab этого примера является надежной, а другая - нет.
Это может быть проблемой в коде, или, может быть, в том, как вы его используете, но в любом случае единственным логическим выводом будет то, что вы должны продолжить работу с Matlab, чтобы выбрать вашу модель.