二十五、数据挖掘之离群点检测
生活随笔
收集整理的這篇文章主要介紹了
二十五、数据挖掘之离群点检测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據挖掘_unit25
1. 離群點的基本概念
1.1 離群點的概念
- 在樣本空間中,與其他樣本點的一般行為或特征不一致的點,我們稱為離群點。
1.2 離群點的來源
- 數據來源不同,如欺詐、入侵、不尋常的實驗結果等
- 數據變量變化引起,如顧客的新的購買模式、基因突變等
- 數據測量和收集誤差
離群點檢測的難點
- 在時間序列樣本中發現離群點一般比較困難,因為這些離群點可能會隱藏在趨勢、季節性或者其他變化中。
- 對于維度為非數值型的樣本,在檢測過程中需要多加考慮、比如對維度進行預處理等。
離群點檢測的主要應用領域
2. 常見的離群點檢測方法
2.1 基于統計的離群點檢測
離群點的概率定義:離群點是一個對象,關于數據的概率分布模型,離群點具有低概率值。
2.2 基于統計的離群點檢測的思路**
- 設定數據集的分布模型
- 假設檢驗驗證
- 發現離群點
2.3 基于統計的離群點檢測的實例
- 例如我們設兒童上學的具體年齡總統服從正態分布,所給的數據集是某地區隨機選取的開始上學的20名兒童具體的年齡特征如下:
- 年齡={6,7,6,8,9,10,8,11,7,9,12,7,11,8,13,7,8,14,9,12}
- 那么相應的統計參數是:均值=9.1;標準差=2.3
- 如果選擇數據分布的閾值為:閾值=均值±2×標準差
- 故在[4.5,13.7]區間意外的數據都是潛在的離群點。
- 將最大值取整為13。所以年齡為14的孩子可能是個例外。而且由均值可知,此地的孩子可能普遍上學較晚。
2.4 基于臨近度的檢測方法**
- 通??梢栽跀祿ο笾g定義臨近性度量,把遠離大部分點的對象視為離群點。
2.5 于密度的檢測方法**
- 從基于密度的觀點分析,離群點是在低密度區域中的對象。
2.6 基于聚類的檢測方法
- 聚類分析用于發現局部強相關的對象組,而異常檢測用來發現不與其他對象強相關的對象。因此,聚類分析非常自然的可以用于利群點檢測。
- 丟棄遠離其他簇的小簇
- 基于原型的聚類
另一種更系統的方法,首先聚類所有對象,然后評估對象屬于簇的程度(離群點得分)。在這種方法中,可以用對象到它的簇中心的距離來度量屬于簇的程度
2.7 常用離群點檢測方法的特點
- 基于統計模型的離群點檢測方法的前提是必須知道數據集服從什么分布;對于高維數據,檢驗效果可能很差;
- 基于臨近度的檢測方法簡單,二維或三維的數據可以做散點圖觀察;大數據集不適用 ;
- 給出了對象是離群點的定量度量,并且使數據具有不同的區域也能夠很好處理;
- 基于聚類技術來發現離群點可能是高度有效的。
3. 基于距離的檢測方法實現
3.1 基于聚類的離群點算法的步驟
- 1、選擇聚類算法進行聚類,找到各簇質心;
- 2、計算個對象到最近質心的距離;
- 3、計算各對象到它的最近質心的相對距離;
- 4、與給定的閾值作比較,選出離群點。
3.2 資源
資源庫
numpy scikit-learn=0.22.1 xlrd=1.2.0 numpy=1.18.0 pandas=0.24.2數據集
用戶交易行為數據
-
R(Recency)——最近一次交易時間間隔?;谧罱淮谓灰兹掌谟嬎愕牡梅?#xff0c;距離當前日期越近,得分越高。如5分制。反映客戶交易活躍度。
-
F(Frequency)——客戶在最近一段時間內交易次數?;诮灰最l率計算的得分,交易頻率越高,得分越高。如5分制。反映客戶交易活躍度。
-
M(Monetray)——客戶最近一段時間內交易金額?;诮灰捉痤~計算的得分,交易金額越高,得分越高。如5分制。反映客戶價值。
consumption_data.xls: 交易記錄數據
3.3 完整代碼
# -*- coding: utf-8 -*- # 使用K-Means算法聚類消費行為特征數據import numpy as np import pandas as pd from sklearn.cluster import KMeans import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號k = 3 # 聚類的類別 threshold = 2 # 離散點閾值 iteration = 500 # 聚類最大循環次數# 數據處理 def get_data(data):data_zs = 1.0 * (data - data.mean()) / data.std() # 數據標準化return data_zs# k-means聚類 def k_means(data_zs):model = KMeans(n_clusters=k, n_jobs=4, max_iter=iteration) # 分為k類,并發數4model.fit(data_zs) # 開始聚類return modeldef standard(data_zs, model, data):# 標準化數據及其類別r = pd.concat([data_zs, pd.Series(model.labels_, index=data.index)], axis=1) # 每個樣本對應的類別r.columns = list(data.columns) + [u'聚類類別'] # 重命名表頭norm = []for i in range(k): # 逐一處理norm_tmp = r[['R', 'F', 'M']][r[u'聚類類別'] == i] - model.cluster_centers_[i]norm_tmp = norm_tmp.apply(np.linalg.norm, axis=1) # 求出絕對距離norm.append(norm_tmp / norm_tmp.median()) # 求相對距離并添加norm = pd.concat(norm) # 合并return normdef mat_plot(norm):norm[norm <= threshold].plot(style='go') # 正常點discrete_points = norm[norm > threshold] # 離群點discrete_points.plot(style='ro')for i in range(len(discrete_points)): # 離群點做標記id = discrete_points.index[i]n = discrete_points.iloc[i]plt.annotate('(%s, %0.2f)' % (id, n), xy=(id, n), xytext=(id, n))plt.xlabel(u'編號')plt.ylabel(u'相對距離')plt.show()def main():data = pd.read_excel('consumption_data.xls', index_col='Id') # 讀取數據data_zs = get_data(data) # 標準化數據model = k_means(data_zs) # 聚類norm = standard(data_zs, model, data) # 標準化數據集類別mat_plot(norm)if __name__ == '__main__':main()model = k_means(data_zs) # 聚類norm = standard(data_zs, model, data) # 標準化數據集類別mat_plot(norm)總結
以上是生活随笔為你收集整理的二十五、数据挖掘之离群点检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二十四、数据挖掘时序模式
- 下一篇: 二十六、数据挖掘电力窃漏电用户自动识别