[SQL Server][Machine Learning]One Class SVM

在執行異常偵測(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

Choosing the right estimator