我正在尝试创建一个基于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