在執行異常偵測(abnormal detection)時,通常我們擁有大量的正常交易資料,但可能沒有足夠的不正常交易來讓機器學習,這個時候可以考慮單類別的SVM演算法(one Class-SVM)。很理想的,one Class-SVM隨著MicrosoftML套件也正式在R Server 9.0後可以在地面環境使用了(SQL Server 2017 CTP2),我們來試試。
One Class SVM
也因為沒有完整的正確答案,訓練時的資料也只會包含正常的資料(One Class),One Class-SVM被歸類在非監督式學習(unsupervised learning),One Class-SVM經常被使用的情境是偽冒交易偵測(fraudulent transactions)。
在許多傳統的分類演算法裡,因為壞交易太少(<0.001%),如果不先考慮在抽樣方法動手腳(Ex: oversampling),很容易訓練出固定都猜交易是好交易的模型(因為正確率高達99.999%),但壞人也是會舉一反三與時俱進的,做案方法日新月異,傳統分類演算法對於異常交易的偵測還是有些不足,但One-Class SVM可以幫助我們順利找出這些異常值(outlier)。
MicrosoftML新的演算法:
很像scikit-learn的分類圖,MicrosoftML的演算法選擇路徑圖,很清楚!
scikit-learn的演算法選擇路徑圖
測試步驟
1.首先我們會先載入2個library,MicrosoftML及ggplot2
2.訓練資料:亂數隨機取出500個值,同時使用"歸一化"方法將資料分佈在0-1之間後乘100,讓資料呈現統計的概率分佈。
3.測試資料:亂數隨機取出10個值,使用"歸一化"方法將資料分佈在0-1之間後乘100,但故意修改第1筆和第10筆資料,讓他們離群索居。
4.以正常資料訓練並以測試資料預測
5.找出異常值outlier。
這邊我們先用R Studio測試
###########################
#library
###########################
library(ggplot2)
library(MicrosoftML)
###########################
# train data with normal data
###########################
train_count <- 500
ndivall <- rnorm(train_count)
ndivnorm <- (ndivall - min(ndivall))/(max(ndivall) - min(ndivall))
traindata <- data.frame(CardHolderFeatures = round(100 * ndivnorm, digits = 2))
ndivall <- rnorm(train_count)
ndivnorm <- (ndivall - min(ndivall))/(max(ndivall) - min(ndivall))
traindata$TransactionFeatures <- round(100 * ndivnorm, digits = 2)
###########################
#test data with some anomaly data
###########################
test_count <- 10
ndivall <- rnorm(test_count)
ndivnorm <-
(ndivall - min(ndivall))/(max(ndivall) - min(ndivall))
testdata <-
data.frame(CardHolderFeatures = round(100 * ndivnorm, digits = 2))
ndivall <- rnorm(test_count)
ndivnorm <- (ndivall - min(ndivall))/(max(ndivall) - min(ndivall))
testdata$TransactionFeatures <- round(100 * ndivnorm, digits = 2)
testdata$CardHolderFeatures[c(1,10)] <- c(100, 0)
testdata$TransactionFeatures[c(1,10)] <- c(0, 100)
testdata$seq = seq(1:10)
###########################
# train by ONE CLASS SVM with normal data
###########################
model <- rxOneClassSvm(
formula = ~CardHolderFeatures + TransactionFeatures,
data = traindata)
# predict
result <- rxPredict(
model,
data = testdata,
extraVarsToWrite = c("CardHolderFeatures", "TransactionFeatures","seq"))
result
###########################
# Outliner
###########################
anormal <- subset(result, Score >= 5)
anormal
ggplot(traindata, aes(x = CardHolderFeatures, y = TransactionFeatures)) +
geom_point(colour = "blue", size = 1) +
stat_density2d()+
geom_point(colour = "red", aes(x = CardHolderFeatures, y = TransactionFeatures), data = anormal, alpha = .7) +
geom_label(aes(x = CardHolderFeatures - 5, y = TransactionFeatures,label = seq),data = anormal)
離群值是1號和10號,左上角和右下角!
小結
- SQL Server 2016 SP1想要binding R Server 9.0.1一直失敗,只好安裝SQL Server 2017。
- 下次要試PCA-Based Anomaly Detection
參考
What is the MicrosoftML package?
Anomaly Detection (One Class SVM) in R with MicrosoftML
Running MicrosoftML in SQL Server 2016
Cheat Sheet: How to choose a MicrosoftML algorithm