# 2.11. 新奇和異常值檢測
校驗者:
[@RyanZhiNie](https://github.com/RyanZhiNie)
[@羊三](https://github.com/apachecn/scikit-learn-doc-zh)
翻譯者:
[@羊三](https://github.com/apachecn/scikit-learn-doc-zh)
許多應用需要能夠對新觀測進行判斷,判斷其是否與現有觀測服從同一分布(即新觀測為內圍值),相反則被認為不服從同一分布(即新觀測為異常值)。 通常,這種能力被用于清理實際的數據集。必須做出兩種重要區分:
新奇檢測:訓練數據未被異常值污染,我們對于新觀測中的異常情況有興趣檢測。異常值檢測:訓練數據包含異常值,我們需要擬合出訓練數據的中心模式,以忽略有偏差的觀測。scikit-learn項目提供了一套可用于新奇或異常值檢測的機器學習工具。 該策略是以無監督的方式學習數據中的對象來實現的:
```
estimator.fit(X_train)
```
然后可以使用 predict 方法將新觀測歸為內圍值或異常值:
```
estimator.predict(X_test)
```
內圍值被標記為1,而異常值被標記為-1。
## 2.11.1. Novelty Detection(新奇檢測)
考慮一個來自同一分布的數據集,以  個特征描述、有  個觀測。 現在考慮我們再往該數據集中添加一個觀測。 如果新觀測與原有觀測有很大差異,我們就可以懷疑它是否是內圍值嗎? (即是否來自同一分布?)或者相反,如果新觀測與原有觀測很相似,我們就無法將其與原有觀測區分開嗎? 這就是新奇檢測工具和方法所解決的問題。
一般來說,它將要學習出一個粗略且緊密的邊界,界定出初始觀測分布的輪廓,繪制在相互嵌入的  維空間中。 那么,如果后續的觀測在邊界劃分的子空間內,則它們被認為來自與初始觀測相同的總體。 否則,如果它們在邊界之外,我們可以說就我們評估中給定的置信度而言,它們是異常值。
One-Class SVM(一類支持向量機)已經由 Sch?lkopf 等人采用以實現新奇檢測,并在 [支持向量機](svm.html#svm) 模塊的 [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM") 對象中實現。 需要選擇 kernel 和 scalar 參數來定義邊界。 通常選擇 RBF kernel,即使沒有確切的公式或算法來設置其帶寬參數。 這是 scikit-learn 實現中的默認值。  參數,也稱為一類支持向量機的邊沿,對應于在邊界之外找到新的但內圍的觀測的概率。
參考文獻:
- [Estimating the support of a high-dimensional distribution](http://dl.acm.org/citation.cfm?id=1119749) Sch?lkopf, Bernhard, et al. Neural computation 13.7 (2001): 1443-1471.
例子:
- 參見 [One-class SVM with non-linear kernel (RBF)](../auto_examples/svm/plot_oneclass.html#sphx-glr-auto-examples-svm-plot-oneclass-py) ,通過 [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM") 對象學習一些數據來將邊界可視化。
[](../auto_examples/svm/plot_oneclass.html)
## 2.11.2. Outlier Detection(異常值檢測)
異常值檢測類似于新奇檢測,其目的是將內圍觀測的中心與一些被稱為 “異常值” 的污染數據進行分離。 然而,在異常值檢測的情況下,我們沒有干凈且適用于訓練任何工具的數據集來代表內圍觀測的總體。
### 2.11.2.1. Fitting an elliptic envelope(橢圓模型擬合)
實現異常值檢測的一種常見方式是假設內圍數據來自已知分布(例如,數據服從高斯分布)。 從這個假設來看,我們通常試圖定義數據的 “形狀”,并且可以將異常觀測定義為足夠遠離擬合形狀的觀測。
scikit-learn 提供了 [`covariance.EllipticEnvelope`](generated/sklearn.covariance.EllipticEnvelope.html#sklearn.covariance.EllipticEnvelope "sklearn.covariance.EllipticEnvelope") 對象,它能擬合出數據的穩健協方差估計,從而為中心數據點擬合出一個橢圓,忽略中心模式之外的點。
例如,假設內圍數據服從高斯分布,它將穩健地(即不受異常值的影響)估計內圍位置和協方差。 從該估計得到的馬氏距離用于得出異常度量。 該策略如下圖所示。
[](../auto_examples/covariance/plot_mahalanobis_distances.html)
示例:
- 參見 [Robust covariance estimation and Mahalanobis distances relevance](../auto_examples/covariance/plot_mahalanobis_distances.html#sphx-glr-auto-examples-covariance-plot-mahalanobis-distances-py) 說明對位置和協方差使用標準估計 ([`covariance.EmpiricalCovariance`](generated/sklearn.covariance.EmpiricalCovariance.html#sklearn.covariance.EmpiricalCovariance "sklearn.covariance.EmpiricalCovariance")) 或穩健估計 ([`covariance.MinCovDet`](generated/sklearn.covariance.MinCovDet.html#sklearn.covariance.MinCovDet "sklearn.covariance.MinCovDet")) 來評估觀測的異常程度的差異。
參考文獻:
- Rousseeuw, P.J., Van Driessen, K. “A fast algorithm for the minimum covariance determinant estimator” Technometrics 41(3), 212 (1999)
### 2.11.2.2. Isolation Forest(隔離森林)
在高維數據集中實現異常值檢測的一種有效方法是使用隨機森林。[`ensemble.IsolationForest`](generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest "sklearn.ensemble.IsolationForest") 通過隨機選擇特征然后隨機選擇所選特征的最大值和最小值之間的分割值來隔離觀測。由于遞歸劃分可以由樹形結構表示,因此隔離樣本所需的分割次數等同于從根節點到終止節點的路徑長度。
在這樣的隨機樹的森林中取平均的路徑長度是數據正態性和我們的決策功能的量度。
隨機劃分能為異常觀測產生明顯的較短路徑。 因此,當隨機樹的森林共同為特定樣本產生較短的路徑長度時,這些樣本就很有可能是異常觀測。
該策略如下圖所示。
[](../auto_examples/ensemble/plot_isolation_forest.html)
例子:
- 參見 [IsolationForest example](../auto_examples/ensemble/plot_isolation_forest.html#sphx-glr-auto-examples-ensemble-plot-isolation-forest-py) 說明隔離森林的用法。
- 參見 [Outlier detection with several methods.](../auto_examples/covariance/plot_outlier_detection.html#sphx-glr-auto-examples-covariance-plot-outlier-detection-py) 比較 [`ensemble.IsolationForest`](generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest "sklearn.ensemble.IsolationForest") 與 [`neighbors.LocalOutlierFactor`](generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor "sklearn.neighbors.LocalOutlierFactor"), [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM") (調整為執行類似異常值檢測的方法)和基于協方差使用 [`covariance.EllipticEnvelope`](generated/sklearn.covariance.EllipticEnvelope.html#sklearn.covariance.EllipticEnvelope "sklearn.covariance.EllipticEnvelope")進行異常值檢測。
參考文獻:
- Liu, Fei Tony, Ting, Kai Ming and Zhou, Zhi-Hua. “Isolation forest.” Data Mining, 2008. ICDM‘08. Eighth IEEE International Conference on.
### 2.11.2.3. Local Outlier Factor(局部異常系數)
對中等高維數據集實現異常值檢測的另一種有效方法是使用局部異常系數(LOF)算法。
> [`neighbors.LocalOutlierFactor`](generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor "sklearn.neighbors.LocalOutlierFactor") (LOF)算法計算出反映觀測異常程度的得分(稱為局部異常系數)。 它測量給定數據點相對于其鄰近點的局部密度偏差。 算法思想是檢測出具有比其鄰近點明顯更低密度的樣本。
實際上,局部密度從 k 個最近鄰得到。 觀測數據的 LOF 得分等于其 k 個最近鄰的平均局部密度與其本身密度的比值:正常情況預期具有與其近鄰類似的局部密度,而異常數據 則預計比局部密度要小得多。
考慮的k個近鄰數(別名參數 n\_neighbors )通常選擇 1) 大于聚類必須包含的對象最小數量,以便其它對象相對于該聚類成為局部異常值,并且 2) 小于可能成為局部異常值對象的最大數量。 在實踐中,這樣的信息通常不可用,并且使 n\_neighbors = 20 似乎通常都能很好地工作。 當異常值的比例較高時(即大于 10% 時,如下面的例子),n\_neighbors 應該較大(在下面的例子中,n\_neighbors = 35)。
LOF 算法的優點是考慮到數據集的局部和全局屬性:即使在異常樣本具有不同潛在密度的數據集中,它也能夠表現得很好。 問題不在于樣本是如何被分離的,而是樣本與周圍近鄰的分離程度有多大。
該策略如下圖所示。
[](../auto_examples/neighbors/plot_lof.html)
示例:
- 參見 [Anomaly detection with Local Outlier Factor (LOF)](../auto_examples/neighbors/plot_lof.html#sphx-glr-auto-examples-neighbors-plot-lof-py) 的 [`neighbors.LocalOutlierFactor`](generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor "sklearn.neighbors.LocalOutlierFactor") 使用說明。
- 參見 [Outlier detection with several methods.](../auto_examples/covariance/plot_outlier_detection.html#sphx-glr-auto-examples-covariance-plot-outlier-detection-py) 與其它異常檢測方法進行比較。
參考文獻:
- Breunig, Kriegel, Ng, and Sander (2000) [LOF: identifying density-based local outliers.](http://www.dbs.ifi.lmu.de/Publikationen/Papers/LOF.pdf)Proc. ACM SIGMOD
### 2.11.2.4. 一類支持向量機與橢圓模型與隔離森林與局部異常系數
嚴格來說, One-class SVM (一類支持向量機)不是異常值檢測方法,而是一種新奇檢測方法:其訓練集不應該被異常值污染,因為算法可能將它們擬合。 也就是說,高維度的異常值檢測或對數據分布不做任何假設是非常具有挑戰性的, 而一類支持向量機在這些情況下產生出有用的結果。
下面的例子說明了當數據越來越不單峰時, [`covariance.EllipticEnvelope`](generated/sklearn.covariance.EllipticEnvelope.html#sklearn.covariance.EllipticEnvelope "sklearn.covariance.EllipticEnvelope") 的表現越來越差。 [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM") 在具有多種模式的數據上表現得更好, [`ensemble.IsolationForest`](generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest "sklearn.ensemble.IsolationForest") 和 [`neighbors.LocalOutlierFactor`](generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor "sklearn.neighbors.LocalOutlierFactor") 在每種情況下都表現良好。
**Comparing One-class SVM, Isolation Forest, LOF, and Elliptic Envelope**對于中心化和橢圓形的內圍模式, [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM") 不適用于內圍總體的旋轉對稱性。 此外,它擬合了一小部分存在于訓練集中的異常值。 相反,基于擬合 [`covariance.EllipticEnvelope`](generated/sklearn.covariance.EllipticEnvelope.html#sklearn.covariance.EllipticEnvelope "sklearn.covariance.EllipticEnvelope") 的決策規則學習出一個橢圓,對于內圍分布擬合良好。 [`ensemble.IsolationForest`](generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest "sklearn.ensemble.IsolationForest")和 [`neighbors.LocalOutlierFactor`](generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor "sklearn.neighbors.LocalOutlierFactor") 也表現良好。[](../auto_examples/covariance/plot_outlier_detection.html)由于內圍分布變為雙峰,所以 [`covariance.EllipticEnvelope`](generated/sklearn.covariance.EllipticEnvelope.html#sklearn.covariance.EllipticEnvelope "sklearn.covariance.EllipticEnvelope") 對內圍數據擬合得不好。 但是,我們可以看到 [`ensemble.IsolationForest`](generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest "sklearn.ensemble.IsolationForest"), [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM") 和 [`neighbors.LocalOutlierFactor`](generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor "sklearn.neighbors.LocalOutlierFactor")難以檢測雙峰,而且 [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM") 往往會過擬合:因為它沒有內圍模型, 便隨機地把一些異常值當做內圍值聚類在某個區域。[](../auto_examples/covariance/plot_outlier_detection.html)如果內圍分布極度不正態,則 [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM"), [`ensemble.IsolationForest`](generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest "sklearn.ensemble.IsolationForest")和 [`neighbors.LocalOutlierFactor`](generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor "sklearn.neighbors.LocalOutlierFactor") 能構造出合理的近似結果, 而 [`covariance.EllipticEnvelope`](generated/sklearn.covariance.EllipticEnvelope.html#sklearn.covariance.EllipticEnvelope "sklearn.covariance.EllipticEnvelope") 完全失敗。[](../auto_examples/covariance/plot_outlier_detection.html)示例:
- 參見 [Outlier detection with several methods.](../auto_examples/covariance/plot_outlier_detection.html#sphx-glr-auto-examples-covariance-plot-outlier-detection-py) 比較 [`svm.OneClassSVM`](generated/sklearn.svm.OneClassSVM.html#sklearn.svm.OneClassSVM "sklearn.svm.OneClassSVM") (調整為執行類似異常值檢測的方法), [`ensemble.IsolationForest`](generated/sklearn.ensemble.IsolationForest.html#sklearn.ensemble.IsolationForest "sklearn.ensemble.IsolationForest"), [`neighbors.LocalOutlierFactor`](generated/sklearn.neighbors.LocalOutlierFactor.html#sklearn.neighbors.LocalOutlierFactor "sklearn.neighbors.LocalOutlierFactor")和基于協方差使用 [`covariance.EllipticEnvelope`](generated/sklearn.covariance.EllipticEnvelope.html#sklearn.covariance.EllipticEnvelope "sklearn.covariance.EllipticEnvelope") 進行異常值檢測。
- scikit-learn 0.19 中文文檔
- 用戶指南
- 1. 監督學習
- 1.1. 廣義線性模型
- 1.2. 線性和二次判別分析
- 1.3. 內核嶺回歸
- 1.4. 支持向量機
- 1.5. 隨機梯度下降
- 1.6. 最近鄰
- 1.7. 高斯過程
- 1.8. 交叉分解
- 1.9. 樸素貝葉斯
- 1.10. 決策樹
- 1.11. 集成方法
- 1.12. 多類和多標簽算法
- 1.13. 特征選擇
- 1.14. 半監督學習
- 1.15. 等式回歸
- 1.16. 概率校準
- 1.17. 神經網絡模型(有監督)
- 2. 無監督學習
- 2.1. 高斯混合模型
- 2.2. 流形學習
- 2.3. 聚類
- 2.4. 雙聚類
- 2.5. 分解成分中的信號(矩陣分解問題)
- 2.6. 協方差估計
- 2.7. 經驗協方差
- 2.8. 收斂協方差
- 2.9. 稀疏逆協方差
- 2.10. Robust 協方差估計
- 2.11. 新奇和異常值檢測
- 2.12. 密度估計
- 2.13. 神經網絡模型(無監督)
- 3. 模型選擇和評估
- 3.1. 交叉驗證:評估估算器的表現
- 3.2. 調整估計器的超參數
- 3.3. 模型評估: 量化預測的質量
- 3.4. 模型持久化
- 3.5. 驗證曲線: 繪制分數以評估模型
- 4. 數據集轉換
- 4.1. Pipeline(管道)和 FeatureUnion(特征聯合): 合并的評估器
- 4.2. 特征提取
- 4.3. 預處理數據
- 4.4. 無監督降維
- 4.5. 隨機投影
- 4.6. 內核近似
- 4.7. 成對的矩陣, 類別和核函數
- 4.8. 預測目標 (y) 的轉換
- 5. 數據集加載工具
- 6. 大規模計算的策略: 更大量的數據
- 7. 計算性能
- 教程
- 使用 scikit-learn 介紹機器學習
- 關于科學數據處理的統計學習教程
- 機器學習: scikit-learn 中的設置以及預估對象
- 監督學習:從高維觀察預測輸出變量
- 模型選擇:選擇估計量及其參數
- 無監督學習: 尋求數據表示
- 把它們放在一起
- 尋求幫助
- 處理文本數據
- 選擇正確的評估器(estimator)
- 外部資源,視頻和談話