Partilhar via


series_mv_oc_anomalies_fl()

Aplica-se a: ✅Microsoft FabricAzure Data Explorer

A função series_mv_oc_anomalies_fl() é uma UDF (função definida pelo usuário) que detecta anomalias multivariadas em série aplicando o modelo SVM de uma classe do scikit-learn. A função aceita um conjunto de séries como matrizes dinâmicas numéricas, os nomes das colunas de recursos e a porcentagem esperada de anomalias de toda a série. A função treina uma classe SVM para cada série e marca os pontos que estão fora da hiperesfera como anomalias.

Pré-requisitos

  • O plug-in Python deve ser habilitado no cluster. Isso é necessário para o Python embutido usado na função.

Sintaxe

T | invoke series_mv_oc_anomalies_fl(, features_cols anomaly_col [ , score_col [, anomalies_pct ]])

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Digitar Obrigatória Descrição
features_cols dynamic ✔️ Uma matriz que contém os nomes das colunas usadas para o modelo de detecção de anomalias multivariadas.
anomaly_col string ✔️ O nome da coluna para armazenar as anomalias detectadas.
score_col string O nome da coluna para armazenar as pontuações das anomalias.
anomalies_pct real Um número real no intervalo [0-50] especificando a porcentagem esperada de anomalias nos dados. Valor padrão: 4%.

Definição de função

Você pode definir a função inserindo seu código como uma função definida por consulta ou criando-a como uma função armazenada em seu banco de dados, da seguinte maneira:

Defina a função usando a instrução let a seguir. Nenhuma permissão é necessária.

Importante

Uma instrução let não pode ser executada sozinha. Ele deve ser seguido por uma instrução de expressão tabular. Para executar um exemplo funcional de series_mv_oc_anomalies_fl(), consulte Exemplo.

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

Exemplo

O exemplo a seguir usa o operador invoke para executar a função.

Para usar uma função definida por consulta, invoque-a após a definição da função inserida.

let series_mv_oc_anomalies_fl=(tbl:(*), features_cols:dynamic, anomaly_col:string, score_col:string='', anomalies_pct:real=4.0)
{
    let kwargs = bag_pack('features_cols', features_cols, 'anomaly_col', anomaly_col, 'score_col', score_col, 'anomalies_pct', anomalies_pct);
    let code = ```if 1:
        from sklearn.svm import OneClassSVM
        features_cols = kargs['features_cols']
        anomaly_col = kargs['anomaly_col']
        score_col = kargs['score_col']
        anomalies_pct = kargs['anomalies_pct']
        dff = df[features_cols]
        svm = OneClassSVM(nu=anomalies_pct/100.0)
        for i in range(len(dff)):
            dffi = dff.iloc[[i], :]
            dffe = dffi.explode(features_cols)
            svm.fit(dffe)
            df.loc[i, anomaly_col] = (svm.predict(dffe) < 0).astype(int).tolist()
            if score_col != '':
                df.loc[i, score_col] = svm.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_oc_anomalies_fl(pack_array('x', 'y'), 'anomalies', 'scores', anomalies_pct=6)
| extend anomalies=series_multiply(80, anomalies)
| render timechart

Saída

A tabela normal_2d_with_anomalies contém um conjunto de 3 séries temporais. Cada série temporal tem distribuição normal bidimensional com anomalias diárias adicionadas à meia-noite, 8h e 16h, respectivamente. Você pode criar esse conjunto de dados de exemplo usando uma consulta de exemplo.

Gráfico mostrando anomalias multivariadas em um gráfico de tempo.

Para exibir os dados como um gráfico de dispersão, substitua o código de uso pelo seguinte:

normal_2d_with_anomalies
| extend anomalies=dynamic(null)
| invoke series_mv_oc_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)

Gráfico mostrando anomalias multivariadas em um gráfico de dispersão.

Você pode ver que no TS1 a maioria das anomalias que ocorrem à meia-noite foram detectadas usando este modelo multivariado.