【问题标题】:Sklearn custom transformer to extract date features doesn't work in a Pipeline用于提取日期特征的 Sklearn 自定义转换器在管道中不起作用
【发布时间】:2022-01-11 20:05:02
【问题描述】:

我输入的数据是字符串数据类型,我想从该字符串中提取一些与预测时间相关的日期。

一个例子是:

Date City
2015-07-12 Barcelona
2015-07-13 Brussels

我希望它是

Day Month
7 12
7 13

等等


from sklearn.base import BaseEstimator, TransformerMixin

class DateTransformer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        return self

    def transform(Self, X, y = None):
        X.date = pd.to_datetime(X.date)
        X["year"] = X.date.dt.year
        X["month"] = X.date.dt.month
        X["day"] = X.date.dt.day
        X["dow"] = X.date.dt.dayofweek
        X["quarter"] = X.date.dt.quarter
        X = X.drop("date", axis=1)
        X = X.astype(str)
        return X

用于以下管道

naiveBaseline = Pipeline([
    ('dates', DateTransformer()),
    ('onehot', OneHotEncoder()),
    ('regression', RidgeCV())
])

当这样使用时,管道实际上可以工作:

naiveBaseline2.fit(X_train,y_train)
naiveBaseline2.predict(X_test)

但理想情况下,我使用以下函数来对多个模型的性能进行基准测试:

def evaluate(model, X, y, cv):
    cv_results = cross_validate(
        model,
        X,
        y,
        cv=cv,
        scoring=["neg_mean_absolute_error", "neg_root_mean_squared_error"],
    )
    mae = -cv_results["test_neg_mean_absolute_error"]
    rmse = -cv_results["test_neg_root_mean_squared_error"]
    print(
        f"Mean Absolute Error:     {mae.mean():.3f} +/- {mae.std():.3f}\n"
        f"Root Mean Squared Error: {rmse.mean():.3f} +/- {rmse.std():.3f}"
    )

如果我通过这个评估函数运行它:evaluate(naiveBaseline2, X, y, TimeSeriesSplit())

我只是得到两个指标的 NaN。我已经研究了好几个小时,似乎真的无法理解出了什么问题,你们中有人知道吗?

【问题讨论】:

    标签: python pandas scikit-learn


    【解决方案1】:

    已解决,问题出在 oneHotEncoder,在使用 TimeSeriesSplit() 并向前进行交叉验证时,它看不到所有日期标签(例如第一次拆分中的 2020 年),因此它引发了错误。 oneHotEncoder 需要参数handle_unknown=True

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 2016-03-26
      • 2021-12-20
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多