1. 程式人生 > 其它 >datawhale-異常檢測打卡之Task 3:線性模型

datawhale-異常檢測打卡之Task 3:線性模型

技術標籤:Python

真實資料集中不同維度的資料通常具有高度的相關性,這是因為不同的屬性往往是由相同的基礎過程以密切相關的方式產生的。在古典統計學中,這被稱為迴歸建模,一種引數化的相關性分析
變數的相關性分析主要分為2類,一類相關性分析試圖通過其他變數預測單獨的屬性值,另一類方法用一些潛在變數來代表整個資料。前者的典型代表是線性迴歸,後者一個典型的例子是主成分分析

本文將會用這兩種典型的線性相關分析方法進行異常檢測。

1.線性迴歸

線性迴歸是統計學中一個重要的應用,這個重要的應用往往是指通過一系列自變數去預測一個特殊因變數的值。在這種情況下,異常值是根據其他自變數對因變數的影響來定義的,而自變數之間相互關係中的異常則不那麼重要。這裡的異常點檢測主要用於資料降噪,避免異常點的出現對模型效能的影響,因而這裡關注的興趣點主要是正常值。

  • 最小二乘法
  • 梯度下降法

求解線性迴歸引數時可以應用最小二乘法,當最小二乘法無法使用時,可以通過兩種方法進行引數估計,一種先使用主成分分析等方法來預處理資料,消除不同特徵之間的相關性,然後再使用最小二乘法。第二種方法是使用梯度下降法。

2.主成分分析

最小二乘法試圖找到一個與資料具有最佳匹配(d-1)維超平面。主成分分析方法可用於解決這一問題的廣義版本。具體來說,它可以找到任意 k(k-d)維的最優表示超平面,從而使平面投影誤差最小化。

所謂主成分分析即由d個特徵組合成新的d個正交特徵,使得新的特徵之間兩兩正交。

• 如果前 k的特徵向量選定之後(根據最大的k個特徵值),由這些特徵向量定義的 k維超平面是在所有維度為 k的超平面中,所有資料點到它的均方距離儘可能小的平面。

• 如果將資料轉換為與正交特徵向量對應的軸系,則轉換後的資料沿每個特徵向量維的方差等於相應的特徵值。在這種新表示中,轉換後的資料的協方差為0。
• 由於沿特徵值小的特徵向量的轉換資料的方差很低,因此沿這些方向的變換資料與平均值的顯著偏差可能表示離群值。

3.小結

真實資料中,資料不同屬性之間往往具有顯著的相關性。在這種情況下,線性建模可以提供一種有效的工具來從底層資料中移除異常值或者進行異常檢測。對於其他基於因變量回歸的應用,線性建模是一種工具,去除異常值對於提高此類應用的效能是非常重要的。在大多數情況下,主成分分析提供了去除異常值和進行異常檢測最有效的方法,因為它對存在少數異常值的資料更有魯棒性。

4.練習

使用pyod庫生成example並使用該庫的pca模組進行檢測

1.構造資料,20個特徵

from pyod.models.pca import PCA
from pyod.utils.data import generate_data
from pyod.utils.data import evaluate_print
contamination = 0.1  # 異常值比例
n_train = 200  # 訓練集數目
n_test = 100  # 測試集樹木
X_train, y_train, X_test, y_test = \
    generate_data(n_train=n_train,
                  n_test=n_test,
                  n_features=20,
                  contamination=contamination,
                  random_state=42)

2.訓練 PCA 分類器
取正交的20維度中的前3維度


clf_name = 'PCA'
clf = PCA(n_components=3)
clf.fit(X_train)

3.應用模型

# 應用模型至訓練集
y_train_pred = clf.labels_  # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_  # raw outlier scores

# 應用模型至測試集
y_test_pred = clf.predict(X_test)  # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test)  # outlier scores

4.評估效果

# 評估訓練集和測試集上效果
print("\nOn Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)

在這裡插入圖片描述