【发布时间】:2021-09-26 13:21:12
【问题描述】:
我在使用 sklearn 的 RegressorChain (https://scikit-learn.org/stable/modules/generated/sklearn.multioutput.RegressorChain.html) 时遇到问题,不幸的是,似乎没有很多关于此的文档/示例。
文档间接说明(通过set_params 方法)它可以与管道一起使用。我的管道有:
ct = ColumnTransformer(
transformers=[
('scaler', MinMaxScaler(), numerical_columns),
('onehot', OneHotEncoder(), ['day_of_week']),
],
remainder='passthrough'
)
cv = TimeSeriesSplit(n_splits = groups.nunique()) #groups by date
pipeline = make_pipeline(ct, lgb.LGBMRegressor(random_state=42))
target_transform_output = TransformedTargetRegressor(regressor=pipeline, transformer=PowerTransformer())
然后我做:
chain_regressor = RegressorChain(base_estimator=target_transform_output , order=[1,0,2])
chain_regressor.fit(X, y)
上面X和y都是pandas Dataframe,y有3个目标列。
当我运行代码时,我得到一个由fit() 调用引起的python 堆栈跟踪,在执行all_columns = X.columns 时从__init.py__ 开始在_get_column_indices(X, key) 中。错误是:
AttributeError: 'numpy.ndarray' object has no attribute 'columns'
在堆栈跟踪的末尾进一步向下:
ValueError: Specifying the columns using strings is only supported for pandas DataFrames
我认为这是因为 ColumnTransformer 返回 ndarrays,这是一个众所周知的问题。这是否意味着RegressorChain 不能与ColumnTransformer 一起使用?
在此之后,我从管道中删除了列转换器步骤并再次尝试,没有 ColumnTransformer 一切正常(即使是 TransformedTargetRegressor)。
感谢任何帮助、想法或解决方法。
【问题讨论】:
-
为什么不把你的 numpy 数组转换成 pandas 数据帧?
-
嗨@wundermahn。正如我上面所说:“X 和 y 都是 pandas 数据帧,并且 y 有 3 个目标列。”我没有在我的代码中的任何地方使用 ndarrays。
-
那么你是如何得到一个 numpy 数组的错误的呢?正如你上面所说,当我运行代码时,我得到一个由 fit() 引起的 python 堆栈跟踪...,
AttributeError: 'numpy.ndarray' object has no attribute 'columns' -
ColumnTransformer 输出 ndarrays,即使你给它 Pandas Dataframes。 sklearn 的众所周知的问题,自 2015 年以来报告。我想了解的是是否有任何解决方法(或发现我正在犯的错误),以便它们可以与 RegressorChain 一起使用。检查:github.com/scikit-learn/scikit-learn/issues/5523,例如。
-
正是我在第一条评论中所说的。为什么不将 ColumnTransformer 的输出存储到数据框中?
标签: pandas scikit-learn