如何使用 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_week
、month
或seasons
等特征工程来捕捉季节性和周期性。我不明白,如何捕捉数据中的趋势。是滞后特征还是计算差异而不是总计的列?
【问题讨论】:
回答这么宽泛的问题有点困难。肯定有不止一种方法可以尝试捕获时间序列数据中的周期性特征。如果您对更自动化的解决方案感兴趣,我建议您使用prophet
包。
我将使用sktime
和sklearn
模型并通过季节性。顺便说一句: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() 捕获时间序列数据的趋势以进行预测的主要内容,如果未能解决你的问题,请参考以下文章
javascript salto de linea en canvan
markdown Trucos para linea de comandos