RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1121068
Accepted
gangsta
gangsta
Asked:2020-05-06 14:43:10 +0000 UTC2020-05-06 14:43:10 +0000 UTC 2020-05-06 14:43:10 +0000 UTC

用于评估通信质量的时间序列机器学习模型

  • 772

有必要在时间序列上建立机器学习模型来评估通信质量。

该数据集是在 14 天 (01/15/2016-01/28/2016) 内收集的,包含 7026706 行和 6 列:Dest。IP、最后一跳 IP、LQ、NLQ、成本。在这个数据集中,我为所有行添加了一个日期列并删除了 Dest 列。IP、最后一跳 IP、NLQ、成本。结果,我得到了踪迹。数据集。

在此处输入图像描述

接下来,我根据日期绘制了 LQ 值。

在此处输入图像描述

并对最后一次观测(24小时)进行了预测:0.9105833333333333

目前的代码:

import pandas as pd
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from glob import glob
from datetime import datetime, time
from pandas.plotting import autocorrelation_plot
from statsmodels.graphics.tsaplots import plot_acf

#Формирование датасета
files = glob("/content/newDataset/*.tsv")
dataset = pd.concat([pd.read_csv(f, sep="\t", skiprows=1) for f in files], 
           ignore_index=True)

n_samples = 7026706 
dt_from = pd.to_datetime("2016-01-15 00:00:00.000000")
dt_to = pd.to_datetime("2016-01-28 23:59:59.999999")
dataset["DateTime"] = pd.date_range(dt_from, dt_to, periods=n_samples)
dataset['LQ'] = dataset.LQ.astype('float64')
#df = pd.DataFrame(dataset)
del dataset['Dest. IP']
del dataset['Last hop IP']
del dataset['NLQ']
del dataset['Cost']
#dataset.drop(['Dest. IP', 'Last hop IP', 'NLQ', 'Cost'], axis=1)
print(dataset)

#График
def plot_series(time, series, format="-", start=0, end=None, label=None):
    plt.plot(time[start:end], series[start:end], format, label=label)
    plt.xlabel("DateTime")
    plt.ylabel("LQ")
    if label:
        plt.legend(fontsize=14)
    plt.grid(True)

def trend(time, slope=0):
    return slope * time

time = dataset['DateTime']
series = dataset['LQ']
plt.figure(figsize=(30, 6))
#plot_series(time, series)
#plt.show()
dataset.set_index("DateTime")["LQ"].rolling(window=600000).mean().plot()

#прогноз по последнему наблюдению
def moving_average(series, n):
    return np.average(series[-n:])

moving_average(dataset.LQ, 24)

由于我的机器学习能力不强,那么:

  1. 我需要平滑时间序列吗?
  2. 什么模型可以用于这个任务?
  3. 我是否正确理解没有异常值并且该系列是固定的?

项目文件。

LQ 与日期/时间图和相关图 FB先知

python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. passant
    2020-05-07T00:09:40Z2020-05-07T00:09:40Z
    1. 您的原始行具有非常具体的外观 - 下图中的一个片段。据此,沟通的质量可以通过不同的指标来评估。其中之一是期间平均值的变化。(例如 - 每秒、每分钟、每天)不清楚为什么要进行移动平均,如果对于指定的操作,您只需要在一段时间内进行平均。

    2. 必须检查由此获得的序列的平稳性,例如,通过 Dickey-Fuller 或 KPSS 检验。两者都在 statsmodels 包中。您的系列很可能是非固定的。

    3. 季节性的存在也​​不是由肉眼决定的,而是——例如——通过自相关分析。

    4. 接下来,您需要分析您的系列并做出预测。我会浏览经典列表(根据第 2 点和第 3 点的结果进行调整)- 局部回归、指数平均值、Holt、Holt-Winters、ARMA、ARIMA、SARIMA。

    5. 然后就可以进行分析了。

    最后一个。我个人的看法——用一个单一的指标来评估沟通的质量——不是正确的方法。如果这是一项学习任务,那么它会做。如果是真正的监控 - 有必要对许多参数进行联合分析。此外,不仅可以从您的 LQ 中提取平均值,还可以提取附加参数——低于 1 的区间分布、单位区间长度的分布、段上的实数值分布等等. 所有这些都会影响通信质量,我不是在谈论您丢弃的其他参数。 在此处输入图像描述

    • 4
  2. Best Answer
    MaxU - stop genocide of UA
    2020-05-07T00:39:34Z2020-05-07T00:39:34Z

    正如在下一个答案中已经提到的- 您可以使用通常的方法而不是使用移动平均线downsampling,即 例如,按 N 分钟对时间序列进行分组,然后取该组的平均值。这将大大减少您的样本量并加快模型训练。

    您的系列有明显的每日季节性迹象 - 请参见第二张图表。要谈论其他类型的季节性,您需要拥有更长时期的数据。对于或多或少合理的预测,您需要拥有至少一年的数据。

    实际示例(使用FBProphet):

    import numpy as np
    import pandas as pd
    from pathlib import Path
    from fbprophet import Prophet
    import matplotlib.pyplot as plt
    import matplotlib
    
    # %matplotlib
    
    ### читаем данные
    data_dir = Path(r"D:\download\data")
    
    df = (pd
          .concat([pd.read_csv(f, sep="\t", skiprows=1, usecols=["LQ"])
                   for f in data_dir.glob("*.tsv")], 
                  ignore_index=True)
          .rename(columns={"LQ": "y"}))
    dt_from = pd.to_datetime("2016-01-15 00:00:00.000000")
    dt_to = pd.to_datetime("2016-01-28 23:59:59.999999")
    df.insert(0, "ds", pd.date_range(dt_from, dt_to, periods=len(df)))
    
    ### усредняем данные до минуты (resampling -> 1 min. frequency)
    data = df.set_index("ds").resample("1T").mean().reset_index()
    
    ### разбиваем данные не обучающую и тестовые выборки
    train_test_split = int(0.7 * len(data))
    train, test = np.split(data, [train_test_split])
    
    
    ### строим модель
    model = Prophet(daily_seasonality=True)
    model.fit(train)
    
    forecast = model.predict(test)
    
    ax = data.set_index("ds")["y"].plot(figsize=(20, 8))
    forecast.set_index("ds")["yhat"].plot(ax=ax)
    ax.legend(["Ground truth", "Predicted"])
    

    在此处输入图像描述

    ### разложение временного ряда на компоненты и визуализация
    # c:\temp\forecast_comps.png
    fig_comps = model.plot_components(forecast)
    

    在此处输入图像描述

    PS 如果时间序列将包含更多数据(例如,1 年以上),那么值得添加每周和每月的季节性以及有关假期的信息。

    • 4

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5