[英]Comparing the GLMNET output of R with Python using LogisticRegression()
我正在使用L1
规范(LASSO)进行Logistic回归。
我已选择使用的glmnet
在包R
和LogisticRegression()
从sklearn.linear_model
在python
。 以我的理解,这应该给出相同的结果,但事实并非如此。
请注意,我没有缩放数据。
对于python
我已使用以下链接作为参考:
对于R
我使用以下链接:
这是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('')
当我从R
的cv.glment()
函数导出最优值时,它给出的最优lambda是0.0001
但是,如果我从python
看分析,则最佳精度/召回率是0.05
。
我试图用0.05的R
拟合模型,只有1个非零系数给我,但是在phython
我有7个。
有人可以帮助我理解为什么这种差异和差异吗?
另外,如果有人可以指导我如何在R
复制python
代码,那将非常有帮助!
乍一看,我看到了几个问题:
错别字:查看您的代码,在R中,您的第一个lambda
是0.0001
。 在Python中,您的第一个C
为0.001
。
不同的参数化:查看文档,我认为Python中R和C
中的lambda
名称有所不同。 在glmnet
,更高的lambda意味着更多的收缩。 但是,在sklearn文档中C
被描述为“正则化强度的倒数……较小的值表示更强的正则化”。
缩放:您说: “请注意,我没有缩放数据。” 这是不正确的。 在R中,您做到了。 有一个standardize
的glmnet
参数用于缩放数据,默认值为TRUE
。 在Python中,您没有。
使用交叉验证。 在R中,您可以使用cv.glmnet
对您的训练集进行k折交叉验证。 在Python中,您使用LogisticRegression
而不是LogisticRegressionCV
,所以没有交叉验证。 请注意,交叉验证依赖于随机抽样,因此,如果您在两者中均使用CV,则应期望结果接近,但不完全匹配。
可能还有其他问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.