0
votes

Comment modifier itérativement la valeur variable jusqu'à ce que toutes les probabilités prévues soient supérieures à .5

J'essaie d'écrire du code qui soustrait une valeur donnée à partir d'une variable jusqu'à ce que chaque ligne ait une probabilité prédite à ou plus .05.

train <- data.frame('cost'= c(120, 3, 2, 4, 10, 110, 200, 43, 1, 51, 22, 14),
                    'price' = c(120, 20, 10, 4, 3, 4, 30, 43, 56, 88, 75, 44),
                    'dich' = c(0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0))

train$dich <- as.factor(train$dich)

test <- data.frame('cost'= c(13, 5, 32, 22, 14, 145, 54, 134, 11, 14, 33, 21),
                   'price' = c(32, 11, 210, 6, 3, 7, 22, 423, 19, 99, 192, 32)
            )

model <- glm(dich ~ cost + price,
             data = train, 
             family = "binomial")

pred  <-   predict(model, test, type = "response")

           1            2            3            4 
3.001821e-01 4.442316e-01 4.507495e-04 6.310900e-01 
           5            6            7            8 
5.995459e-01 9.888085e-01 7.114101e-01 1.606681e-06 
           9           10           11           12 
4.096450e-01 2.590474e-02 9.908167e-04 3.572890e-01


0 commentaires

3 Réponses :


0
votes

Je vois ce que vous essayez de faire, mais les résultats sont assez hilarants. Ceci si vous souhaitez soustraire 1 de tous les éléments du prix à chaque fois:

x <- 1
while (TRUE) {
  print("----------------------------------------")
  print(x)
  test$price <- test$price - 1
  pred <- predict(model, test, type = "response")
  print(pred)
  x <- x + 1
  if (sum(pred > 0.05) == length(pred)) { 
    print(test)
    break 
  }
}
# ... loops 247 times
# [1] "----------------------------------------"
# [1] 248
# 1          2          3          4          5          6          7          8          9         10         11         12 
# 0.99992994 0.99996240 0.93751936 0.99998243 0.99997993 0.99999966 0.99998781 0.05074762 0.99995669 0.99887117 0.97058913 0.99994594 
# cost price
# 1    13  -216
# 2     5  -237
# 3    32   -38
# 4    22  -242
# 5    14  -245
# 6   145  -241
# 7    54  -226
# 8   134   175
# 9    11  -229
# 10   14  -149
# 11   33   -56
# 12   21  -216


2 commentaires

Haha Ouais Eh bien, je ne veux pas soustraire 1 des rangées où la prédiction est déjà égale ou supérieure à celle-ci. Serait-il logique d'ajouter la colonne de prédemblance au test DF puis utilisez sous-ensemble? test $ prix [PRY <0,05] - 1


voir l'autre réponse :)



1
votes

Si vous souhaitez soustraire 1 pour chaque ligne (ou "client") individuellement, plutôt que 1 à travers la carte:

test$pred_prob <- NA
for (n in 1:nrow(test)) {
  print("-----------------------------")
  print(n)
  while (TRUE) {
    pred <- predict(model, test[n,], type = "response")
    print(pred)
    test$pred_prob[n] <- pred
    if (sum(pred > 0.05) == length(pred)) { 
      print(test$price[n])
      break 
    }
    test$price[n] <- test$price[n] - 1
  }
print(test)
}

# cost price  pred_prob
# 1    13    32 0.30018209
# 2     5    11 0.44423163
# 3    32    96 0.05128337
# 4    22     6 0.63109001
# 5    14     3 0.59954586
# 6   145     7 0.98880854
# 7    54    22 0.71141007
# 8   134   175 0.05074762
# 9    11    19 0.40964501
# 10   14    82 0.05149897
# 11   33    97 0.05081947
# 12   21    32 0.35728897


11 commentaires

Oh, j'ai remarqué que la colonne de prix n'a pas changé, je voudrais les nouvelles valeurs par ligne afin que je puisse voir quel devrait être le prix résultant qui pousse la probabilité sur 0,05. Je suis curieux Pourquoi inclure l'impression ("-------------------------------") et des lignes d'impression (n)?


Juste une habitude pour les boucles afin que je puisse suivre ce que je fais, voyez combien de temps il faudra pour courir, des problèmes de débogage, etc. Il est plus utile de fonctionner de manière plus longue ou lente. N'hésitez pas à les supprimer.


Oh gotcha ok j'ai trouvé aussi une question rapide, pourquoi ajoutez-vous 1 au début? Test $ prix <- test $ prix + 1


Ne tenez également pas compte du début du premier commentaire que je lisais la mauvaise ligne. Je vais éditer quand cela me permet de


haha parce que j'ai corrigé le code de manière paresseuse. Parce que j'ai soustraite avant les tests> 0.05, j'aurais accidentellement soustrait 1 de celles qui n'en ont pas besoin. Ici, je vais le réparer.


@Aidengawronski J'ai oublié que j'ai besoin de test pour être une matrice et non un fichier de données. Je reçois une erreur que l'argument est de longueur 0 et je suppose que c'est la question. Tout conseil serait génial. Merci!


Test <- AS.Matrix (test)


Hey @AidengAwronski Merci pour la réponse, la prédiction que je suis en cours d'exécution est avec un modèle XGboost, donc j'ai besoin de la boucle pour travailler avec une matrice plutôt que d'un Dataframe. Si la boucle fonctionne pour une matrice comme pour un fichier de données? Peut-être qu'il y a un autre problème avec l'erreur "argument est la longueur de 0" que je reçois. Je vérifie et la fonction de prédiction travaillait si je le faisais juste une fois en dehors de la boucle.


Je viens d'essayer d'exécuter l'exemple après avoir changé de test sur une matrice et il est indiqué "Erreur dans 1: NROW (TEST): argument de la longueur 0"


Les données de données et matrices se comportent différemment afin que vous ne vous attendiez pas à ce que le code fonctionne sans ajustement. Il n'y a pas assez d'informations ici pour vous aider. Je vous recommanderais d'ouvrir une nouvelle question si vous avez toujours du mal après un effort de réviser.


Cela semble bien merci beaucoup pour votre aide, j'ai une formation dans des statistiques mais pas la programmation, ce qui sera donc un bon "apprentissage à pêcher".



0
votes

Si quelqu'un d'autre veut exécuter la même chose avec un modèle XGboost. XXX

Il semble prendre un certain temps pour courir sur 12 rangées. J'ai besoin de penser aux seuils d'un modèle d'arbre et de savoir comment cela apportera une gamme de changements différents dans le prix à obtenir à ou au-dessus de la probabilité (que je voulais dire dans ma première question mais j'ai écrit .05 haha) .


0 commentaires