Delen via


series_mv_oc_anomalies_fl()

De functie series_mv_oc_anomalies_fl() is een door de gebruiker gedefinieerde functie (UDF) die multivariate afwijkingen in reeksen detecteert door het One Class SVM-model van scikit-learn toe te passen. De functie accepteert een reeks reeksen als numerieke dynamische matrices, de namen van de kolommen met functies en het verwachte percentage afwijkingen van de hele reeks. De functie traint één klasse SVM voor elke reeks en markeert de punten die buiten de hyperbol vallen als afwijkingen.

Vereisten

  • De Python-invoegtoepassing moet zijn ingeschakeld op het cluster. Dit is vereist voor de inline Python die in de functie wordt gebruikt.

Syntax

T | invoke series_mv_oc_anomalies_fl(, features_colsanomaly_col [,score_col [,anomalies_pct ]])

Meer informatie over syntaxisconventies.

Parameters

Naam Type Vereist Beschrijving
features_cols dynamic ✔️ Een matrix met de namen van de kolommen die worden gebruikt voor het multivariate anomaliedetectiemodel.
anomaly_col string ✔️ De naam van de kolom voor het opslaan van de gedetecteerde afwijkingen.
score_col string De naam van de kolom voor het opslaan van de scores van de afwijkingen.
anomalies_pct real Een reëel getal in het bereik [0-50] dat het verwachte percentage afwijkingen in de gegevens aangeeft. Standaardwaarde: 4%.

Functiedefinitie

U kunt de functie als volgt definiëren door de code in te sluiten als een door een query gedefinieerde functie of door deze te maken als een opgeslagen functie in uw database:

Definieer de functie met behulp van de volgende let-instructie. Er zijn geen machtigingen vereist.

Belangrijk

Een let-instructie kan niet zelfstandig worden uitgevoerd. Deze moet worden gevolgd door een tabellaire expressie-instructie. Zie Voorbeeld als u een werkend voorbeeld van series_mv_oc_anomalies_fl()wilt uitvoeren.

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.

Voorbeeld

In het volgende voorbeeld wordt de operator aanroepen gebruikt om de functie uit te voeren.

Als u een querygedefinieerde functie wilt gebruiken, roept u deze aan na de definitie van de ingesloten functie.

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

Uitvoer

De tabel normal_2d_with_anomalies bevat een set van drie tijdreeksen. Elke tijdreeks heeft een tweedimensionale normale verdeling met dagelijkse afwijkingen die respectievelijk om middernacht, 8:00 uur en 16:00 uur zijn toegevoegd. U kunt deze voorbeeldgegevensset maken met behulp van een voorbeeldquery.

Grafiek met multivariate afwijkingen in een tijddiagram.

Als u de gegevens wilt weergeven als een spreidingsdiagram, vervangt u de gebruikscode door het volgende:

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)

Grafiek met multivariate afwijkingen in een spreidingsdiagram.

U kunt zien dat op TS1 de meeste afwijkingen die om middernacht optreden, zijn gedetecteerd met behulp van dit multivariate model.

Deze functie wordt niet ondersteund.