sklearn管道中特定于列的处理

彼得·特兰

我遇到的情况是我需要在管道中执行某些列特定的处理,但是由于转换器返回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访问它们,特别是因为我的实际数据框具有更多列。

彼得·特兰

感谢尼克和谢尔盖(Nick and Sergey)的讨论和回答(特别是我确实知道要传入数据框的哪些列engineer_feature),因此我想出了一个我可以接受的解决方案;但是,如果有人有更好的主意,请发出提示。

import numpy as np
import pandas as pd

from functools import partial
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(columns, X):
    df = pd.DataFrame(X, columns=columns)
    df["C"] = df["A"] / df["B"]
    return df

categorical_transformer = Pipeline([
    ("one_hot", OneHotEncoder())
])

def numeric_transformer(columns):
    transformer = Pipeline([
        ("imputer", SimpleImputer()),
        ("engineer", FunctionTransformer(partial(engineer_feature, columns))),
        ("scaler", StandardScaler())
    ])

    return ("numeric", transformer, columns)

preprocessor = ColumnTransformer([
    ("categorical", categorical_transformer, ["Type"]),
    numeric_transformer(["A", "B"])
])

preprocessor.fit_transform(df)

这取决于两个列,A并且B每个值至少具有一个值,这样SimpleImputer就不会丢失该列,这毫无价值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在sklearn管道中合并的多个管道?

如何在Ruby on Rails和MySQL中具有特定于列的字符编码?

Angular中特定于模块的错误处理

定位dplyr管道中的特定列

管道中CountVectorizer的Sklearn NotFittedError

返回特定于每列的多个表

书本中特定于HTML的部分

从列中获取特定于“ NA”值的预测

结合Sklearn管道中的功能

PyTorch中特定于参数的学习率

Flutter中特定于Web的资源

Felix Configurator中特定于环境的配置

pyparsing中的Group()是否需要后处理步骤来生成特定于要解析的语言的结构

将多个预处理步骤应用于sklearn管道中的列

如何从多个表中检索特定于用户会话ID的列?

Windows窗体中数字键盘十进制键的特定于文化的处理

处理特定于XML的数据

正确处理特定的HTTP答案(特定于OOP)

jqGrid列的顺序应特定于用户

列中的Bootstrap3工具提示的z-index特定于浏览器

从管道分隔文件中获取特定的列和特定的行

使用特定于函数调用的文件处理在C ++中创建多个文件

在SoapUi中,如何从json响应中提取特定于列的数据?

将同一行中特定于行的列索引值左侧的行值替换

在 Spring Intehration 中读取 Aws Kinesis Streams 时处理全局和特定于通道的错误

如何创建新列并添加特定于 R Studio 中每一行的文本?

传递 sklearn 管道中的所有列

在特定列的管道中使用 sklearn `KBinsDiscretizer` 並返回數據框

Sklearn 管道转换特定列 - ValueError:要解包的值太多(预期为 2)