我正在寻找一种方法,根据某些事件为个人分配风险评分。我希望使用0到100的量表,并采用指数分配方式。例如,一天发生一次事件,评分可能上升到25,两次事件可能上升到50-60,三到四次事件一天的评分将达到100。
我尝试用Google搜索,但由于我不了解正确的术语,我总是找到一些随机的话题。:(
这种评分系统有没有数学术语?你知道的最常见的方法是什么?
P.S.: 非常欢迎专家/有经验的数据科学家的建议 😉
回答:
我会先写一些限定条件:
- 0次事件触发的评分为0。
- 非边缘事件计数观察是评分-100阈值所在的位置。
- 超过阈值后的任何评分都将为100。
如果是这样,这里有一个(非常)简化的例子:
阶段数据:
userid <- c("a1","a2","a3","a4","a11","a12","a13","a14","u2","wtf42","ub40","foo","bar","baz","blue","bop","bob","boop","beep","mee","r")events <- c(0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,2,3,6,122,13,1)df1 <- data.frame(userid,events)
可选:将事件标准化为(1,2]范围内。
这可能有助于对数性质。(否则,假设的函数为score=events^exp,如本例所示,1次事件将始终得分为1)这将允许你控制敏感性,但必须正确处理,因为我们处理的是指数和对数。我在例子中没有使用标准化:
normevents <- (events-mean(events))/((max(events)-min(events))*2)+1.5
设置最大评分的分位数阈值:
MaxScoreThreshold <- 0.25
获取事件分布的非边缘五分位数:
qts <- quantile(events[events>min(events) & events<max(events)], c(seq(from=0, to=100,by=5)/100))
使用设定的阈值找到评分为100的事件数量。
MaxScoreEvents <- quantile(qts,MaxScoreThreshold)
找到指数函数的指数
考虑到以下几点:
- 评分 = 事件 ^ 指数
- 事件是自然数 – 整数 >0:我们通过忽略边缘来处理这一点)
- 指数 > 1
指数计算:
exponent <- log(100)/log(MaxScoreEvents)
生成评分:
df1$Score <- apply(as.matrix(events^exponent),1,FUN = function(x) { if (x > 100) { result <- 100 } else if (x < 0) { result <- 0 } else { result <- x } return(ceiling(result))})df1
结果数据框:
userid events Score1 a1 0 02 a2 0 03 a3 0 04 a4 0 05 a11 0 06 a12 0 07 a13 0 08 a14 0 09 u2 0 010 wtf42 0 011 ub40 0 012 foo 0 013 bar 1 114 baz 2 10015 blue 3 10016 bop 2 10017 bob 3 10018 boop 6 10019 beep 122 10020 mee 13 10021 r 1 1
假设你的数据更大且有更多的事件类别,评分不会那么快达到100,这也是阈值的函数。
我会更多地依赖数据来定义参数,在这种情况下是阈值。
如果你有关于用户实际做了什么的前期数据,你可以进行监督学习,例如在比率超过50%的地方设置阈值。或者,如果事件到“成功”概率的图表看起来像正态分布的累积概率函数,我会在它第一次达到45度的地方设置阈值。
如果你有前期数据,你也可以使用逻辑回归,但不是使用Logit函数来处理回归的输出,而是使用该数字作为你的评分。你可以将其标准化为0到100之间。
写一个数据科学问题并不总是容易的。我对你所寻找的东西做了很多假设,希望这是大致的方向。