在資料科學領域,異常檢測是識別資料中異常模式的關鍵技術。準確度並非最佳評估指標,尤其在異常樣本稀少的情況下。精確度和召回率能更有效地評估異常檢測模型,尤其針對不平衡資料集。F1分數作為兩者的調和平均值,提供更全面的效能指標。此外,Fβ分數能根據需求調整精確度和召回率的權重。選擇合適的閾值也至關重要,它直接影響模型的精確度和召回率,進而影響F1分數。實務中,需根據業務需求和資料特性調整閾值,以達到最佳的模型效能。
使用Python和機器學習擴充套件異常檢測
在現代資料驅動的應用程式中,異常檢測是確保資料品質和系統可靠性的關鍵組成部分。異常檢測涉及識別資料中的異常模式或異常值,這些模式或值可能表明存在問題,例如資料損壞、系統故障或安全漏洞。
準確度指標的侷限性
在討論異常檢測時,人們經常會談到準確度(Accuracy)指標。然而,準確度並不總是評估異常檢測模型效能的最佳指標。為了說明這一點,讓我們考慮一個例子:
假設我們要檢測美國人口中患有愛滋病的人數。假設愛滋病影響了美國大約120萬人,而美國人口約為3.3億人。那麼,我們的「準確度」可以計算為1 - (愛滋病患者人數 / 總人口) = 1 - (120萬 / 3.3億) = 99.6%。這個數字看起來非常高,似乎表明我們的檢測方法非常準確。
然而,這個例子說明瞭為什麼僅僅依靠準確度指標是不夠的。在這個例子中,即使我們的模型完全沒有檢測到任何愛滋病患者(即所有人都被預測為非愛滋病患者),我們的準確度仍然高達99.6%。這是因為愛滋病患者在總人口中的比例非常小。因此,準確度指標在這種情況下並不能真實地反映模型的效能。
內容解密:
在這個例子中,我們看到了準確度指標的侷限性。準確度指標在處理不平衡資料集時可能會產生誤導。在異常檢測中,我們通常面對的是不平衡資料集,即異常樣本遠少於正常樣本。因此,我們需要使用更合適的指標來評估模型的效能。
精確度和召回率
在異常檢測中,精確度(Precision)和召回率(Recall)是兩個更為重要的指標。精確度衡量的是當模型發出警示時,警示的準確性。召回率則衡量的是模型能夠檢測到的異常樣本的比例。
# 定義計算精確度和召回率的函式
def calculate_precision_recall(true_positives, false_positives, false_negatives):
precision = true_positives / (true_positives + false_positives)
recall = true_positives / (true_positives + false_negatives)
return precision, recall
# 示例資料
true_positives = 3
false_positives = 1
false_negatives = 1
precision, recall = calculate_precision_recall(true_positives, false_positives, false_negatives)
print(f"精確度:{precision:.2f}, 召回率:{recall:.2f}")
內容解密:
在上述程式碼中,我們定義了一個函式calculate_precision_recall
來計算精確度和召回率。精確度是真陽性樣本數除以真陽性樣本數與假陽性樣本數之和。召回率是真陽性樣本數除以真陽性樣本數與假陰性樣本數之和。
F1分數
F1分數是精確度和召回率的調和平均值,它提供了一個綜合評估模型效能的指標。F1分數的計算公式如下:
F1 = 2 * (精確度 * 召回率) / (精確度 + 召回率)
# 定義計算F1分數的函式
def calculate_f1_score(precision, recall):
f1_score = 2 * (precision * recall) / (precision + recall)
return f1_score
# 使用之前的精確度和召回率計算F1分數
f1_score = calculate_f1_score(precision, recall)
print(f"F1分數:{f1_score:.2f}")
內容解密:
在上述程式碼中,我們定義了一個函式calculate_f1_score
來計算F1分數。F1分數是精確度和召回率的調和平均值,它能夠綜合評估模型的效能。
調整閾值以最佳化模型效能
在異常檢測中,閾值的選擇對模型的效能有著重要的影響。透過調整閾值,我們可以控制模型的精確度和召回率。
graph LR A[閾值] -->|影響|> B[精確度] A -->|影響|> C[召回率] B -->|調和平均|> D[F1分數] C -->|調和平均|> D
圖表翻譯: 此圖示展示了閾值對精確度和召回率的影響,以及如何透過F1分數綜合評估模型的效能。
內容解密:
在上述Mermaid圖表中,我們展示了閾值與精確度、召回率之間的關係。透過調整閾值,我們可以影響模型的精確度和召回率,從而最佳化F1分數。
不同β值的Fβ分數
在某些情況下,我們可能希望對精確度和召回率賦予不同的權重。這時,我們可以使用Fβ分數,它是F1分數的一般化形式。Fβ分數的計算公式如下:
Fβ = (1 + β^2) * (精確度 * 召回率) / (β^2 * 精確度 + 召回率)
# 定義計算Fβ分數的函式
def calculate_fbeta_score(precision, recall, beta):
fbeta_score = (1 + beta**2) * (precision * recall) / (beta**2 * precision + recall)
return fbeta_score
# 示例資料
beta = 2
fbeta_score = calculate_fbeta_score(precision, recall, beta)
print(f"F{beta}分數:{fbeta_score:.2f}")
內容解密:
在上述程式碼中,我們定義了一個函式calculate_fbeta_score
來計算Fβ分數。Fβ分數允許我們根據具體需求對精確度和召回率賦予不同的權重。
未來,我們可以進一步研究如何將異常檢測技術應用於更廣泛的領域,例如金融風控、網路安全等。同時,我們也可以探索如何結合其他機器學習技術,例如深度學習,來提高異常檢測的準確性和效率。
參考資料
- [異常檢測相關文獻]
- [機器學習相關文獻]
透過本文的介紹,希望讀者能夠對異常檢測中的評估指標和最佳化方法有更深入的瞭解,並能夠在實際應用中靈活運用這些技術。
超越表面:其他實用的異常檢測方法
最佳的異常檢測演算法具備三個關鍵能力:近乎實時地檢測問題、向需要的人發出警示,以及提供資訊以幫助預防未來停機的發生。在本章中,我們探討了常見的方法和基本異常檢測演算法的關鍵要素,但我們的例子僅觸及了表面。根據所使用的工具,還有其他最佳實踐、演算法元件和方法論可以提供相似或更準確的結果。
規則定義或硬門檻法
規則定義為某些指標值設定了明確的截止值,並根據門檻值來確定異常。當大多數資料點位於門檻值內時,這種方法才可被稱為異常檢測。規則定義具有極高的可擴充套件性,可能適用於定義明確的服務水平協定(SLA)、資料正常執行時間保證等場景。
自迴歸模型
自迴歸模型適用於時間序列異常檢測,其中資料點按照時間戳物件排序。自迴歸模型將前幾個時間步的資料輸入迴歸(線性)模型,並利用輸出結果預測下一個時間戳的資料位置。與預測值偏差過大的資料點被標記為異常。結合簡單移動平均演算法,自迴歸模型衍生出自迴歸移動平均(ARIMA)檢測演算法。如果我們進一步將自迴歸模型應用於系外行星的例子,這個資料集將會表現得相當出色。
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
# 假設 'data' 是我們的時間序列資料
data = pd.read_csv('data.csv', index_col='timestamp', parse_dates=['timestamp'])
# 建立 ARIMA 模型
model = ARIMA(data, order=(1,1,1))
model_fit = model.fit()
# 進行預測
predictions = model_fit.predict(start=len(data), end=len(data)+10)
#### 內容解密:
此程式碼範例展示瞭如何使用 Python 的 statsmodels 函式庫建立 ARIMA 模型。首先,我們讀取時間序列資料並將其索引設定為時間戳。接著,我們建立了一個 ARIMA 模型並對其進行擬合。最後,我們使用該模型進行未來資料的預測。自迴歸模型的階數(order)引數設定為 (1,1,1),這表示使用一階差分使序列平穩,並考慮一階自迴歸和一階移動平均。
指數平滑法
指數平滑法旨在消除時間序列中的趨勢和季節性成分,以便更簡單的方法(如 ARIMA)接手處理。Holt-Winters 是一種著名的季節性時間序列預測模型,並且存在豐富的變體(加法、乘法、阻尼、非阻尼等)。
聚類別分析
聚類別技術,如 k-近鄰演算法或孤立森林演算法,透過將相似的資料點分組到桶中來檢測異常,並提醒你注意那些「格格不入」的資料點,例如落在小桶或單獨桶中的資料。
from sklearn.cluster import KMeans
import numpy as np
# 假設 'X' 是我們的資料集
X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])
# 建立 KMeans 模型
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)
# 預測資料點的簇標籤
labels = kmeans.labels_
#### 內容解密:
此範例展示瞭如何使用 scikit-learn 的 KMeans 類別進行聚類別分析。首先,我們準備了一個簡單的資料集 'X'。接著,我們建立了一個具有 2 個簇的 KMeans 模型並對資料進行擬合。最後,我們獲得了每個資料點所屬的簇標籤。聚類別分析可以幫助我們找出異常資料點,即那些不屬於任何主要簇的點。
超引數調優
機器學習模型具有許多引數,這些引數是預測演算法使用的資料的數值表示。部分引數透過資料和訓練過程自動設定,例如 z-scoring 模型中的 μ 和 σ。其他引數稱為超引數,它們不由學習過程設定,而是以某種方式影響學習和推斷過程。某些超引數影響模型架構,例如神經網路的大小、嵌入矩陣和隱藏狀態矩陣的大小等。這些被稱為模型超引數。另一類別是演算法超引數,它們影響訓練過程,例如學習率、訓練輪數或每個訓練批次的資料點數量。
組合模型框架
組合模型框架結合了各種方法的優點——將聚類別、指數平滑和自迴歸節點結合到神經前饋網路中——並使用多數投票組合演算法結合它們的預測結果。
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
# 假設 'X' 是我們的特徵資料,'y' 是目標變數
X = np.array([[1, 2], [2, 3], [3, 4]])
y = np.array([0, 1, 1])
# 建立多個基礎模型
model1 = LogisticRegression()
model2 = SVC(probability=True)
# 建立 VotingClassifier
ensemble = VotingClassifier(estimators=[('lr', model1), ('svm', model2)])
# 對組合模型進行訓練
ensemble.fit(X, y)
#### 內容解密:
此範例展示瞭如何使用 scikit-learn 的 VotingClassifier 建立組合模型。首先,我們準備了特徵資料 'X' 和目標變數 'y'。接著,我們建立了兩個基礎模型:LogisticRegression 和 SVC。然後,我們使用這些基礎模型建立了一個 VotingClassifier。最後,我們對組合模型進行了訓練。組合模型可以透過結合多個模型的預測結果來提高整體效能。
為資料倉儲和資料湖設計資料品質監控器
在為資料系統建立資料品質監控器時,區分是在處理來自倉函式庫的結構化、單一資料還是進入現代資料湖生態系統的資料至關重要。為倉函式庫和湖泊設計異常檢測演算法的主要差異在於:
- 需要考慮的入口數量
- 後設資料的收集和儲存方式
- 如何存取這些後設資料
首先,資料湖系統往往具有大量的入口,因此應該假設從不同來源進入的資料具有高度的異質性。在監控來自 Postgres、應用日誌和 Web API 的表格資料中的空值率時,資料科學家可能會注意到對應於不同端點的表格行為叢集。在這些情況下,應謹慎對待「一刀切」的建模方法。更可能的是,不同的模型架構(例如,不同的超引數)可能更適合於預測每個不同格式中的異常。
其次,直接收集到資料湖中的後設資料可能需要在異常檢測演算法能夠從中取得價值之前進行不同程度的預處理。可能需要強制轉換型別、對齊模式,甚至在執行檢測器的訓練任務之前在資料中衍生出全新的增強特徵。
import pandas as pd
# 假設 'data' 是我們的原始資料
data = pd.read_csv('data.csv')
# 進行資料預處理,例如處理缺失值
data.fillna(data.mean(), inplace=True)
# 對資料進行特徵工程,例如建立新的特徵
data['new_feature'] = data['feature1'] / data['feature2']
#### 內容解密:
此範例展示了資料預處理和特徵工程的過程。首先,我們讀取原始資料並處理其中的缺失值。接著,我們建立了一個新的特徵 'new_feature',透過將 'feature1' 除以 'feature2' 得到。這些步驟對於準備資料以供後續的異常檢測演算法使用至關重要。
圖表翻譯:
此圖表展示了異常檢測的流程。首先,從資料收集開始,接著進行資料預處理,然後是特徵工程。之後,利用處理好的資料進行模型訓練。訓練好的模型用於進行異常檢測。最後,對檢測結果進行評估,以判斷模型的效能和準確性。
## 為資料可靠性架構
知名線上住宿市場Airbnb在2020年的工程部落格中提到,「長官層對資料的及時性和品質有很高的期望」,因此需要對資料品質和治理工作進行大量投資。同時,Uber的前工程師Krishna Puttaswamy和Suresh Srinivas在2021年的Uber工程部落格文章中寫道,高品質的大資料是「這個龐大轉型平台的核心」。
這並非秘密:對於一些最好的資料團隊來說,資料品質是首要考慮的問題。然而,實際上要實作這一點卻是另一回事。
資料可靠性——組織在整個資料生命週期中提供高資料可用性和健康度的能力——是高資料品質的結果。隨著公司攝入越來越多的營運和第三方資料,組織各個部門的員工都在資料生命週期的各個階段與資料互動,因此資料的可靠性變得越來越重要。
資料可靠性必須被有意地構建到組織的每個層面,從用於構建和管理資料堆積疊的流程和技術,到下游的資料問題的溝通和處理方式。在本章中,我們將探討如何在Pipeline的每個階段以及資料工程體驗中為資料可靠性進行架構。
### 在攝入階段衡量和維護高資料可靠性
現在我們對資料品質的現狀有了更好的理解,讓我們從攝入階段開始,看看這一切在實踐中意味著什麼。然而,我們不應該忽視在資料倉儲或資料湖攝入之前,確保高資料品質的一些基本最佳實踐。
組織通常會根據業務需求,從內部和外部的第三方來源攝入資料。您的決策只與用於洞察和分析的資料一樣好:垃圾進,垃圾出。確保組織有合適的實踐來保證資料品質是非常重要的。
為了實作這一點,組織已經開始為所有進入其資料生態系統的資料建立嚴格的資料品質控制標準。雖然資料品質問題可能在資料Pipeline的任何環節出現,但大多陣列織都同意,在攝入階段發現和修復資料品質問題將有助於最小化低品質資料進入下游的機會。
資料清理、資料整理(將資料結構化和豐富到所需的格式的過程)和資料測試是組織確保資料品質符合其需求的方法。隨著資料行業技術的進步,已經出現了大量的工具來為公司自動化這一過程。
這些工具允許組織自動檢查資料的諸如格式、一致性、完整性、新鮮度和唯一性等方面。透過自動化這一過程,組織不僅在資料清理方面節省了時間和資源,而且確保了進入其生態系統的資料的品質始終得到控制和管理。
資料清理(也常被稱為清洗)涉及準備和修改資料以供未來的分析,透過從資料集中刪除不完整、不相關、不正確、格式不正確或重複的資料。雖然資料清理過程可能很繁瑣,但通常由資料工程團隊負責,不過隨著自助服務工具和更分散的資料管理方法的興起,乾淨資料的責任越來越多地落到了資料生產者身上。不管誰「擁有」資料清理,教育組織的其他成員瞭解其重要性是非常重要的,因為公司中的每個人都在確保資料完整性方面發揮著關鍵作用。
在處理缺失或不準確的資料時,許多公司會轉向資料豐富,這是一個將第一方或第三方資料與現有資料集合並和新增的過程。透過豐富資料,組織能夠為其資料集增加更多價值,最終使資料更加有用和可靠。
在資料攝入之前,資料測試是抵禦資料品質的最佳防線。資料測試是驗證組織對資料的假設的過程,無論是在生產之前還是生產過程中。編寫基本的測試來檢查諸如唯一性和非空值等是組織可以測試其對源資料的基本假設的方法。組織還通常會確保資料的格式正確,以便其團隊使用,並且資料滿足其業務需求。
### 基本資料品質測試
有一些基本的資料品質測試型別,我們在第3章中首次提到了:
#### 單元測試
單元測試檢查一行程式碼(SQL)是否做了它應該做的事情;它們可以用非常小的資料片段來使用。在對資料進行單元測試時,必須將業務邏輯與「膠水程式碼」分開。
#### 功能測試
功能測試用於大型資料集,並且通常在資料驗證、完整性、攝入、處理、儲存和ETL等方面進行區分。這種測試通常發生在Pipeline中(分析層之前)。
#### 整合測試
整合測試用於確保資料Pipeline滿足有效性標準(即在預期範圍內);通常,團隊會在利用生產資料之前,使用這些測試透過Pipeline執行假資料。
正如第3章中提到的,一些常見的資料品品檢查包括:
* 空值:是否有任何值未知(NULL)?
* 新鮮度:我的資料有多新?是一小時前還是兩個月前更新的?
* 量:這個資料集代表了多少資料?兩百行變成了兩千行嗎?
* 分佈:我的資料是否在可接受的範圍內?給定列中的單位是否相同?
* 缺失值:我的資料集中是否有任何值缺失?
#### 如何編寫這些測試?
在後面的章節中,我們將介紹一些常見的SQL資料測試,它們可以應用於許多開源語言(當然,語法和膠水程式碼會有所不同)。但為了便於說明,讓我們來看看一個示例資料集。
假設您是一家媒體發行商,正在處理一個跟蹤您的全球客戶群的資料集,包括位置(城市)和他們為某項服務支付的金額。
```sql
SELECT
city,
COUNT(*) as customer_count,
SUM(payment_amount) as total_payment
FROM
customer_data
GROUP BY
city
ORDER BY
total_payment DESC;
內容解密:
上述SQL查詢用於從客戶資料表中檢索每個城市的客戶數量以及總付款金額。查詢首先根據城市對資料進行分組,然後計算每個城市的客戶數量和總付款金額,最後按照總付款金額降序排列結果。這種查詢通常用於分析不同城市的客戶分佈和消費情況。
SELECT
payment_amount,
COUNT(*) as payment_count
FROM
customer_data
GROUP BY
payment_amount
ORDER BY
payment_count DESC;
內容解密:
這個查詢用於統計不同付款金額的出現次數。它按照付款金額分組資料,並計算每個付款金額的出現次數,然後按照出現次數降序排列結果。這種查詢可以幫助識別最常見的付款金額,從而瞭解客戶的消費習慣。
graph LR A[資料來源] --> B[資料清理] B --> C[資料轉換] C --> D[資料載入] D --> E[資料分析]
圖表翻譯: 此圖示展示了一個典型的資料處理流程。首先,資料從各種資料來源收集。然後,資料經過清理以去除錯誤或不一致的資料。接下來,資料被轉換成適合分析的格式。最後,經過轉換的資料被載入到資料倉儲或資料函式庫中,以供後續的資料分析和挖掘使用。
資料品質控制的最佳實踐
- 實施自動化資料品品檢查:利用工具自動檢查資料的品質,減少人為錯誤。
- 建立資料治理框架:明確資料管理的責任和流程,確保資料品質。
- 進行定期的資料審核:定期檢查資料品質,發現問題及時修正。
- 培訓員薪水料品質意識:提高員工對資料品質的認識,確保資料準確性和一致性。
- 使用資料品質工具:利用專業的資料品質工具來監控和改進資料品質。
透過實施這些最佳實踐,組織可以顯著提高資料品質,從而更好地支援業務決策和營運。