Advertisement

时间序列异常检测(pycaret)

阅读量:

1. 获取时间序列数据(官方文档是多特征,本文举例是单特征)

未安装pycaret的先安装:pip install --pre pycaret (也可以pip install pycaret)

2.用pycaret检测异常一般用pycaret.anomaly

复制代码
复制代码
 from pycaret.anomaly import *

    
 setup = setup(df, session_id = 123)
    
    
    
    

3.获取pycaret支持的所有检测异常模型

复制代码
    models()
    
复制代码
复制代码
复制代码
复制代码

4. 使用其中一个算法测试(使用的算法参数都是默认的,调参的话效果会更好)

复制代码
 import plotly.express as px

    
 def get_line(df_p):
    
 #     print(df_test)
    
     fig = px.line(df_p, x="date", y="y", color='mark', title="Sorted Input")
    
     fig.update_xaxes(tickformat="%Y-%m-%d", hoverformat="%Y-%m-%d", row=1)
    
     fig.update_traces(dict(mode="markers+lines"))
    
     fig.update_layout(title_text="趋势图", title_x=0.5)
    
     fig.update(layout=dict(xaxis=dict(title="日期", tickangle=-45,
    
                                   showline=True, nticks=20),
    
                        yaxis=dict(title="值", showline=True)))
    
     return fig
    
 def mark(df):
    
     df['date'] = df.index
    
     df = df.reset_index(drop=True)
    
     df_start_time = str(df.date.min()).split(' ')[0]
    
     df_end_time = str(df.date.max()).split(' ')[0]
    
     df_end_time_next = (datetime.datetime.strptime(df_end_time, '%Y-%m-%d') + datetime.timedelta(days=1)).strftime('%Y-%m-%d')
    
     date_range = pd.date_range(df_start_time, df_end_time_next, freq='D')
    
     df_raw = pd.DataFrame()
    
     df_outliers = pd.DataFrame()
    
     df_raw["date"] = date_range
    
     df_outliers["date"] = date_range
    
     df_outliers_is = df[df['Anomaly']==1]
    
     df_outliers = pd.merge(df_outliers, df_outliers_is[['date','y']], on=["date"], how="left")
    
     df_outliers.columns = ['date','y']
    
     df_outliers['mark'] = 'outliers'
    
     df_outliers_no = df[df['Anomaly']==0]
    
     df_raw = pd.merge(df_raw, df_outliers_no[['date','y']], on=["date"], how="left")
    
     df_raw.columns = ['date','y']
    
     df_raw['mark'] = 'true'
    
     df_all = pd.concat([df_raw, df_outliers])
    
     return df_all
    
    
    
    
复制代码
 iforest = create_model('iforest') # 默认异常值比例为0.05

    
 iforest_results = assign_model(iforest)
    
 iforest_results = mark(iforest_results)
    
 iforest_results
    
 get_line(iforest_results)
    
    
    
    

下一个算法:

复制代码
 knn = create_model('knn')

    
 knn_results = assign_model(knn)
    
 knn_results = mark(knn_results)
    
 get_line(knn_results)
    
    
    
    

下一个算法:

复制代码
 lof = create_model('lof')

    
 lof_results = assign_model(lof)
    
 lof_results = mark(lof_results)
    
 get_line(lof_results)
    
    
    
    

下一个算法:

复制代码
 svm = create_model('svm')

    
 svm_results = assign_model(svm)
    
 svm_results = mark(svm_results)
    
 get_line(svm_results)
    
    
    
    

下一个算法:

复制代码
 pca = create_model('pca')

    
 pca_results = assign_model(pca)
    
 pca_results = mark(pca_results)
    
 get_line(pca_results)
    
    
    
    

下一个算法:

复制代码
 sos = create_model('sos')

    
 sos_results = assign_model(sos)
    
 sos_results = mark(sos_results)
    
 get_line(sos_results)
    
    
    
    

下一个算法:

复制代码
 sod = create_model('sod')

    
 sod_results = assign_model(sod)
    
 sod_results = mark(sod_results)
    
 get_line(sod_results)
    
    
    
    

下一个算法:

复制代码
 mcd = create_model('mcd')

    
 mcd_results = assign_model(mcd)
    
 mcd_results = mark(mcd_results)
    
 get_line(mcd_results)
    
    
    
    

下一个算法:

复制代码
 histogram = create_model('histogram')

    
 histogram_results = assign_model(histogram)
    
 histogram_results = mark(histogram_results)
    
 get_line(histogram_results)
    
    
    
    

下一个算法:

复制代码
 abod = create_model('abod')

    
 abod_results = assign_model(abod)
    
 abod_results = mark(abod_results)
    
 get_line(abod_results)
    
    
    
    

下一个算法:

复制代码
 cluster = create_model('cluster')

    
 cluster_results = assign_model(cluster)
    
 cluster_results = mark(cluster_results)
    
 get_line(cluster_results)
    
    
    
    

下一个算法:

复制代码
 cof = create_model('cof')

    
 cof_results = assign_model(cof)
    
 cof_results = mark(cof_results)
    
 get_line(cof_results)
    
    
    
    

5.PyCaret 中 为 算法使用evaluate_model() 函数, 查看流程

复制代码
    evaluate_model(iforest)
    

6.PyCaret 中 为 算法使用plot_model() 函数 ,它将为异常值创建一个 3D 图,在其中我们可以看到为什么某些特征被视为异常。

复制代码
    plot_model(iforest)
    
复制代码
    plot_model(knn)
    

我们可以放大这个二维图来查看哪些点被认为是异常值。

可以再次为配对图创建另一个视觉效果,现在使用异常来查看哪些点将被视为异常

复制代码
 import seaborn as sns

    
 iforest = create_model('iforest')
    
 iforest_results = assign_model(iforest)
    
 sns.pairplot(iforest_results, hue = "Anomaly")
    
    
    
    

最后,我们可以保存模型。可以保存任何合适的模型。这里我们保存了 iforest 模型。

复制代码
    save_model(iforest,'IForest_Model')
    

先这样,有时间再完善吧

全部评论 (0)

还没有任何评论哟~