为sk-learn编写我的第一个管道我只发现了一些问题,只有一部分列被放入管道:
functionTransformer
我使用def extractSpecificColumn(X, columns):
return X[columns]
pipeline = Pipeline([
('features', FeatureUnion([
('continuous', Pipeline([
('numeric', FunctionTransformer(columnsNumber)),
('scale', StandardScaler())
]))
], n_jobs=1)),
('estimator', RandomForestClassifier(n_estimators=50, criterion='entropy', n_jobs=-1))
])
cv.cross_val_score(pipeline, XoneColumn, y, cv=folds, scoring=kappaScore)
之类的:
TypeError: 'list' object is not callable
当启用函数转换器时,结果为:ColumnExtractor
。
如果我在下面实例化functionTransformer
,则不会返回错误。但class ColumnExtractor(TransformerMixin):
def __init__(self, columns):
self.columns = columns
def transform(self, X, *_):
return X[self.columns]
def fit(self, *_):
return self
是不是仅仅意味着像这样的简单案例而应该起作用?
{{1}}
答案 0 :(得分:3)
FunctionTransformer
用于将函数“提升”到转换,我认为这可以帮助完成一些数据清理步骤。想象一下,你有一个主要是数字的数组,你想用变换器转换它,如果它得到nan
(如Normalize
)则会出错。你可能会得到像
df.fillna(0, inplace=True)
...
cross_val_score(pipeline, ...)
但也许你fillna
仅在一次转化时才需要,所以不要像上面那样fillna
,而是
normalize = make_pipeline(
FunctionTransformer(np.nan_to_num, validate=False),
Normalize()
)
最终会根据需要对其进行标准化。然后,您可以在更多地方使用该代码段而不会使用.fillna(0)
在您的示例中,您传递的['numeric1']
是list
,而不是类似于类似df[['numeric1']]
的提取器。您可能想要的更像是
FunctionTransformer(operator.itemgetter(columns))
但仍然无法正常工作,因为最终传递到FunctionTransformer的对象将是np.array
而不是DataFrame
。
为了对DataFrame
的特定列进行操作,您可能希望使用像sklearn-pandas这样的库,它允许您按列定义特定的变换器。