我对机器学习完全陌生,并且一直在使用无监督学习技术。
图像显示了我的示例数据(全部清洁后)屏幕截图: Sample Data
我构建了这两条管道来清理数据:
num_attribs = list(housing_num)
cat_attribs = ["ocean_proximity"]
print(type(num_attribs))
num_pipeline = Pipeline([
('selector', DataFrameSelector(num_attribs)),
('imputer', Imputer(strategy="median")),
('attribs_adder', CombinedAttributesAdder()),
('std_scaler', StandardScaler()),
])
cat_pipeline = Pipeline([
('selector', DataFrameSelector(cat_attribs)),
('label_binarizer', LabelBinarizer())
])
然后我将这两个管道合并起来,其代码如下所示:
from sklearn.pipeline import FeatureUnion
full_pipeline = FeatureUnion(transformer_list=[
("num_pipeline", num_pipeline),
("cat_pipeline", cat_pipeline),
])
现在我正在尝试对 Data 进行 fit_transform但它向我展示了错误。
转换代码:
housing_prepared = full_pipeline.fit_transform(housing)
housing_prepared
错误消息:
fit_transform() takes 2 positional arguments but 3 were given
最佳答案
问题:
管道假设 LabelBinarizer 的 fit_transform
方法定义为采用三个位置参数:
def fit_transform(self, x, y)
...rest of the code
虽然它被定义为只需要两个:
def fit_transform(self, x):
...rest of the code
可能的解决方案:
这可以通过制作一个可以处理 3 个位置参数的自定义转换器来解决:
导入并创建一个新类:
from sklearn.base import TransformerMixin #gives fit_transform method for free class MyLabelBinarizer(TransformerMixin): def __init__(self, *args, **kwargs): self.encoder = LabelBinarizer(*args, **kwargs) def fit(self, x, y=0): self.encoder.fit(x) return self def transform(self, x, y=0): return self.encoder.transform(x)
仅保持代码相同,而不是使用 LabelBinarizer(),而是使用我们创建的类:MyLabelBinarizer()。
fit
方法中:
self.classes_, self.y_type_, self.sparse_input_ = self.encoder.classes_, self.encoder.y_type_, self.encoder.sparse_input_
关于python - fit_transform() 需要 2 个位置参数,但 3 个是通过 LabelBinarizer 给出的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162855/