前几天我看到一篇去年的论文,叫:一种基于综合调优的数据库性能趋势预测方法

点击下载

点击上面的链接还可以下载,开始看到这个论文,光是名字就觉得很拉风,于是打算下载下来看一下。

结果论文的内容和把大象装进冰箱一样简单,唉,世风日下,真的是什么都能写论文了,作者提到:

结果表明 AutoPA4DB 模型在磁盘使用量、内存使用率、CPU 使用率等部分性能指标趋势性预测中的预测准确度 较高,且预测准确度高于优化前模型和其他对比模 型。 但在 TPS(每秒处理的事物数)及数据库连接 数等指标中,预测效果并不理想。

这,这,这,这。。。

总结一下论文内容:

  • 以 1 分钟,30 分钟,60 分钟等时间周期对数据采样,然后做数据清洗,清洗包括异常检测与处理,缺失值处理,平滑等操作。
  • 建模,基于 Prophet 模型和 ARIMA 模型进行建模。
  • 动态调参优化,基于贝叶斯优化 的 Hyperopt 调参技术。
  • 模型评估,采用加权的时序预测准确 性作为预测模型的预测准确性度量标准。
  • 预测模型优化,基于贝叶斯的自动调参 Hyper 模式与 人工自定义调参 Auto 模式进行融合。

总结下来就是,打开冰箱,放进大象,关门。

整个论文的核心实现依托的fb的prophet,prophet可以完成:

  • Saturating Forecasts
  • Trend Changepoints
  • Seasonality, Holidays Effects
  • Multiplicative Seasonality
  • Uncertainty Intervals
  • Outliers
  • Non-Daily Data
  • Diagnostics

下面实例中使用的是 佩顿 · 曼宁的维基百科主页 每日访问量的时间序列数据(2007/12/10 - 2016/01/20)。我们使用 R 中的 Wikipediatrend 包获取该数据集。这个数据集具有多季节周期性、不断变化的增长率和可以拟合特定日期(例如佩顿 · 曼宁的决赛和超级碗)的情况等 Prophet 适用的性质,因此可以作为一个不错的例子。(注:佩顿 · 曼宁为前美式橄榄球四分卫)

# Python
import pandas as pd
from fbprophet import Prophet
# 读入数据集
df = pd.read_csv('examples/example_wp_log_peyton_manning.csv')
df.head()

# 拟合模型
m = Prophet()
m.fit(df)

# 构建待预测日期数据框,periods = 365 代表除历史数据的日期外再往后推 365 天
future = m.make_future_dataframe(periods=365)
future.tail()

# 预测数据集
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

# 展示预测结果
m.plot(forecast);

# 预测的成分分析绘图,展示预测中的趋势、周效应和年度效应
m.plot_components(forecast);

print(forecast.columns)
Index(['ds', 'trend', 'trend_lower', 'trend_upper', 'yhat_lower', 'yhat_upper',
'additive_terms', 'additive_terms_lower', 'additive_terms_upper',
'multiplicative_terms', 'multiplicative_terms_lower',
'multiplicative_terms_upper', 'weekly', 'weekly_lower', 'weekly_upper',
'yearly', 'yearly_lower', 'yearly_upper', 'yhat'],
dtype='object')

Prophet 遵循 sklearn 库建模的应用程序接口。

预测饱和增长

默认情况下, Prophet 使用线性模型进行预测。当预测增长情况时,通常会存在可到达的最大极限值,例如:总市场规模、总人口数等等。这被称做承载能力(carrying capacity),那么预测时就应当在接近该值时趋于饱和。

Prophet 可使用 logistic 增长 趋势模型进行预测,同时指定承载能力。下面使用 R 语言的维基百科主页 访问量(取对数)的实例来进行说明。

import pandas as pd
from fbprophet import Prophet
df = pd.read_csv('examples/example_wp_log_R.csv')
# 新建一列 cap 来指定承载能力的大小。本实例中假设取某个特定的值,通常情况下这个值应当通过市场规模的数据或专业知识来决定。
df['cap'] = 8.5
# 值得注意的是数据框的每行都必须指定 cap 的值,但并非需要是恒定值。如果市场规模在不断地增长,那么 cap 也可以是不断增长的序列。
m = Prophet(growth='logistic')
m.fit(df)

future = m.make_future_dataframe(periods=1826)
future['cap'] = 8.5
fcst = m.predict(future)
fig = m.plot(fcst)

预测饱和减少

logistic增长模型还可以处理饱和最小值,方法与指定最大值的列的方式相同:

# Python
df['y'] = 10 - df['y']
df['cap'] = 6
df['floor'] = 1.5
future['cap'] = 6
future['floor'] = 1.5
m = Prophet(growth='logistic')
m.fit(df)
fcst = m.predict(future)
fig = m.plot(fcst)

参考:https://blog.csdn.net/anshuai_aw1/article/details/83412058


扫码手机观看或分享: