时间特征

R 中的欺诈检测

Bart Baesens

Professor Data Science at KU Leuven

时间分析

  • 某些事件倾向在相近时间发生
  • 例:客户常在相似时刻交易
  • 目标:用有意义的特征捕捉时间信息
  • 处理时间较棘手
    • 00:00 = 24:00
    • 无自然顺序,例如 23:00 与 01:00 谁大谁小?
R 中的欺诈检测
  • 不要用算术平均计算平均时间戳!
    • 例:交易发生在 01:00、02:00、21:00、22:00
    • 算术平均为 11:30,但实际并无该时刻附近的交易!
head(timestamps)
"20:27:28" "21:08:41" "01:30:16" "00:57:04" "23:12:14" "22:54:16"
  • 将数字时间戳转换为以小时计的小数格式
library(lubridate)
ts <- as.numeric(hms(timestamps)) / 3600

head(ts)
20.4577778 21.1447222  1.5044444  0.9511111 23.2038889 22.9044444
R 中的欺诈检测

环形直方图

library(ggplot2)

clock <- ggplot(data.frame(ts), aes(x = ts)) +
    geom_histogram(breaks = seq(0, 24), colour = "blue", fill = "lightblue") +
    coord_polar()


arithmetic_mean <- mean(ts) clock + geom_vline(xintercept = arithmetic_mean, linetype = 2, color = "red", size = 2)
R 中的欺诈检测

带算术平均的环形直方图

wrong_clock

R 中的欺诈检测

冯·米塞斯概率分布

  • 将时间建模为周期变量,使用"冯·米塞斯分布"(Correa Bahnsen 等,2016)
  • 周期正态分布 = 绕圆包裹的正态分布
  • 时间戳集合 $D= $ {$t_1, t_2, \ldots, t_n$} 的冯·米塞斯分布

$$D\sim vonMises\left(\mu,\kappa\right)$$

  • $\mu$:周期均值,位置度量;分布围绕 $\mu$ 聚集
  • $1/\kappa$:周期方差;$\kappa$ 为集中度
R 中的欺诈检测

估计参数 $\mu$ 和 $\kappa$

# 将小数时间戳转换为"circular"类
library(circular)
ts <- circular(ts, units = "hours", template = "clock24")

head(ts)
Circular Data: 
[1] 20.457889 21.144607  1.504422  0.950982 23.203917  4.904397
estimates <- mle.vonmises(ts)
p_mean <- estimates$mu %% 24
concentration <- estimates$kappa
R 中的欺诈检测

带周期均值的环形直方图

correct_clock

R 中的欺诈检测

置信区间

  • 提取新特征:交易时间的置信区间
  • $S= $ {$x_i^{time}|i=1,\ldots,n$}:同一客户的交易集合

(1) 使用 mle.vonmises() 基于 $S$ 估计 $\mu(S)$ 和 $\kappa(S)$:

estimates <- mle.vonmises(ts)
p_mean <- estimates$mu %% 24
concentration <- estimates$kappa

(2) 使用 dvonmises() 计算时间戳的密度(= 似然):

densities <- dvonmises(ts, mu = p_mean, kappa = concentration)
R 中的欺诈检测

特征提取

  • 二元特征:新交易的时间戳以概率 $\alpha$(如 0.90、0.95)落在置信区间(CI)内,否则不在
  • 若时间戳在 CI 内,则二元时间特征为 TRUE,否则为 FALSE
  • 若其密度大于截断值,则时间戳位于 90% CI 内:
alpha <- 0.90
quantile <- qvonmises(p = (1 - alpha)/2, 
                        mu = p_mean,
                        kappa = concentration) %% 24
cutoff <- dvonmises(quantile,
                      mu = p_mean, kappa = concentration)

time_feature <- densities >= cutoff
R 中的欺诈检测

置信区间

confidence_clock

R 中的欺诈检测

置信区间

confidence_clock_2

R 中的欺诈检测

示例

$$ $$ time_table

R 中的欺诈检测

移动时间窗口的置信区间

## ts 包含时间戳 18.42、20.45、20.88、0.75、19.20、23.65 和 6.08

time_feature = c(NA, NA) for (i in 3:length(ts)) { ts_history <- ts[1:(i-1)] ## (1) 历史时间戳
estimates <- mle.vonmises(ts_history) ## (2) 在历史时间戳上估计 mu 和 kappa p_mean <- estimates$mu %% 24 concentration <- estimates$kappa
dens_i <- dvonmises(ts[i], mu = p_mean, kappa = concentration) ## (3) 估计当前时间戳的密度
alpha <- 0.90 ## (4) 在 90% 置信水平下,判断密度是否大于截断值 quantile <- qvonmises((1-alpha)/2, mu=p_mean, kappa=concentration) %% 24 cutoff <- dvonmises(quantile, mu = p_mean, kappa = concentration) time_feature[i] <- dens_i >= cutoff }
print(time_feature)
NA    NA  TRUE FALSE  TRUE  TRUE FALSE
R 中的欺诈检测

Passons à la pratique !

R 中的欺诈检测

Preparing Video For Download...