gpt4 book ai didi

python - 如何为时间序列制作自定义 sklearn 转换器?

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:30 25 4
gpt4 key购买 nike

我有一个 pandas Series 对象,其日期时间索引代表我的时间序列 y。

我通过将序列的前“p”步作为独立变量 X 来对这个时间序列建模。所以 X 是一个带有日期时间索引的 pandas 数据框,其列是 y 的位移。

我通常看到 sklearn 中的转换器同时应用于 y 和 X,但在我的例子中,我还没有 X,我想从 y 中创建它,然后让后续的“拟合”方法使用它管道。

这里我写了一个自定义转换器来生成 X:

from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline

class FeatureGenerator(BaseEstimator, TransformerMixin):

#p stants for the number of step
def __init__(self, p):
self._p = p


def fit(self):
return self


def transform(self, y):

X = pd.concat([y.shift(+ i) for i in range(self._p)],axis=1)

return X

在这里,我尝试将这个特征生成器放入管道中

from sklearn.linear_model import LinearRegression

feature_gen = FeatureGenerator(p = 4)
clf = LinearRegression()

pipeline= Pipeline(steps = [('feature_gen', feature_gen),
('clf', LinearRegression())])
pipeline.fit(ts)

最佳答案

更正列表

我添加了一些更改来使您的管道正常工作:

  • 首先,为了使您的转换器有效,它需要有一个 fit 方法,该方法采用与您的 clf.fit 相同的参数(顺便说一句, clf 通常代表分类器,当它真的是线性回归时会产生误导..)。在这种情况下,假设它是一个线性回归,它将 X,y 作为参数。因此,您还需要将这些添加到您的变压器中。

  • 其次,您需要进一步移动您的 y 值,否则,您将允许数据泄漏,这意味着您将实际的 y 值插入到特征中,这就是我更正的原因这条线

    pd.concat([X.shift(+ i) for i in range(self._p)],axis=1)

    对此

    pd.concat([X.shift(+ i) for i in range(1,self._p+1)],axis=1)
  • 第三,这必然会导致在第一个 p 观察结果中出现 NA,您可能希望将其丢弃。我刚刚添加了 fillna(0) 以从代码角度解决问题。

  • 第四,鉴于 LinearRegression() 需要配备 X 和 y,您需要将两者都提供给管道。转换器的设置方式,ts 同时扮演 Xy 的角色,X 会滞后。

    <

总结

一旦你把所有这些东西放在一起,你就有了:

from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline

class FeatureGenerator(BaseEstimator, TransformerMixin):

#p stants for the number of step
def __init__(self, p):
self._p = p


def fit(self, X, y):
return self


def transform(self, X): #This X is in reality going to be the "y"
X1 = pd.concat([X.shift(+ i) for i in range(1,self._p+1)],axis=1)
return X1.fillna(0)

然后您可以像这样试用您的变压器:

feature_gen = FeatureGenerator(p = 4)
feature_gen.transform(ts)

然后像这样在管道中使用它:

feature_gen = FeatureGenerator(p = 4)
linreg = LinearRegression()

pipeline= Pipeline(steps = [('feature_gen', feature_gen), ('reg',
linreg)])
pipeline.fit(ts,ts)

关于python - 如何为时间序列制作自定义 sklearn 转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57149361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com