我有一个问题,用宽数据集运行glmnet套索.我的数据N = 50,但p> 49000,所有因素.所以要运行glmnet,我必须创建一个model.matrix,但是当我调用model.matrix(formula,data)时,我的内存耗尽,其中formula = Class~.
作为一个工作示例,我将生成一个数据集:
data <- matrix(rep(0,50*49000), nrow=50)
for(i in 1:50) {
x = rep(letters[2:8], 7000)
y = sample(x=1:49000, size=49000)
data[i,] <- x[y]
}
data <- as.data.frame(data)
x = c(rep('A', 20), rep('B', 15), rep('C', 15))
y = sample(x=1:50, size=50)
class = x[y]
data <- cbind(data, class)
Run Code Online (Sandbox Code Playgroud)
之后,我尝试创建一个model.matrix进入glmnet.
formula <- as.formula(class ~ .)
X = model.matrix(formula, data)
model <- cv.glmnet(X, class, standardize=FALSE, family='multinomial', alpha=1, nfolds=10)
Run Code Online (Sandbox Code Playgroud)
在最后一步(X = model.matrix ...),我的内存不足.我能做什么?
我期望LASSO没有惩罚($\lambda = 0 $)来产生与OLS拟合相同(或非常相似)的系数估计.但是,我在R中得到不同的系数估计值,将相同的数据(x,y)放入其中
glmnet(x, y , alpha=1, lambda=0) 对于LASSO而言,没有任何惩罚和 lm(y ~ x) 适合OLS. 这是为什么?
我遇到了glmnet的问题,因为我不断收到错误消息
"Error in elnet(x, is.sparse, ix, jx, y, weights, offset, type.gaussian, : NA/NaN/Inf in foreign function call (arg 5)
In addition: Warning message:
In elnet(x, is.sparse, ix, jx, y, weights, offset, type.gaussian, : NAs introduced by coercion"
Run Code Online (Sandbox Code Playgroud)
下面我可以使用'iris'数据集复制错误,但这里是我的特定数据的简化代码:
vars <- as.matrix(ind.vars)
lasso <- glmnet(vars, y=cup98$TARGET_D, alpha=1)
Run Code Online (Sandbox Code Playgroud)
以下是您可以轻松复制的内容:
data(iris)
attach(iris)
x <- as.matrix(data.frame(Sepal.Width, Petal.Length, Petal.Width, Species))
y <- Sepal.Length
lasso <- glmnet(x,y=y, alpha=1)
Run Code Online (Sandbox Code Playgroud)
非常感谢大家!
我很乐意在statsmodels中使用线性LASSO回归,因此为了能够使用'公式'表示法来编写模型,这可以在处理许多分类变量及其交互时节省相当多的编码时间.但是,它似乎尚未在统计模型中实现?
有人知道cv.glmnet(在R的glmnet中)或LassoCV(scikit-learn)如何选择用于交叉验证的正则化常数(lambda)序列?非常感谢你!
该glmnet软件包使用从最大值缩放的一系列LASSO调整参数lambda,lambda_max在这些参数下没有选择预测变量.我想知道如何glmnet计算这个lambda_max值.例如,在一个简单的数据集中:
set.seed(1)
library("glmnet")
x <- matrix(rnorm(100*20),100,20)
y <- rnorm(100)
fitGLM <- glmnet(x,y)
max(fitGLM$lambda)
# 0.1975946
Run Code Online (Sandbox Code Playgroud)
包装插图(http://www.jstatsoft.org/v33/i01/paper)在2.5节中描述了它计算此值如下:
sx <- as.matrix(scale(x))
sy <- as.vector(scale(y))
max(abs(colSums(sx*sy)))/100
# 0.1865232
Run Code Online (Sandbox Code Playgroud)
这显然是接近但不是相同的价值.那么,是什么导致了这种差异?在一个相关的问题中,我如何计算lambda_max逻辑回归?
我有一个包含1000个观测值和76个变量的数据集,其中约有20个是分类的。我想在整个数据集上使用LASSO。我知道通过lars或glmnet在LASSO中使用因子变量并不能真正起作用,但是变量太多了,它们可以采用太多不同的无序值来对它们进行合理的数字编码。
在这种情况下可以使用LASSO吗?我该怎么做呢?创建预测变量矩阵可产生以下响应:
hdy<-as.numeric(housingData2[,75])
hdx<-as.matrix(housingData2[,-75])
model.lasso <- lars(hdx, hdy)
Error in one %*% x : requires numeric/complex matrix/vector arguments
Run Code Online (Sandbox Code Playgroud)
我认识到其他方法可能更容易或更合适,但是实际的挑战是使用Lars或glmnet来做到这一点,因此,如果可能的话,我将不胜感激任何想法或反馈。
谢谢,
这是我的代码:
library(MASS)
library(caret)
df <- Boston
set.seed(3721)
cv.10.folds <- createFolds(df$medv, k = 10)
lasso_grid <- expand.grid(fraction=c(1,0.1,0.01,0.001))
lasso <- train(medv ~ .,
data = df,
preProcess = c("center", "scale"),
method ='lasso',
tuneGrid = lasso_grid,
trControl= trainControl(method = "cv",
number = 10,
index = cv.10.folds))
lasso
Run Code Online (Sandbox Code Playgroud)
与线性模型不同,我无法从摘要(套索)中找到套索回归模型的系数。我该怎么做?或者我可以使用 glmnet 吗?
Fused Lasso (Tibshirani 等人,2005)鼓励系数的稀疏性及其差异的稀疏性。
这是损失函数和正则化的公式:
第一项是 L2 (mse) 损失,第二项是对系数的 L1 惩罚(Lasso 正则化),最后一项是链接文章中引入的新项。
我如何用cvxpy包来模仿这个 - 具体来说,我如何实现最后一项?
分别有Lasso和Ridge Penalties 的示例代码。我大致了解这些代码是如何工作的,但有一些功能我不知道我应该如何决定使用哪一个。例如,让我们比较 Lasso 和 Ridge 惩罚代码。
# Lasso
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
def loss_fn(X, Y, beta):
return cp.norm2(cp.matmul(X, beta) - Y)**2
def regularizer(beta):
return cp.norm1(beta)
def objective_fn(X, Y, beta, lambd):
return loss_fn(X, Y, beta) + lambd * regularizer(beta)
def mse(X, Y, beta):
return (1.0 / X.shape[0]) * loss_fn(X, Y, beta).value …Run Code Online (Sandbox Code Playgroud) 主要问题:为什么 Lasso 回归的系数不会通过 最小化而缩小到零scipy.minimize?
我正在尝试使用 scipy.minimize 创建套索模型。然而,它仅在 alpha 为零时才起作用(因此仅像基本平方误差一样)。当 alpha 不为零时,它会返回更差的结果(更高的损失),并且仍然没有一个系数为零。
我知道 Lasso 是不可微分的,但我尝试使用 Powell 优化器,它应该处理非微分损失(我也尝试过 BFGS,它应该处理非平滑)。这些优化器都不起作用。
为了测试这一点,我创建了数据集,其中 y 是随机的(此处提供是可重现的),X 的第一个特征恰好是 y*.5,其他四个特征是随机的(此处也提供是可重现的)。我希望算法将这些随机系数缩小到零并只保留第一个系数,但它没有发生。
对于套索损失函数,我使用本文中的公式(图 1,第一页)
我的代码如下:
from scipy.optimize import minimize
import numpy as np
class Lasso:
def _pred(self,X,w):
return np.dot(X,w)
def LossLasso(self,weights,X,y,alpha):
w = weights
yp = self._pred(X,w)
loss = np.linalg.norm(y - yp)**2 + alpha * np.sum(abs(w))
return loss
def fit(self,X,y,alpha=0.0):
initw = np.random.rand(X.shape[1]) #initial weights
res = minimize(self.LossLasso,
initw,
args=(X,y,alpha),
method='Powell')
return res
if __name__=='__main__': …Run Code Online (Sandbox Code Playgroud) machine-learning lasso-regression scipy data-science loss-function
lasso-regression ×10
r ×6
glmnet ×5
python ×2
regression ×2
bigdata ×1
cvxpy ×1
data-science ×1
lars ×1
lm ×1
model.matrix ×1
r-caret ×1
scipy ×1
statsmodels ×1