gpt4 book ai didi

python - 带有大量参数的逻辑回归

转载 作者:行者123 更新时间:2023-11-30 22:47:16 26 4
gpt4 key购买 nike

我可以访问一些投注数据。 IE。 30.000 名不同用户的历史投注建议及其结果和原始赔率。

鉴于用户提出新的投注建议,我想预测投注成真的概率。我将从一个非常简单的二项式模型开始

P(bet = success | user = u and odds = o) = exp(1/o + b_u) / (1 + exp(1/o + b_u) )

因此,logit 概率截距由投注网站 (1/赔率) 确定,并且具有来自用户的加性效应,因此我最终得到 30.000 个参数。

我打算在Python或R中使用逻辑回归来估计参数。在Python中使用patsy(创 build 计矩阵)或在R中使用glm我遇到了内存问题。有人对如何解决这个问题有建议吗?

最佳答案

这是我对您的问题的理解。您的数据集包含 30000 个用户的 350 万个投注。每个赌注都有一个规定的结果(用户下注的内容)和实际结果。您想要预测陈述的结果和实际的结果是否相同,即用户是否获胜。

因此,您(至少)有 2 个预测变量:投注网站给出的赔率和用户 ID,后者是具有 30000 个级别的因子。您可以将数据表示为 350 万 x 3 数据框:winoddsuser。然后使用 glmnet 拟合弹性网络模型,因为您有大约 30k 回归系数,并且某种形式的正则化可能不是一个坏主意。

第一个问题是创建适合模型的模型矩阵会消耗大量内存。幸运的是,glmnet 为您提供了使用稀疏模型矩阵的选项,因此只需要大量但仍然合理的内存。

第二个问题是,至少在 R 中,即使您有足够的内存,创建模型矩阵也可能比拟合模型本身花费更多时间。

您可以使用 glmnetUtils 包来解决这些问题。 glmnetUtils是glmnet的一个shell,使建模更加容易;它支持公式界面,并且还简化了像这样的广泛数据集的处理。特别是,它克服了上述 R 内置模型矩阵功能的限制。

示例代码:

library(glmnetUtils)

# build an example data frame
# response is win
# predictors are real_logodds (ie, as offered by betting company) and user ID
set.seed(34567)
df <- local({
nbets <- 3.5e6
nusers <- 30000
user <- sample(nusers, size=nbets, replace=TRUE)
real_logodds <- rlogis(nbets)
b_user <- rnorm(nusers, sd=0.1)
user_logodds <- b_user[user] + real_logodds
outcome <- rbinom(nbets, size=1, prob=plogis(real_logodds))
bet <- rbinom(nbets, size=1, prob=plogis(user_logodds))
win <- outcome == bet
data.frame(win, outcome, bet, user=factor(user), real_logodds)
})

system.time(mod <- glmnet(win ~ real_logodds + user, data=df, family="binomial",
sparse=TRUE))
# user system elapsed
# 30.77 1.19 30.94

mod
# Call:
# glmnet.formula(formula = win ~ real_logodds + user, data = df,
# family = "binomial", sparse = TRUE)
#
# Model fitting options:
# Sparse model matrix: TRUE
# Use model.frame: FALSE
# Alpha: 1
# Lambda summary:
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 2.032e-05 5.528e-05 1.503e-04 2.792e-04 4.086e-04 1.110e-03


system.time(cvmod <- cv.glmnet(win ~ real_logodds + user, data=df, family="binomial",
sparse=TRUE))
# user system elapsed
# 373.60 26.82 388.58

cvmod
# Call:
# cv.glmnet.formula(formula = win ~ real_logodds + user, data = df,
# family = "binomial", sparse = TRUE)
#
# Model fitting options:
# Sparse model matrix: TRUE
# Use model.frame: FALSE
# Number of crossvalidation folds: 10
# Alpha: 1
# Deviance-minimizing lambda: 0.0007649709 (+1 SE): 0.001109842

在这里,我使用问题中给出的尺寸生成一个示例数据框。然后我拟合正则化逻辑回归,这大约需要 30 秒。我还进行了10倍交叉验证来选择弹性净收缩参数,大约需要6分钟。

披露:我是 glmnetUtils 的作者。

关于python - 带有大量参数的逻辑回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40574843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com