我正在尝试创建一个基于scikit-learn的管道来通过熊猫数据帧进行管道传输。在每个阶段,仅应触摸部分功能,其余应通过未修改的功能。我之所以使用IBEX,是因为为了完整起见,DataFrameMapper似乎没有为我做这件事,因为未保留未修改的字段,出于完整性考虑,这里是DataFrameMapper代码(这对我不起作用,但可能对其他人无效) :

from sklearn_pandas import DataFrameMapper
from sklearn.preprocessing import StandardScaler


mapper = DataFrameMapper([
    (['x','y','z'], StandardScaler())
])

df_scaled = mapper.fit_transform(df)


数据框具有以下字段


  x y z源类


使用IBEX,我运行以下代码:

from ibex.sklearn.preprocessing import StandardScaler
from ibex.sklearn.preprocessing import LabelEncoder
from ibex import trans

pipeline = (trans(LabelEncoder(), in_cols=['class']) + trans(None, ['source', 'x','y','z'])) | (trans(StandardScaler(), in_cols=['x','y','z']) + trans(None, ['source', 'class']))
df_scaled = pipeline.fit_transform(df)


现在,我收到以下错误,因为似乎字段未保留在第二个管道阶段中:


  KeyError:“ ['x''y''z']不在索引中”


参见完整错误的GIST

最佳答案

我共同编写的ibex广泛使用了熊猫的多级索引。

假设我们从

import pandas as pd

df = pd.DataFrame({'source': [2, 44], 'class': [0, 1], 'x': [0, 5], 'y': [0, 6], 'z': [0, 8], 'w': 10})
>>> df
    class   source  w   x   y   z
0   0   2   10  0   0   0
1   1   44  10  5   6


然后管道的开始

>>> (trans(LabelEncoder(), in_cols=['class']) + trans(None, ['source', 'x','y','z'])).fit_transform(df)
    functiontransformer_0   functiontransformer_1
    0                       source  x   y   z
0   0                       2       0   0   0
1   1                       44      5   6   8


这是设计使然。

您可以通过以下方式编写管道来实现所需的目标:

p = (trans(LabelEncoder(), in_cols='class') +
    trans(StandardScaler(), in_cols=['x', 'y', 'z']) +
    trans(None, in_cols='source')
)
>>> p.fit_transform(df)
    functiontransformer_0   functiontransformer_1   functiontransformer_2
    0                       x        y         z    source
0   0                       -1.0    -1.0    -1.0    2
1   1                       1.0     1.0     1.0     44

08-19 21:46