如何使用 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() 捕获时间序列数据的趋势以进行预测的主要内容,如果未能解决你的问题,请参考以下文章

csharp agrega linea可编辑GRID

sql Salto de linea SQLServer

javascript salto de linea en canvan

markdown Trucos para linea de comandos

php CSS cssEnLinea estilos en linea风格

javascript 验证null js,验证null,una linea