I have a burning question. First, in Python:
import os
import time
import numpy as np
from sklearn.linear_model import LassoCV
from sklearn.datasets import make_regression
X, y = make_regression(1000, 5000, noise = 4, random_state = 123)
if not os.path.exists("tmp"): os.mkdir("tmp")
# Save on disk to be read in R session.
np.save("tmp/X.npy", X)
np.save("tmp/y.npy", y)
# Let first 70% rows be training examples.
Nrow = int(round(len(X) * 0.7))
tik = time.time()
reg = LassoCV(cv = 5).fit(X[:Nrow, :], y[:Nrow])
time.time() - tik
# 6.59s
# Compute mse on the validation examples:
np.mean((reg.predict(X[Nrow:, :]) - y[Nrow:]) ** 2)
# 19.036
Then in R:
X = RcppCNPy::npyLoad("tmp/X.npy") # Load the data saved from Python session.
y = RcppCNPy::npyLoad("tmp/y.npy")
# First 70% rows are training data.
trainInd = 1:as.integer(round(nrow(X) * 0.7))
system.time({
reg = glmnet::cv.glmnet(
X[trainInd, ], y[trainInd], type.measure = "mse", nfolds = 5)
})
# 1.047s
mean((predict(reg, X[-trainInd, ], s = "lambda.min") - y[-trainInd]) ^ 2)
# 32.01
Why does R glmnet
result in an MSE 68% higher than that from Python sklearn
? I anticipated glmnet
would be faster, but a 6.6x speedup over sklearn
seems to suggest glmnet
skipped something important, which might contribute to its significantly worse error metric? I couldn't figure out where I did wrong..