1. 程式人生 > >python資料分析:異常檢測分析(Anomaly detection analysis)

python資料分析:異常檢測分析(Anomaly detection analysis)

何為異常檢測

在資料探勘中,異常檢測(anomaly detection)是通過與大多數資料顯著不同而引起懷疑的稀有專案,事件或觀察的識別。通常情況下,異常專案會轉化為某種問題,例如銀行欺詐,結構缺陷,醫療問題或文字錯誤。異常也被稱為異常值,新奇,噪聲,偏差和異常。

資料異常可以轉化為各種應用領域中的重要(且常常是關鍵的)可操作資訊。 例如,計算機網路中的異常流量模式可能意味著被黑客竊取的計算機在將敏感資料傳送到未經授權的目的地;異常的MRI影象可能表明存在惡性腫瘤;信用卡交易資料的異常可能表明信用卡或身份盜用;或來自航天器感測器的異常讀數可能意味著航天器某些部件的故障。我們將先介紹異常(值)的概念。

常見的異常檢測方法:

  • 基於統計:基於泊松分佈、正態分佈找到異常分佈點
  • 基於距離:K-means
  • 基於密度:knn,LOF(local outlier factor),隔離森林
  • one-class SVM
  • 隱馬爾可夫模型(HMM)

異常值檢測常用於異常訂單識別、風險客戶預警、黃牛識別、貸款風險識別、欺詐檢測、技術入侵等針對個體的分析場景。

新奇檢測和離群檢測

異常資料根據原始資料集的不同可以分為離群點檢測和新奇檢測:

  1. 離群點檢測(Outlier Detection)
    大多數情況我們定義的異常資料都屬於離群點檢測,對這些資料訓練完之後再在新的資料集中尋找異常點
  2. 新奇檢測(Novelty Detection)
    所謂新奇檢測是識別新的或未知資料模式和規律的檢測方法,這些規律和只是在已有機器學習系統的訓練集中沒有被髮掘出來。新奇檢測的前提是已知訓練資料集是“純淨”的,未被真正的“噪音”資料或真實的“離群點”汙染,然後針對這些資料訓練完成之後再對新的資料做訓練以尋找新奇資料的模式。
    新奇檢測主要應用於新的模式、主題、趨勢的探索和識別,包括訊號處理、計算機視覺、模式識別、智慧機器人等技術方向,應用領域例如潛在疾病的探索、新物種的發現、新傳播主題的獲取等。
    新奇檢測和異常檢測有關,一開始的新奇點往往都以一種離群的方式出現在資料中,這種離群方式一般會被認為是離群點,因此二者的檢測和識別模式非常類似。但是,當經過一段時間之後,新奇資料一旦被證實為正常模式,例如將新的疾病識別為一種普通疾病,那麼新奇模式將被合併到正常模式之中,就不再屬於異常點的範疇。

處理高維資料異常檢測

  • 拓展現有的離群點檢測模式
  • 發現子空間中的離群點
  • 對高維資料進行建模

在大多數場景下通過非監督式方法實現的異常檢測的結果只是用來縮小排查範圍,為業務的執行提供更加精準和高效的執行目標而已

python實現

from sklearn.svm import OneClassSVM
import numpy as np
import plotly.offline as py
import plotly.graph_objs as go
py.init_notebook_mode(connected=True)

# 匯入資料
data = np.loadtxt('https://raw.githubusercontent.com/ffzs/dataset/master/outlier.txt', delimiter=' ')

#分配訓練集和測試集
train_set = data[:900, :]
test_set = data[-100:, :]

#### 異常檢測 ### 
# 建立異常檢測模型
one_svm = OneClassSVM(nu=0.1, kernel='rbf', random_state=2018)
# 訓練模型
one_svm.fit(train_set)
# 預測異常資料
pre_test_outliers = one_svm.predict(test_set)

### 異常結果統計###
# 合併測試檢測結果
total_test_data = np.hstack((test_set, pre_test_outliers.reshape(-1,1)))

# 獲取正常資料
normal_test_data = total_test_data[total_test_data[:, -1] == 1]
# 獲取異常資料
outlier_test_data = total_test_data[total_test_data[:, -1] == -1]

# 輸出異常資料結果
print('異常資料為:{}/{}'.format(len(outlier_test_data), len(total_test_data)))
# 異常資料為:9/100

# 視覺化結果
py.iplot([go.Scatter3d(x=total_test_data[:,0], y=total_test_data[:,1], z=total_test_data[:,2], 
                       mode='markers',marker=dict(color=total_test_data[:, -1], size=5))])

在這裡插入圖片描述

參考:
維基百科Anomaly detection
《python資料分析與資料化運營》 宋天龍