如何将先验权重合并到我的 GLM 函数中?
How can I incorporate the prior weight in to my GLM function?
我正在尝试将因变量的先前设置合并到我的 logistic-regression in r using the glm 函数中。我使用的数据集是为了预测客户流失而创建的。
到目前为止,我正在使用以下函数:
V1_log <- glm(CH1 ~ RET + ORD + LVB + REV3, data = trainingset, family =
binomial(link='logit'))
我正在寻找的是权重函数的工作原理以及如何将其包含在函数中,或者是否有其他方法可以合并它。因变量是选项为 0 或 1 的名义变量。数据集是不平衡的,只有 10% 的因变量 CH1 的值为 1,而其他 90% 的值为 0。因此权重是 (0.1, 0.9)
我的数据集是按以下方式构建的:
自变量在连续和 class 变量和
之间的数据类型不同
在您的数据集中 trainingset
创建一个名为 weights_col
的列,其中包含您的权重 (.1, .9),然后 运行
V1_log <- glm(CH1 ~ RET + ORD + LVB + REV3, data = trainingset, family = binomial(link='logit'), weights = weights_col)
虽然0和1的比例是1:9,但不代表权重是0.1和0.9。权重决定了与其他观察相比,您想要给予观察多少重视。
在你的情况下,如果你想预测一些东西,你必须将你的数据分成训练和测试,看看权重对预测有什么影响。
下面是使用 pima indian diabetes 示例,我对 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
现在我们设法让几乎所有积极的电话都正确。但仍然错过了很多潜在的机会 "Yes"。底线是,上面的代码可能有效,但您需要进行一些检查以确定您的数据的权重是多少。
您还可以查看插入符号中 confusionMatrix 提供的其他统计数据,以指导您的选择。
我正在尝试将因变量的先前设置合并到我的 logistic-regression in r using the glm 函数中。我使用的数据集是为了预测客户流失而创建的。
到目前为止,我正在使用以下函数:
V1_log <- glm(CH1 ~ RET + ORD + LVB + REV3, data = trainingset, family =
binomial(link='logit'))
我正在寻找的是权重函数的工作原理以及如何将其包含在函数中,或者是否有其他方法可以合并它。因变量是选项为 0 或 1 的名义变量。数据集是不平衡的,只有 10% 的因变量 CH1 的值为 1,而其他 90% 的值为 0。因此权重是 (0.1, 0.9)
我的数据集是按以下方式构建的:
自变量在连续和 class 变量和
之间的数据类型不同在您的数据集中 trainingset
创建一个名为 weights_col
的列,其中包含您的权重 (.1, .9),然后 运行
V1_log <- glm(CH1 ~ RET + ORD + LVB + REV3, data = trainingset, family = binomial(link='logit'), weights = weights_col)
虽然0和1的比例是1:9,但不代表权重是0.1和0.9。权重决定了与其他观察相比,您想要给予观察多少重视。
在你的情况下,如果你想预测一些东西,你必须将你的数据分成训练和测试,看看权重对预测有什么影响。
下面是使用 pima indian diabetes 示例,我对 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
现在我们设法让几乎所有积极的电话都正确。但仍然错过了很多潜在的机会 "Yes"。底线是,上面的代码可能有效,但您需要进行一些检查以确定您的数据的权重是多少。
您还可以查看插入符号中 confusionMatrix 提供的其他统计数据,以指导您的选择。