0

我正在学习使用管道,因为它们看起来更干净。所以,我正在参与 Kaggle 上的表格操场比赛。

我正在尝试遵循一个非常简单的管道,在该管道中,我使用 aFunctionTransformer将新列添加到数据框中,执行Ordinal Encoding并最终将数据拟合到LinearRegression模型上。

这是代码:

def weekfunc(df):
    print(df)
    df = pd.to_datetime(df)
    df['weekend'] = df.dt.weekday
    df['weekend'].replace(range(5), 0, inplace = True)
    df['weekend'].replace([5,6], 1, inplace = True)
​ get_weekend = FunctionTransformer(weekfunc)
 
col_trans = ColumnTransformer([
    ('weekend transform', get_weekend,['date']),
    ('label encoding', OrdinalEncoder(), ['country', 'store', 'product'])
])
 
pipe = Pipeline([
    ('label endoer', col_trans),
    ('regression', LinearRegression())
])
 
 
pipe.fit(X_train,y_train)

但代码在第一步 ( FunctionTransformer) 中断并给我以下错误:

to assemble mappings requires at least that [year, month, day] be specified: 
[day,month,year] is missing

这很奇怪,因为我可以在正在执行的函数中打印,这表明它是datetime格式的。甚至get_weekend.transform(X_train['date'])按预期工作。但是当所有步骤都加入时,它似乎不起作用。

4

1 回答 1

2

FunctionTransformer使用一个自定义函数创建一个与 scikit-learn 兼容的转换器。转换器必须返回此函数的结果,以便在后面的步骤中使用它。您的代码的问题在于,weekfunc它基本上是接收一个 DataFrame 并且什么都不返回。

weekfunc下面的示例在管道中使用该函数:

如下:

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OrdinalEncoder, FunctionTransformer
from sklearn.linear_model import LinearRegression
from datetime import datetime
import pandas as pd

X_train = pd.DataFrame(
    {
        "date": [datetime.today()],
        "country": ["ch"],
        "store": ["Gamestop"],
        "product": ["Xbox"],
    }
)
y_train = pd.Series([1])


def weekfunc(df):
    return (df["date"].dt.weekday >= 5).to_frame()


get_weekend = FunctionTransformer(weekfunc)

col_trans = ColumnTransformer(
    [
        ("weekend transform", get_weekend, ["date"]),
        ("label encoding", OrdinalEncoder(), ["country", "store", "product"]),
    ]
)

pipe = Pipeline([("preprocessing", col_trans), ("regression", LinearRegression())])


pipe.fit(X_train, y_train)

此外,scikit-learnPipeline不仅看起来更干净。它们还有助于创建包含预处理和建模的模型。这对于在生产中部署模型非常有帮助。

于 2022-01-03T06:56:55.280 回答