日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > HTML >内容正文

HTML

在浏览器中进行深度学习:TensorFlow.js (十二)异常检测算法

發(fā)布時(shí)間:2023/12/15 HTML 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在浏览器中进行深度学习:TensorFlow.js (十二)异常检测算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

異常檢測(cè)是機(jī)器學(xué)習(xí)領(lǐng)域常見(jiàn)的應(yīng)用場(chǎng)景,例如金融領(lǐng)域里的信用卡欺詐,企業(yè)安全領(lǐng)域里的非法入侵,IT運(yùn)維里預(yù)測(cè)設(shè)備的維護(hù)時(shí)間點(diǎn)等。我們今天就來(lái)看看異常檢測(cè)的基本概念,算法,然后看看如何利用TensorflowJS來(lái)進(jìn)行異常檢測(cè)。

什么是異常點(diǎn)?

異常點(diǎn)是指數(shù)據(jù)中和其它點(diǎn)不一樣的點(diǎn),異常檢測(cè)就是要找到這些點(diǎn)。通常有以下這些不同類(lèi)型的異常:

  • 點(diǎn)異常 Point Anomalies
    單個(gè)點(diǎn)和其它數(shù)據(jù)顯著的不同
  • 上下文異常 Contextual Anomalies
    數(shù)據(jù)在所在的上下文環(huán)境中是個(gè)異常,例如下圖t1不是異常而t2是因?yàn)閠2前后的數(shù)據(jù)和t2有顯著的差異。
  • 集合異常 Collective Anomalies.
    集合異常是指一組數(shù)據(jù)點(diǎn)和其它的數(shù)據(jù)有顯著的不同,這一組數(shù)據(jù)的集合構(gòu)成異常

從數(shù)據(jù)維度的角度來(lái)看,異常也分為單變量(univariate)和多變量異常(multivariate)。

異常檢測(cè)的算法主要包括基于統(tǒng)計(jì)的算法和基于機(jī)器學(xué)習(xí)的算法。

異常檢測(cè)的統(tǒng)計(jì)學(xué)方法

利用統(tǒng)計(jì)方法來(lái)進(jìn)行異常檢測(cè)有兩種,第一種是參數(shù)化的,就是假定正常的數(shù)據(jù)是基于某種參數(shù)分布的,那么我們可以通過(guò)訓(xùn)練數(shù)據(jù)估計(jì)出數(shù)據(jù)的分布概率,那么對(duì)于每一個(gè)要分析的數(shù)據(jù)點(diǎn)都計(jì)算出該數(shù)據(jù)點(diǎn)在這個(gè)概率分布下生成的概率。這個(gè)值越高,說(shuō)明該數(shù)據(jù)是正常點(diǎn)的可能性就越大,該數(shù)值越低,就說(shuō)明這個(gè)點(diǎn)就越有可能是異常點(diǎn)。

最常見(jiàn)的方式就是ZScore,假定數(shù)據(jù)符合正態(tài)分布,ZScore計(jì)算數(shù)據(jù)點(diǎn)偏離均值多少個(gè)標(biāo)準(zhǔn)差。ZScore越大說(shuō)明數(shù)據(jù)偏離均值越遠(yuǎn),那么它是異常的概率就越高。

非參數(shù)化的方法并不假定數(shù)據(jù)的先驗(yàn)分布,數(shù)據(jù)的分布是從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)而來(lái)的。

其它還有一些統(tǒng)計(jì)方法諸如:

  • 時(shí)間序列中的移動(dòng)平均值
  • 卡曼濾波器

利用統(tǒng)計(jì)方法做異常檢測(cè)非常容易理解,計(jì)算效率也很好。但是這種方法存在一些挑戰(zhàn):

  • 數(shù)據(jù)點(diǎn)中的噪聲和異常可能擁有類(lèi)似的統(tǒng)計(jì)特征,那么就很難檢測(cè)出來(lái)。
  • 異常的定義可能會(huì)發(fā)生變化,一個(gè)固定的伐值可能并不適用。例如應(yīng)用zscore,到底是大于3是異常還是大于4是異常,這很難定義。

異常檢測(cè)的機(jī)器學(xué)習(xí)方法

從監(jiān)督學(xué)習(xí)和非監(jiān)督學(xué)習(xí)的角度來(lái)看,如果已經(jīng)有了標(biāo)記異常點(diǎn)的大量訓(xùn)練數(shù)據(jù),異常檢測(cè)可以簡(jiǎn)單的轉(zhuǎn)化為分類(lèi)問(wèn)題,也就是數(shù)據(jù)分兩類(lèi),正常點(diǎn)和異常點(diǎn)。但是在現(xiàn)實(shí)中,往往很難找到大量標(biāo)記好異常點(diǎn)的訓(xùn)練數(shù)據(jù),所以往往需要非監(jiān)督學(xué)習(xí)來(lái)進(jìn)行異常檢測(cè)。

利用數(shù)據(jù)的相似度來(lái)檢測(cè)異常的基本假設(shè)是,如果被檢測(cè)的數(shù)據(jù)和已有的數(shù)據(jù)相似度大,那么它是正常數(shù)據(jù)的可能性就大。相似度的學(xué)習(xí)主要有基于距離的(KNN)和基于密度的(LOF)。

基于聚類(lèi)的異常檢測(cè)的基本假設(shè)是,正常數(shù)據(jù)聚集在一起,異常數(shù)據(jù)聚集在一起。

DBSCAN是異常檢測(cè)常用的聚類(lèi)方法。關(guān)于DBSCAN算法的介紹,大家可以參考我的博客圖解機(jī)器學(xué)習(xí)

如上圖所示,DBSCAN可以學(xué)習(xí)出正常聚類(lèi)的中心點(diǎn)A,邊緣點(diǎn)BC以及異常點(diǎn)N。

但是DBSCAN對(duì)于各個(gè)超參數(shù)的設(shè)定非常敏感,利用該方法雖然不需要標(biāo)記異常點(diǎn),但是找到合適的超參數(shù)并不容易。

支持向量機(jī)(SVM)是一種監(jiān)督學(xué)習(xí)的分類(lèi)方法,單類(lèi)支持向量機(jī)(OneClassSVM)是SVM的一種擴(kuò)展,可以用于非監(jiān)督的檢測(cè)異常。

該算法可以學(xué)習(xí)出正常點(diǎn)和異常點(diǎn)之間的邊界。

隔離森林(isolation forests)是檢測(cè)數(shù)據(jù)中異常值或新穎性的一種有效方法。這是一種基于二元決策樹(shù)的方法。?

隔離森林的基本原則是異常值很少,而且與其他觀測(cè)結(jié)果相差甚遠(yuǎn)。為了構(gòu)建樹(shù)(訓(xùn)練),算法從特征空間中隨機(jī)選取一個(gè)特征,并在最大值和最小值之間隨機(jī)選擇一個(gè)隨機(jī)分割值。這是針對(duì)訓(xùn)練集中的所有觀察結(jié)果。為了建造森林,樹(shù)木整體被平均化為森林中的所有樹(shù)木。

然后,為了預(yù)測(cè),它將觀察與“節(jié)點(diǎn)”中的分裂值進(jìn)行比較,該節(jié)點(diǎn)將具有兩個(gè)節(jié)點(diǎn)子節(jié)點(diǎn),在該子節(jié)點(diǎn)上將進(jìn)行另一次隨機(jī)比較。由算法為實(shí)例做出的“分裂”的數(shù)量被命名為:“路徑長(zhǎng)度”。正如預(yù)期的那樣,異常值的路徑長(zhǎng)度將比其他觀察值更短。

?

利用深度學(xué)習(xí)進(jìn)行異常檢測(cè)

好了我們了解了異常檢測(cè)的基本概念和方法,那么如何利用深度學(xué)習(xí)來(lái)進(jìn)行異常檢測(cè)呢?

雖然神經(jīng)網(wǎng)絡(luò)的主要應(yīng)用是監(jiān)督學(xué)習(xí),但是其實(shí)也可以利用它來(lái)進(jìn)行非監(jiān)督學(xué)習(xí),這里我們就需要了解自編碼器(Autoencoder)了。

自編碼器就是類(lèi)似上圖的一個(gè)網(wǎng)絡(luò),包含編碼和解碼兩個(gè)主要的部分,我們利用訓(xùn)練數(shù)據(jù)集對(duì)該網(wǎng)絡(luò)進(jìn)行訓(xùn)練,輸出的目標(biāo)等于輸入的數(shù)據(jù)。也就是說(shuō)我們訓(xùn)練了一個(gè)可以重建輸入數(shù)據(jù)的深度神經(jīng)網(wǎng)絡(luò)。那么這樣做有什么用能。

我們可以看出編碼的過(guò)程其實(shí)類(lèi)似一個(gè)PCA的降維過(guò)程,就是經(jīng)過(guò)編碼,找到數(shù)據(jù)中的主要成分,利用該主要成份能夠重建原始數(shù)據(jù),就好像數(shù)據(jù)壓縮和解壓縮的過(guò)程,用更少的數(shù)據(jù)來(lái)取代原始數(shù)據(jù)。對(duì)于一般的自編碼器的應(yīng)用,訓(xùn)練好的自編碼器不會(huì)全部用于構(gòu)建網(wǎng)絡(luò),一般是使用編碼的部分來(lái)進(jìn)行數(shù)據(jù)的特征提取,降維,以達(dá)到更有效的計(jì)算。

利用自編碼器,我們假定正常數(shù)據(jù)通過(guò)自編碼器應(yīng)該會(huì)還原,也就是輸入和輸出是一樣的,而對(duì)于異常數(shù)據(jù),還原出來(lái)的數(shù)據(jù)和原始數(shù)據(jù)存在差異。基本假設(shè)就是還原出來(lái)的數(shù)據(jù)和輸入數(shù)據(jù)差異越小,那么它是正常數(shù)據(jù)的可能性就越大,反之它是異常數(shù)據(jù)的可能性就越大。

下面我們就來(lái)看一個(gè)利用自編碼器用tensorflowJS來(lái)檢測(cè)信用卡欺詐數(shù)據(jù)的例子。數(shù)據(jù)集來(lái)自Kaggle,考慮到TensorflowJS在瀏覽器中的性能問(wèn)題,我對(duì)原始數(shù)據(jù)取樣10000條記錄來(lái)演示。

加載數(shù)據(jù)

該數(shù)據(jù)經(jīng)過(guò)kaggle處理,包含Time交易時(shí)間,Amount交易數(shù)額,V1-V28是經(jīng)過(guò)處理后的特征,Class表示交易的類(lèi)別,1為欺詐交易。

async function loadData(path) {return await d3.csv(path); }const dataset = await loadData("https://cdn.jsdelivr.net/gh/gangtao/datasets@master/csv/creditcard_sample_raw.csv" );

數(shù)據(jù)預(yù)處理

function standarize(val, min, max) {return (val - min) / (max - min); }function prepare(dataset) {const processedDataset = dataset.map(item => {const obj = {};for (let i = 1; i < 29; i++) {const key = `V${i}`;obj[key] = parseFloat(item[key]);}obj["Class"] = item["Class"];obj["Time"] = parseFloat(item["Time"]);obj["Amount"] = parseFloat(item["Amount"]);return obj;});const timeMax = d3.max(processedDataset.map(i => i.Time));const timeMin = d3.min(processedDataset.map(i => i.Time));const amountMax = d3.max(processedDataset.map(i => i.Amount));const amountMin = d3.min(processedDataset.map(i => i.Amount));processedDataset.forEach(item => {item.stdTime = standarize(item.Time, timeMax, timeMin);item.stdAmount = standarize(item.Amount, amountMax, amountMin);});return processedDataset; }const preparedDataset = prepare(dataset);

在數(shù)據(jù)預(yù)處理階段我們對(duì)Time和Amount做標(biāo)準(zhǔn)化處理使它的值在(0-1)之間。

生成訓(xùn)練數(shù)據(jù)集

function makeTrainData(dataset) {console.log(dataset.length);const normalData = dataset.filter(item => item.Class == "0");const anomalData = dataset.filter(item => item.Class == "1");const sliceIndex = normalData.length*0.8;const normalTrainData = normalData.slice(0,sliceIndex);const normalTestData = normalData.slice(sliceIndex+1, normalData.length);console.log(normalData.length);const trainData = { x: [], y: [] };normalTrainData.forEach(item => {const row = [];for (let i = 1; i < 29; i++) {const key = `V${i}`;row.push(item[key]);}row.push(item["stdAmount"]);row.push(item["stdTime"]);trainData.x.push(row);trainData.y.push(row);});const testData = normalTestData.map(item => {const row = [];for (let i = 1; i < 29; i++) {const key = `V${i}`;row.push(item[key]);}row.push(item["stdAmount"]);row.push(item["stdTime"]);return row;});const testAnomalData = anomalData.map(item => {const row = [];for (let i = 1; i < 29; i++) {const key = `V${i}`;row.push(item[key]);}row.push(item["stdAmount"]);row.push(item["stdTime"]);return row;});return [trainData, testData, testAnomalData]; }const [trainData, testData, testAnomalData] = makeTrainData(preparedDataset);

我們選擇80%的正常數(shù)據(jù)做訓(xùn)練,另外20%的正常交易數(shù)據(jù)和所有的異常交易數(shù)據(jù)做測(cè)試。

構(gòu)建模型和訓(xùn)練

function buildModel() {const model = tf.sequential();//encoder Layerconst encoder = tf.layers.dense({inputShape: [INPUT_NUM],units: FEATURE_NUM,activation: "tanh"});model.add(encoder);const encoder_hidden = tf.layers.dense({inputShape: [FEATURE_NUM],units: HIDDEN_NUM,activation: "relu"});model.add(encoder_hidden);//decoder Layerconst decoder_hidden = tf.layers.dense({units: HIDDEN_NUM,activation: "tanh"});model.add(decoder_hidden);//decoder Layerconst decoder = tf.layers.dense({units: INPUT_NUM,activation: "relu"});model.add(decoder);//compileconst adam = tf.train.adam(0.005);model.compile({optimizer: adam,loss: tf.losses.meanSquaredError});return model; }async function watchTraining() {const metrics = ["loss", "val_loss", "acc", "val_acc"];const container = {name: "show.fitCallbacks",tab: "Training",styles: {height: "1000px"}};const callbacks = tfvis.show.fitCallbacks(container, metrics);return train(model, data, callbacks); }async function trainBatch(data, model) {const metrics = ["loss", "val_loss", "acc", "val_acc"];const container = {name: "show.fitCallbacks",tab: "Training",styles: {height: "1000px"}};const callbacks = tfvis.show.fitCallbacks(container, metrics);console.log("training start!");tfvis.visor();// Save the model// const saveResults = await model.save('downloads://creditcard-model');const epochs = config.epochs;const results = [];const xs = tf.tensor2d(data.x);const ys = tf.tensor2d(data.y);const history = await model.fit(xs, ys, {batchSize: config.batchSize,epochs: config.epochs,validationSplit: 0.2,callbacks: callbacks});console.log("training complete!");return history; }const model = buildModel(); model.summary();const history = await trainBatch(trainData, model);

我們的自編碼器的模型如下:

_________________________________________________________________ Layer (type) Output shape Param # ================================================================= dense_Dense1 (Dense) [null,16] 496 _________________________________________________________________ dense_Dense2 (Dense) [null,8] 136 _________________________________________________________________ dense_Dense3 (Dense) [null,8] 72 _________________________________________________________________ dense_Dense4 (Dense) [null,30] 270 ================================================================= Total params: 974 Trainable params: 974 Non-trainable params: 0

前兩層是編碼,后兩層是解碼。

分析異常值

自編碼器模型訓(xùn)練好了以后我們就可以用它來(lái)分析異常,我們對(duì)測(cè)試數(shù)據(jù)的正常交易記錄和異常交易記錄用該模型預(yù)測(cè),理論上正常交易的輸出更接近原始值,而異常交易記錄應(yīng)該偏離原始值比較多,我們利用歐式距離來(lái)分析自編碼器的輸出結(jié)果。

async function distance(a, b ){const axis = 1;const result = tf.pow(tf.sum(tf.pow(a.sub(b), 2), axis), 0.5);return result.data(); }async function predict(model, input) {const prediction = await model.predict(tf.tensor(input));return prediction; }const predictNormal = await predict(model, testData); const predictAnomal = await predict(model, testAnomalData);const distanceNormal = await distance(tf.tensor(testData), predictNormal); const distanceAnomal = await distance(tf.tensor(testAnomalData), predictAnomal);const resultData = []; distanceNormal.forEach(item => {const obj = {};obj.type = "normal";obj.value = item;obj.index = Math.random();resultData.push(obj); }) distanceAnomal.forEach(item => {const obj = {};obj.type = "outlier";obj.value = item;obj.index = Math.random();resultData.push(obj); })

測(cè)試結(jié)果如下圖:

上圖綠色是異常交易,藍(lán)色是正常交易。因?yàn)檎=灰椎臄?shù)量較多,我們可能看不太清楚,我們分別顯示如下圖:

我們看到異常交易的自編碼器輸出和原始結(jié)果的距離都是大于10的,而絕大部分正常交易集中在10以下的區(qū)域,如果我們以10為伐值,應(yīng)該可以找到大部分的異常交易,當(dāng)然會(huì)有大量的正常交易誤報(bào)。也就是該模型是無(wú)法做到完全的分辨正常和異常交易的。

完整的代碼見(jiàn)我的Codepen

總結(jié)

本文介紹了各種異常檢測(cè)的主要方法,無(wú)論是統(tǒng)計(jì)方法,機(jī)器學(xué)習(xí)的方法還是深度學(xué)習(xí)的方法,其中主要問(wèn)題都是對(duì)于伐值或者參數(shù)的設(shè)置。

對(duì)于統(tǒng)計(jì)方法,需要確定究竟生成概率多少的事件是異常是百年一遇的洪水是異常,還是千年一遇的洪水是異常?

對(duì)于各種監(jiān)督學(xué)習(xí),我們往往缺乏異常點(diǎn)的標(biāo)記,而對(duì)于非監(jiān)督學(xué)習(xí),調(diào)整各種參數(shù)會(huì)對(duì)異常點(diǎn)的判斷有很大的影響。

對(duì)于基于自編碼器的方法而言,我們看到,我們利用利用自編碼器的輸出和輸入的差異來(lái)判斷該事件是否為異常事件,然而究竟偏離多少來(lái)定義為異常,仍然需要用戶來(lái)指定。

我們希望的完全通過(guò)數(shù)據(jù)和算法來(lái)自動(dòng)發(fā)現(xiàn)異常仍然是一個(gè)比較困難的問(wèn)題。

參考

  • Introduction to Anomaly Detection
  • A Brief Overview of Outlier Detection Techniques
  • A Density-based algorithm for outlier detection
  • Introduction to Anomaly Detection: Concepts and Techniques
  • Anomaly detection using deep learning to measure quality of Large Datasets
  • Comparing anomaly detection algorithms for outlier detection on toy datasets
  • 莫煩 Python 自編碼 (Autoencoder)
  • Credit Card Fraud Detection Dataset
  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (十一)時(shí)間序列預(yù)測(cè)

  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (十)構(gòu)建一個(gè)推薦系統(tǒng)?

  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (九)訓(xùn)練詞向量 Word Embedding
  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (八)生成對(duì)抗網(wǎng)絡(luò) (GAN)

  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (七)遞歸神經(jīng)網(wǎng)絡(luò) (RNN)
  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (六)構(gòu)建一個(gè)卷積網(wǎng)絡(luò) Convolutional Network

  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (五)構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)

  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (四)用基本模型對(duì)MNIST數(shù)據(jù)進(jìn)行識(shí)別

  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (三)更多的基本模型

  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (二)第一個(gè)模型,線性回歸

  • 在瀏覽器中進(jìn)行深度學(xué)習(xí):TensorFlow.js (一)基本概念

轉(zhuǎn)載于:https://my.oschina.net/taogang/blog/3055585

總結(jié)

以上是生活随笔為你收集整理的在浏览器中进行深度学习:TensorFlow.js (十二)异常检测算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。