Warning: `rbernoulli()` was deprecated in purrr 1.0.0.
x <-torch_tensor(X)y <-torch_tensor(Y)logistic_loss <-function(theta, x, y) {if (!is(theta, "torch_tensor")) {stop("theta must be a torch tensor") } odds <-torch_matmul(x, theta) log_lik <-torch_dot(y, odds) -torch_sum(torch_log(1+torch_exp(odds)))return(-log_lik)}logistic_loss(theta =torch_tensor(theta), x = x, y = y)
On vérifie qu’on retrouve bien les mêmes coefficient en utilisant le package {glm} dans {tidymodels} pour effectuer notre régression logistique :
set.seed(20)data_df <-data.frame(Y =as.factor(Y), X = X)logistic_reg(engine ="glm") %>%fit(Y ~0+ X.1+ X.2+ X.3, family ="binomial", data = data_df) %>%extract_fit_engine() %>%# besoin d'extraire l'objet lmcoef()
X.1 X.2 X.3
1.7914697 -1.0379660 -0.9728552
Le package {brulee} de l’univers tidymodels propose différents modèles classiques (réseau de neurones, régression logistique, régression linéaire, régression multinomiale) via l’infrastructure torch. La liste des loss disponibles dans le package :
On va regarder ici comment faire la même régression logistique que précédemment. Il est possible de spécifier soit avec les données sous forme de data.frame soit en utilisant des matrices. Deux procédures d’optimisation sont disponibles : ‘LBFGS’ et ‘SGD’.
A noter qu’il n’est pas possible de spécifier un modèle sans intercept, ni avec 0+ ni avec -1.
En théorie il est possible récupérer les coefficients du modèle ajusté avec la méthode coef en spécifiant l’epoch désirée. Si epoch = NULL la meilleure epoch est choisie.