Сравнение вывода GLMNET R с Python с использованием LogisticRegression()

Я использую логистическую регрессию с нормой L1 (LASSO).

Я решил использовать пакет glmnet в R и LogisticRegression()из пакета sklearn.linear_model в python. Насколько я понимаю, это должно дать те же результаты, но это не так.

Обратите внимание, что я не масштабировал свои данные.

Для python я использовал приведенную ниже ссылку в качестве ссылки:

https://chrisalbon.com/machine_learning/logistic_regression/logistic_regression_with_l1_regularization/

и для R я использовал ссылку ниже:

http://www.sthda.com/english/articles/36-classification-methods-essentials/149-penalized-logistic-regression-essentials-in-r-ridge-lasso-and-elastic-net/?fbclid=IwAR0ZTjoGqRgH5vNum9CloeGVaHdwlqDHwDdoGKJXwncOgIT98qUXGcnV70k

Вот код, используемый в R

###################################
#### LASSO LOGISTIC REGRESSION ####
##################################
x <- model.matrix(Y~., Train.Data.SubPop)[,-1]
y <- Train.Data.SubPop$Y
lambda_seq = c(0.0001, 0.01, 0.05, 0.0025)

cv_output <- cv.glmnet(x,y,alpha=1, family = "binomial", lambda = lambda_seq)

cv_output$lambda.min

lasso_best <- glmnet(x,y, alpha = 1, family = "binomial", lambda = cv_output$lambda.min)

Ниже мой код Python:

C = [0.001, 0.01, 0.05, 0.0025]

for c in C:
    clf = LogisticRegression(penalty='l1', C=c, solver='liblinear')
    clf.fit(X_train, y_train)
    print('C:', c)
    print('Coefficient of each feature:', clf.coef_)
    print('Training accuracy:', clf.score(X_train_std, y_train))
    print('Test accuracy:', clf.score(X_test_std, y_test))
    print('')

Когда я экспортировал оптимальное значение из функции cv.glment() в R, это дало мне, что оптимальная лямбда равна 0.0001, однако, если я посмотрю на анализ из python, лучшая точность/точность и полнота были получены из 0.05.

Я попытался подогнать модель с 0,05 в R и дал мне только 1 ненулевой коэффициент, а в phython у меня было 7.

может кто-нибудь помочь мне понять, почему это несоответствие и разница pleasE?

Кроме того, если кто-то может подсказать, как воспроизвести код python в R, это было бы очень полезно!


person Lise    schedule 09.09.2019    source источник


Ответы (1)


На первый взгляд я вижу несколько проблем:

  1. Опечатка: Глядя на ваш код, в R ваш первый lambda — это 0.0001. В Python вашим первым C будет 0.001.

  2. Различная параметризация: Глядя на документацию, я думаю, что есть ключ к разнице в именах lambda в R и C в Python. В glmnet более высокое значение лямбда означает большую усадку. Однако в документах sklearn C описывается как «обратная сила регуляризации... меньшие значения указывают на более сильную регуляризацию».

  3. Масштабирование: вы говорите "Обратите внимание, что я не масштабировал свои данные". Это неверно. В R вы сделали. Существует glmnet аргумент standardize для масштабирования данных, и значение по умолчанию — TRUE. В Python вы этого не сделали.

  4. Использование перекрестной проверки. В R вы используете cv.glmnet для k-кратной перекрестной проверки вашего тренировочного набора. В Python вы используете LogisticRegression, а не LogisticRegressionCV, поэтому нет перекрестной проверки. Обратите внимание, что перекрестная проверка основана на случайной выборке, поэтому, если вы используете CV в обоих случаях, вы должны ожидать, что результаты будут близкими, но не точными.

Возможно, есть и другие проблемы.

person Gregor Thomas    schedule 09.09.2019
comment
Спасибо за это, я посмотрю, работают ли они - person Lise; 09.09.2019