Share via


series_mv_if_anomalies_fl()

La funzione series_mv_if_anomalies_fl() è una funzione definita dall'utente che rileva le anomalie multivariate in serie applicando il modello di foresta di isolamento da scikit-learn. La funzione accetta un set di serie come matrici dinamiche numeriche, i nomi delle colonne delle funzionalità e la percentuale prevista di anomalie dall'intera serie. La funzione crea un insieme di alberi di isolamento per ogni serie e contrassegna i punti che sono rapidamente isolati come anomalie.

Prerequisiti

  • Il plug-in Python deve essere abilitato nel cluster. Questa operazione è necessaria per Python inline usato nella funzione .
  • Il plug-in Python deve essere abilitato nel database. Questa operazione è necessaria per Python inline usato nella funzione .

Sintassi

T | invoke series_mv_if_anomalies_fl(, features_colsanomaly_col [,score_col [,anomalies_pct [num_trees [,,samples_pct ]]]])

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Tipo Obbligatoria Descrizione
features_cols dynamic ✔️ Matrice contenente i nomi delle colonne utilizzate per il modello di rilevamento anomalie multivariato.
anomaly_col string ✔️ Nome della colonna in cui archiviare le anomalie rilevate.
score_col string Nome della colonna in cui archiviare i punteggi delle anomalie.
anomalies_pct real Numero reale nell'intervallo [0-50] che specifica la percentuale prevista di anomalie nei dati. Valore predefinito: 4%.
num_trees int Numero di alberi di isolamento da compilare per ogni serie temporale. Valore predefinito: 100.
samples_pct real Numero reale nell'intervallo [0-100] che specifica la percentuale di campioni usati per compilare ogni albero. Valore predefinito: 100%, ad esempio usare la serie completa.

Definizione di funzione

È possibile definire la funzione incorporando il codice come funzione definita da query o creandola come funzione archiviata nel database, come indicato di seguito:

Definire la funzione usando l'istruzione let seguente. Non sono necessarie autorizzazioni.

Importante

Un'istruzione let non può essere eseguita autonomamente. Deve essere seguita da un'istruzione di espressione tabulare. Per eseguire un esempio funzionante di series_mv_if_anomalies_fl(), vedere Esempio.

// Define function
let series_mv_if_anomalies_fl=(tbl:(*), features_cols:dynamic, anomaly_col:string, score_col:string='', anomalies_pct:real=4.0, num_trees:int=100, samples_pct:real=100.0)
{
    let kwargs = bag_pack('features_cols', features_cols, 'anomaly_col', anomaly_col, 'score_col', score_col, 'anomalies_pct', anomalies_pct, 'num_trees', num_trees, 'samples_pct', samples_pct);
    let code = ```if 1:
        from sklearn.ensemble import IsolationForest
        features_cols = kargs['features_cols']
        anomaly_col = kargs['anomaly_col']
        score_col = kargs['score_col']
        anomalies_pct = kargs['anomalies_pct']
        num_trees = kargs['num_trees']
        samples_pct = kargs['samples_pct']
        dff = df[features_cols]
        iforest = IsolationForest(contamination=anomalies_pct/100.0, random_state=0, n_estimators=num_trees, max_samples=samples_pct/100.0)
        for i in range(len(dff)):
            dffi = dff.iloc[[i], :]
            dffe = dffi.explode(features_cols)
            iforest.fit(dffe)
            df.loc[i, anomaly_col] = (iforest.predict(dffe) < 0).astype(int).tolist()
            if score_col != '':
                df.loc[i, score_col] = iforest.decision_function(dffe).tolist()
        result = df
    ```;
    tbl
    | evaluate hint.distribution=per_node python(typeof(*), code, kwargs)
};
// Write your query to use the function here.

Esempio

Nell'esempio seguente viene utilizzato l'operatore invoke per eseguire la funzione .

Per usare una funzione definita da query, richiamarla dopo la definizione della funzione incorporata.

// Define function
let series_mv_if_anomalies_fl=(tbl:(*), features_cols:dynamic, anomaly_col:string, score_col:string='', anomalies_pct:real=4.0, num_trees:int=100, samples_pct:real=100.0)
{
    let kwargs = bag_pack('features_cols', features_cols, 'anomaly_col', anomaly_col, 'score_col', score_col, 'anomalies_pct', anomalies_pct, 'num_trees', num_trees, 'samples_pct', samples_pct);
    let code = ```if 1:
        from sklearn.ensemble import IsolationForest
        features_cols = kargs['features_cols']
        anomaly_col = kargs['anomaly_col']
        score_col = kargs['score_col']
        anomalies_pct = kargs['anomalies_pct']
        num_trees = kargs['num_trees']
        samples_pct = kargs['samples_pct']
        dff = df[features_cols]
        iforest = IsolationForest(contamination=anomalies_pct/100.0, random_state=0, n_estimators=num_trees, max_samples=samples_pct/100.0)
        for i in range(len(dff)):
            dffi = dff.iloc[[i], :]
            dffe = dffi.explode(features_cols)
            iforest.fit(dffe)
            df.loc[i, anomaly_col] = (iforest.predict(dffe) < 0).astype(int).tolist()
            if score_col != '':
                df.loc[i, score_col] = iforest.decision_function(dffe).tolist()
        result = df
    ```;
    tbl
    | evaluate hint.distribution=per_node python(typeof(*), code, kwargs)
};
// Usage
normal_2d_with_anomalies
| extend anomalies=dynamic(null), scores=dynamic(null)
| invoke series_mv_if_anomalies_fl(pack_array('x', 'y'), 'anomalies', 'scores', anomalies_pct=8, num_trees=1000)
| extend anomalies=series_multiply(40, anomalies)
| render timechart

Output

La tabella normal_2d_with_anomalies contiene un set di 3 serie temporali. Ogni serie temporale ha una distribuzione normale bidimensionale con anomalie giornaliere aggiunte rispettivamente a mezzanotte, 8:00 e 4:00. È possibile creare questo set di dati di esempio usando una query di esempio.

Grafico che mostra le anomalie multivariate in un grafico temporale.

Per visualizzare i dati come grafico a dispersione, sostituire il codice di utilizzo con quanto segue:

normal_2d_with_anomalies
| extend anomalies=dynamic(null)
| invoke series_mv_if_anomalies_fl(pack_array('x', 'y'), 'anomalies')
| where name == 'TS1'
| project x, y, anomalies
| mv-expand x to typeof(real), y to typeof(real), anomalies to typeof(string)
| render scatterchart with(series=anomalies)

Grafico che mostra le anomalie multivariate in un grafico a dispersione.

Si può notare che nella maggior parte delle anomalie che si verificano alle 8:00 è stato rilevato usando questo modello multivariato.

Questa funzionalità non è supportata.