如何使用 scikit-learn 的 LinearRegression() 捕获时间序列数据的趋势以进行预测

Posted

技术标签:

【中文标题】如何使用 scikit-learn 的 LinearRegression() 捕获时间序列数据的趋势以进行预测【英文标题】:How to capture trend in time-series data for forecasting using scikit-learn's LinearRegression() 【发布时间】:2021-08-03 22:17:51 【问题描述】:

我阅读了一些关于使用 ML 进行时间序列预测的文献。我明白了

的概念
    趋势 季节性 循环 噪音

我想使用 scikit-learn 的 LinearRegression() 作为开始进行预测。如果我做对了,我可以使用day_of_weekmonthseasons 等特征工程来捕捉季节性和周期性。我不明白,如何捕捉数据中的趋势。是滞后特征还是计算差异而不是总计的列?

【问题讨论】:

回答这么宽泛的问题有点困难。肯定有不止一种方法可以尝试捕获时间序列数据中的周期性特征。如果您对更自动化的解决方案感兴趣,我建议您使用 prophet 包。 我将使用sktimesklearn 模型并通过季节性。顺便说一句:LinearRegression 用于分类问题 感谢您的回答。不是数字标签的 LinearRegression 和分类的 LogisticRegression。我肯定会给 sktime 和 statsmodels 一个机会,但是对于这个项目,我想坚持使用 scikit。我正在尝试在这里获得所有基础知识。 是的,你是对的。我错了。 LinearRegression 用于回归问题。您实际上在下面的代码中使用它来代替 KNeighborsRegressor 或 GradientBoostingRegressor。 【参考方案1】:

线性回归将数据拟合到线性模型中,基本上是一个函数Y = W*X,系数为w = (w1, …, wp),真实值与其对应预测值之间的残差平方和最小。

显然,时间序列数据本质上不是线性的。为了捕捉季节性和循环模式,我建议您使用多项式函数,至少具有n > 2 的力量。您可以使用更高级的回归模型,例如支持向量和随机森林模型。

但可以肯定的是,您可以从线性模型开始。然后,在意识到线性模型的局限性之后,您可以轻松地转向其他高级模型。

【讨论】:

谢谢,我想我会的。我对包和名称有点不知所措,现在想尽量保持简单。关于特征工程,除了时间戳衍生特征、差异和滞后特征之外,还有其他合成特征吗?【参考方案2】:

查看sktime + sklearn 以执行预测:您将能够使用它们执行大部分时间序列分析。示例,根据我的要点,展示如何将模型组合成两个模型来预测趋势

from pytrends.request import TrendReq
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.neighbors import KNeighborsRegressor
from sktime.forecasting.base import ForecastingHorizon
from sktime.forecasting.compose import EnsembleForecaster, ReducedForecaster
from sktime.forecasting.model_selection import temporal_train_test_split
from sktime.performance_metrics.forecasting import smape_loss
from sktime.utils.plotting import plot_series


# fetch cyberbullying data from Google trends
pytrend = TrendReq(hl="en-US")
pytrend.build_payload(
    kw_list=[
        "cyberbullying",
    ]
)
cyberbullying_df = pytrend.interest_over_time()

# transfrom DataFrame to Uni-Series of period
fow = cyberbullying_df["cyberbullying"].to_period(freq="W")

y_train, y_test = temporal_train_test_split(fow, test_size=36)
fh = ForecastingHorizon(y_test.index, is_relative=False)

# forecaster ensemble of knn and gradient boosting regressor
forecaster = EnsembleForecaster(
    [
        (
            "knn",
            ReducedForecaster(
                regressor=KNeighborsRegressor(n_neighbors=1),
                window_length=52,
                strategy="recursive",
                scitype="regressor",
            ),
        ),
        (
            "gboost",
            ReducedForecaster(
                regressor=GradientBoostingRegressor(n_estimators=100, random_state=42),
                window_length=52,
                strategy="recursive",
                scitype="regressor",
            ),
        ),
    ]
)

# train an ensemble forecasters and predict|forecast
forecaster.fit(y_train)
y_pred = forecaster.predict(fh)

sktimes 还允许您使用 Facebook 的 prophet。试试看,因为它是我进行时间序列分析的工具:sktime

【讨论】:

以上是关于如何使用 scikit-learn 的 LinearRegression() 捕获时间序列数据的趋势以进行预测的主要内容,如果未能解决你的问题,请参考以下文章