【发布时间】:2020-06-02 00:54:23
【问题描述】:
我有一种情况,我需要在管道中进行一些特定于列的处理,但由于转换器返回 numpy 数组而不是 pandas 数据帧,所以我没有列名来进行特征工程。
这是一个简单的、可重复的示例,其中我有一个名为 engineer_feature 的函数,我想用它来创建新数据。我需要在管道期间/之后使用它,因为它取决于一列被估算,并且我希望它能够在 k 折交叉验证期间执行。
import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import FunctionTransformer, OneHotEncoder, StandardScaler
df = pd.DataFrame({"Type": ["Beta", "Beta", "Alpha", "Charlie", "Beta", "Charlie"], "A": [1, 2, 3, np.nan, 22, 4], "B": [5, 7, 12, 21, 12, 10]})
def engineer_feature(df):
df["C"] = df["A"] / df["B"]
return df
categorical_transformer = Pipeline([
("one_hot", OneHotEncoder())
])
numeric_transformer = Pipeline([
("imputer", SimpleImputer()),
("engineer", FunctionTransformer(engineer_feature)),
("scaler", StandardScaler())
])
preprocessor = ColumnTransformer([
("categorical", categorical_transformer, ["Type"]),
("numeric", numeric_transformer, ["A", "B"])
])
preprocessor.fit_transform(df)
产生此错误:
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
这是有道理的,因为 engineer_feature 试图索引列,就好像它们只是 numpy 数组时的数据帧一样。
解决此问题的策略是什么?我不想硬编码列索引以通过 numpy 访问它们,特别是因为我的真实数据框有更多列。
【问题讨论】:
-
我不确定我是否理解。查看文档,似乎我传递给
OneHotEncoder()与给出的示例没有任何不同。你能具体说明我做错了什么吗?无论如何,在我的示例中,OneHotEncoder()可以正常工作并按照我期望的方式转换我的数据。 Here是我指的官方例子。
标签: python pandas numpy scikit-learn