Как я могу включить предыдущий вес в мою функцию GLM? - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь включить предыдущие настройки моей зависимой переменной в мою в с использованием функции . Набор данных, который я использую, создан для прогнозирования оттока.

До сих пор я использую следующую функцию:

V1_log <- glm(CH1 ~ RET + ORD + LVB + REV3, data = trainingset, family = 
              binomial(link='logit'))

То, что я ищу, это как функция весов работает и как включить его в функцию или, если есть другой способ включить это. Зависимая переменная является номинальной переменной с параметрами 0 или 1. Набор данных разбалансирован таким образом, что только 10% имеет значение 1 для зависимой переменной CH1, а остальные 90% имеют значение 0. Следовательно, весовые коэффициенты являются (0,1, 0,9)

Мой набор данных создается следующим образом:

Dataset preview

Где независимый переменные различаются по типу данных между продолжениями и переменными класса и

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Хотя отношение 0 к 1 с составляет 1: 9, это не означает, что веса равны 0,1 и 0,9. Вес решает, сколько внимания вы хотите уделить наблюдению по сравнению с другими.

И в вашем случае, если вы хотите что-то предсказать, важно разделить ваши данные на тренировку и тестирование и посмотреть, какое влияние оказывают веса на прогноз.

Ниже приведено использование Пример индийского диабета pima, я выбираю тип Yes так, чтобы тренировочный набор имел соотношение 1: 9.

set.seed(111)
library(MASS)
# we sample 10 from Yes and 90 from No
idx = unlist(mapply(sample,split(1:nrow(Pima.tr),Pima.tr$type),c(90,10)))
Data = Pima.tr
trn = Data[idx,]
test = Data[-idx,]

 table(trn$type)

 No Yes 
 90  10 

Давайте попробуем регрессировать его с весом 9, если положительный, 1, если отрицательный:

library(caret)
W = 9
lvl = levels(trn$type)
#if positive we give it the defined weight, otherwise set it to 1
fit_wts = ifelse(trn$type==lvl[2],W,1)
fit = glm(type ~ .,data=trn,weight=fit_wts,family=binomial)
# we test it on the test set
pred = ifelse(predict(fit,test,type="response")>0.5,lvl[2],lvl[1])
pred = factor(pred,levels=lvl)
confusionMatrix(pred,test$type,positive=lvl[2])

Confusion Matrix and Statistics

          Reference
Prediction No Yes
       No  34  26
       Yes  8  32

Вы можете видеть сверху, вы можете видеть, что все в порядке, но вы пропускаете 8 положительных результатов, а также ошибочно маркируете 26 ложных положительных результатов. Допустим, мы пытаемся W = 3

W = 3
lvl = levels(trn$type)
fit_wts = ifelse(trn$type==lvl[2],W,1)
fit = glm(type ~ .,data=trn,weight=fit_wts,family=binomial)
pred = ifelse(predict(fit,test,type="response")>0.5,lvl[2],lvl[1])
pred = factor(pred,levels=lvl)
confusionMatrix(pred,test$type,positive=lvl[2])

Матрица и статистика путаницы

          Reference
Prediction No Yes
       No  39  30
       Yes  3  28

Теперь нам удается получить почти все правильные вызовы правильно. Но все же упускаем много потенциальное «да». Суть в том, что приведенный выше код может сработать, но вам нужно сделать несколько проверок, чтобы выяснить, каков вес ваших данных.

Вы также можете просмотреть другие статистические данные, предоставленные confusionMatrix, чтобы помочь вам в выборе. .

0 голосов
/ 25 февраля 2020

В вашем наборе данных trainingset создайте столбец с именем weights_col, содержащий ваши веса (.1, .9), а затем выполните

V1_log <- glm(CH1 ~ RET + ORD + LVB + REV3, data = trainingset, family = binomial(link='logit'), weights = weights_col)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...