詳解使用Python+Pycaret進(jìn)行異常檢測(cè)
概述
1.通過探索性異常檢測(cè)分析了解異常
2.設(shè)置 PyCaret 環(huán)境并嘗試準(zhǔn)備任務(wù)的各種數(shù)據(jù)
3.比較性能并可視化不同的異常檢測(cè)算法
介紹
異常檢測(cè)提供了在數(shù)據(jù)中發(fā)現(xiàn)模式、偏差和異常的途徑,這些模式、偏差和異常不限于模型的標(biāo)準(zhǔn)行為。異常檢測(cè)旨在確定數(shù)據(jù)中的異常情況。這些異常也被稱為數(shù)據(jù)集的異常值。
隨著數(shù)據(jù)呈指數(shù)級(jí)增長(zhǎng),分析數(shù)據(jù)并得出形成重要業(yè)務(wù)決策基礎(chǔ)的見解已成為一種普遍趨勢(shì)。我們不僅需要分析數(shù)據(jù),還需要準(zhǔn)確地解釋數(shù)據(jù)。找出異常并確定異常行為可以讓我們找到最佳解決方案。
異常檢測(cè)可以應(yīng)用于各種領(lǐng)域。下面列出了其中一些。
- 網(wǎng)絡(luò)安全 —?監(jiān)控網(wǎng)絡(luò)流量并確定異常值
- 欺詐檢測(cè)——?可以識(shí)別信用卡欺詐
- IT 部門 —發(fā)現(xiàn)并應(yīng)對(duì)意外風(fēng)險(xiǎn)
- 銀行業(yè)務(wù)——?確定異常交易行為
許多機(jī)器學(xué)習(xí)算法可用于異常檢測(cè),它在檢測(cè)和分類復(fù)雜數(shù)據(jù)集中的異常值方面起著至關(guān)重要的作用。
為什么是PyCaret
PyCaret是一個(gè)開源、低代碼的 Python 機(jī)器學(xué)習(xí)庫(kù),支持多種功能,例如在幾行代碼中就可以為部署建模的數(shù)據(jù)準(zhǔn)備。
PyCaret 提供的一些的功能包括 -
- 它是一個(gè)靈活的低代碼庫(kù),可以提高生產(chǎn)力,從而節(jié)省時(shí)間和精力。
- PyCaret 是一個(gè)簡(jiǎn)單易用的機(jī)器學(xué)習(xí)庫(kù),使我們能夠在幾分鐘內(nèi)執(zhí)行 ML 任務(wù)。
- PyCaret 庫(kù)允許自動(dòng)化機(jī)器學(xué)習(xí)步驟,例如數(shù)據(jù)轉(zhuǎn)換、準(zhǔn)備、超參數(shù)調(diào)整和標(biāo)準(zhǔn)模型比較。
學(xué)習(xí)目標(biāo)
- 執(zhí)行探索性異常檢測(cè)分析
- PyCaret 環(huán)境介紹
- 創(chuàng)建和選擇最佳模型
- 比較模型中的異常
- 可視化和解釋模型
PyCaret 安裝
在你的 jupyter notebook 中安裝最新版本的 Pycaret 并開始使用!
pip3 install pycaret
數(shù)據(jù)導(dǎo)入
讓我們從 PyCaret 預(yù)先配置的數(shù)據(jù)集中導(dǎo)入一個(gè)常見的異常檢測(cè)數(shù)據(jù)集,開始我們的動(dòng)手項(xiàng)目。
導(dǎo)入必要的庫(kù)
首先,導(dǎo)入整個(gè)項(xiàng)目所需的必要庫(kù)。
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np
導(dǎo)入數(shù)據(jù)集
from pycaret.datasets import get_data all_datasets = get_data(‘index')
現(xiàn)在我們可以看到所有列出的具有默認(rèn)機(jī)器學(xué)習(xí)任務(wù)的數(shù)據(jù)集。
我們只需要訪問通過get_data()函數(shù)可以獲得的異常數(shù)據(jù)。
df = get_data(‘a(chǎn)nomaly') df.head()
探索和描述此數(shù)據(jù)集以查找缺失值并獲得統(tǒng)計(jì)分布。
df.describe() df.info()
我們可以注意到數(shù)據(jù)集沒有任何缺失值。
探索性異常檢測(cè)分析
現(xiàn)在我們可以使用各種可視化方法來解釋數(shù)據(jù)集中的異常值和異常。
我們可以從 Swarm 圖開始
Swarm 圖
使用melt()函數(shù)獲取數(shù)據(jù)集的Swarm圖。
plt.rcParams["figure.figsize"] = (10,8) sns.swarmplot(x="variable", y="value", data=pd.melt(df)) plt.show()
這是我們所有列的Swarm圖
箱形圖
通過箱形圖可視化數(shù)據(jù)集,這讓我們清楚地了解大部分?jǐn)?shù)據(jù)所在的位置。
sns.boxplot(x="variable", y="value", data=pd.melt(df)) plt.show()
這些圖將幫助我們感知我們的模型是否能夠跟蹤它們。
散點(diǎn)圖
我們可以通過散點(diǎn)圖確定兩個(gè)特征之間的線性關(guān)系。此處明確定義了Col1和Col2之間的關(guān)系。
sns.scatterplot(data=df, x="Col1", y='Col2')
我們也可以嘗試不同的特征。探索各種特征如何相互關(guān)聯(lián)。
sns.scatterplot(data=df, x="Col3", y='Col4')
這些圖表明數(shù)據(jù)之間沒有線性關(guān)系。現(xiàn)在讓我們使用 Seaborn 成對(duì)分析所有特征之間的關(guān)系。
sns.pairplot(df)
該成對(duì)圖確定了不同列之間的關(guān)系以及它們?nèi)绾闻c直方圖一起以多種方式區(qū)分值。
通過這種方式,我們可以為我們的模型解釋多個(gè)維度的邊界。
df1 = df.melt(‘Col1', var_name='cols', value_name='vals') g = sns.factorplot(x=”Col1", y=”vals”, hue='cols', data=df1)
異常檢測(cè)
為異常檢測(cè)設(shè)置 PyCaret 環(huán)境。為此,我們可以使用 Pycaret 的異常檢測(cè)模塊,這是一個(gè)無(wú)監(jiān)督的機(jī)器學(xué)習(xí)模塊,用于識(shí)別數(shù)據(jù)中可能導(dǎo)致異常情況的異常值。
from pycaret.anomaly import * setup = setup(df, session_id = 123)
指定會(huì)話 id,這會(huì)導(dǎo)致執(zhí)行后進(jìn)行處理。它會(huì)自動(dòng)解釋多種類型的變量,并允許我們通過按ENTER進(jìn)行確認(rèn)。
觀察我們的數(shù)據(jù)集由 10 個(gè)特征組成,每個(gè)特征 1000 行。我們可以執(zhí)行各種插補(bǔ)——數(shù)字和分類或歸一化數(shù)據(jù)。但是我們不需要在我們的數(shù)據(jù)集中進(jìn)行這樣的轉(zhuǎn)換,所以讓我們繼續(xù)!
用幾行代碼執(zhí)行所有這些計(jì)算顯示了PyCaret庫(kù)的美妙之處。
模型創(chuàng)建
從模型庫(kù)中選擇最佳模型并創(chuàng)建用于異常檢測(cè)的模型。我們可以使用model()函數(shù)顯示模型列表。
models()
我們可以看到列出了許多流行的算法,例如隔離森林和 k 最近鄰。
隔離森林
使用create_model()函數(shù)創(chuàng)建隔離森林模型。隔離森林算法通過隨機(jī)選擇一個(gè)特征,然后隨機(jī)選擇最大值和最小值之間的分割值來區(qū)分觀察。
iforest = create_model('iforest') print(iforest)
因此,異常分?jǐn)?shù)被確定為分離給定觀察所需的條件數(shù)量。
局部異常因子
它是一種無(wú)監(jiān)督異常檢測(cè)方法的算法,計(jì)算數(shù)據(jù)點(diǎn)相對(duì)于其鄰居的局部密度偏差。
lof = create_model('lof') print(lof)
K最近鄰
KNN 是一種非參數(shù)惰性學(xué)習(xí)算法,用于根據(jù)相似性和各種距離度量對(duì)數(shù)據(jù)進(jìn)行分類。它提供了一種簡(jiǎn)單而可靠的方法來檢測(cè)異常。
knn = create_model('knn') print(knn)neighbours
比較模型中的異常
繼續(xù)我們的任務(wù),我們現(xiàn)在可以觀察模型確定的異常情況。傳統(tǒng)上,我們必須手動(dòng)設(shè)置不同的參數(shù)。
但是通過使用 PyCaret,我們可以通過分配的模型函數(shù)來分配結(jié)果。我們將從隔離森林模型開始。
iforest_results = assign_model(iforest) iforest_results.head()
assign_model()函數(shù)返回一個(gè)檢測(cè)異常的數(shù)據(jù)幀,異常值的存在標(biāo)記為 1,非異常值標(biāo)記為 0,以及異常分?jǐn)?shù)。
同樣,我們也可以分配其他模型。所以可以進(jìn)行比較。
lof_results = assign_model(lof) lof_results.head()
比較上述模型我們可以看到,隔離森林已經(jīng)將第二行視為異常,但局部異常因子并未將其視為異常。但不同算法的異常得分不同。
對(duì)于 k 個(gè)最近鄰,預(yù)測(cè)分?jǐn)?shù)與隔離森林的預(yù)測(cè)分?jǐn)?shù)非常相似。
knn_results = assign_model(knn) knn_results.head()
按每個(gè)模型過濾異常,這表明 iforest 模型將 1000 行中的 50 行視為異常。
iforest_anomaly=iforest_results[iforest_results['Anomaly']==1] iforest_anomaly.shape
同樣,檢查L(zhǎng)OF和KNN,我們可以看到它們都考慮了50個(gè)異常。必須使用不同的計(jì)算方法來查找異常值。
lof_anomaly=lof_results[lof_results['Anomaly']==1] lof_anomaly.shape
knn_anomaly=knn_results[knn_results['Anomaly']==1] knn_anomaly.shape
根據(jù)以上結(jié)果,我們可以得出結(jié)論,1000 個(gè)異常中最有可能有 50 個(gè)。
驗(yàn)證的一種方法是分析它們中的哪一個(gè)更適合于對(duì)模型標(biāo)記為離群值的數(shù)據(jù)進(jìn)行分析,并比較它們對(duì)測(cè)試數(shù)據(jù)的影響,或者進(jìn)行分析,看看它們是否位于決策邊界內(nèi)。
解釋和可視化
可視化是以創(chuàng)造性和獨(dú)立的方式解釋手頭信息的最便捷方式。
讓我們首先從 PyCaret 庫(kù)外部創(chuàng)建視覺效果,這將突出 PyCaret 庫(kù)的好處,并使我們能夠了解plot_model函數(shù)如何更具交互性。
from yellowbrick.features import Manifold dfr = iforest_results['Anomaly'] viz = Manifold(manifold="tsne") viz.fit_transform(df, dfr) viz.show()
我們可以看到,隔離森林在多個(gè)維度上確定的大多數(shù)異常通常來自不同的集群。
現(xiàn)在在PyCaret 中為 KNN使用plot_model() 函數(shù),它將為異常值創(chuàng)建一個(gè) 3D 圖,在其中我們可以看到為什么某些特征被視為異常。
plot_model(knn)
我們可以在任何維度上移動(dòng)它以查看和指出異常。這個(gè) 3D 繪圖有助于我們更好地查看它。KNN 圖顯示大多數(shù)異常值是那些不屬于任何集群的異常值。所以這很好!
其他兩個(gè)模型也可以這樣做。
plot_model(iforest)
很明顯,數(shù)據(jù)集被分成了四個(gè)不同的集群,所以這些組之外的任何東西都肯定是異常的。
異常并不總是壞兆頭!有時(shí)它們?cè)诮忉尳Y(jié)果或數(shù)據(jù)分析方面非常有用。這些可用于解決不同的數(shù)據(jù)科學(xué)用例。
接下來是第三種模式。線性離群因子,我們可以用一個(gè)不同的圖來實(shí)驗(yàn),創(chuàng)造一個(gè)2D圖。
我們可以放大這個(gè)二維圖來查看哪些點(diǎn)被認(rèn)為是異常值。
可以再次為配對(duì)圖創(chuàng)建另一個(gè)視覺效果,現(xiàn)在使用異常來查看哪些點(diǎn)將被視為異常。
sns.pairplot(lof_results, hue = "Anomaly")
最后,我們可以保存模型。可以保存任何合適的模型。這里我們保存了 iforest 模型。
save_model(iforest,'IForest_Model')
模型與示例數(shù)據(jù)和日志一起成功保存。
尾注
這標(biāo)志著我們關(guān)于異常檢測(cè)的動(dòng)手項(xiàng)目的結(jié)束。我們已經(jīng)討論了 PyCaret 庫(kù)的用例和實(shí)現(xiàn),以及它如何用于異常檢測(cè)。PyCaret 是一個(gè)快速可靠的機(jī)器學(xué)習(xí)庫(kù),通常被數(shù)據(jù)科學(xué)家用來解決復(fù)雜的業(yè)務(wù)問題。在創(chuàng)建可部署模型的同時(shí),可以擴(kuò)展該項(xiàng)目進(jìn)行進(jìn)一步的實(shí)驗(yàn)和探索。
以上就是詳解使用Python+Pycaret進(jìn)行異常檢測(cè)的詳細(xì)內(nèi)容,更多關(guān)于Python Pycaret異常檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
對(duì)Python Class之間函數(shù)的調(diào)用關(guān)系詳解
今天小編就為大家分享一篇對(duì)Python Class之間函數(shù)的調(diào)用關(guān)系詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01Python3之簡(jiǎn)單搭建自帶服務(wù)器的實(shí)例講解
今天小編就為大家分享一篇Python3之簡(jiǎn)單搭建自帶服務(wù)器的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06python 對(duì)象真假值的實(shí)例(哪些視為False)
這篇文章主要介紹了python 對(duì)象真假值的實(shí)例(哪些視為False),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12python基于twisted框架編寫簡(jiǎn)單聊天室
這篇文章主要為大家詳細(xì)介紹了python基于twisted框架編寫簡(jiǎn)單聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01使用Python實(shí)現(xiàn)七大排序算法的代碼實(shí)例
這篇文章主要介紹了使用Python實(shí)現(xiàn)七大排序算法的代碼實(shí)例,所謂排序,就是使一串記錄,按照其中的某個(gè)或某些關(guān)鍵字的大小,遞增或遞減的排列起來的操作,需要的朋友可以參考下2023-07-07Pytorch中關(guān)于nn.Conv2d()參數(shù)的使用
這篇文章主要介紹了Pytorch中關(guān)于nn.Conv2d()參數(shù)的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06