自定义sklearn转换器报错:'function'对象无'transform'属性
问题原因与修正方案
错误根源
- 构造函数命名错误:Python类的初始化方法必须用双下划线
__init__,你写的_init_(单下划线)不会被Python识别为构造函数,导致类实例化时self.skew_cols未被正确初始化,后续逻辑触发异常。 - 方法调用错误:
skew_obj.fit.transform(x.train)是错误写法,fit是类的方法,需要先调用fit(x.train)得到实例后再调用transform;或者直接用fit_transform(TransformerMixin提供的默认组合方法)。 - 缺失依赖导入:代码中使用了
np.log但未导入numpy库,会触发未定义错误。 - 修改原数据风险:transform方法直接修改输入的x,会导致原数据集被篡改,建议先复制数据再操作。
修正后的完整代码
import numpy as np from sklearn.base import BaseEstimator, TransformerMixin class skew_transformed(BaseEstimator, TransformerMixin): # 修正构造函数的双下划线 def __init__(self, skew_cols): self.skew_cols = skew_cols def fit(self, x, y=None): return self def transform(self, x): # 复制数据避免修改原数据集 x_transformed = x.copy() x_transformed[self.skew_cols] = np.log(x_transformed[self.skew_cols] + 1) return x_transformed # 实例化时传入需要处理的偏态列名列表 skew_obj = skew_transformed(skew_cols=["col1", "col2"]) # 替换成你的实际列名 # 正确调用方式:直接用fit_transform组合方法 transformed_data = skew_obj.fit_transform(x.train)
关键修正点拆解
- 把
_init_改成__init__,确保类初始化逻辑生效,实例化时必须传入skew_cols参数(指定要处理的列)。 - 调用方式改为
skew_obj.fit_transform(x.train),或者分步调用skew_obj.fit(x.train).transform(x.train)。 - 添加
import numpy as np,解决np未定义的问题。 - 在transform中复制输入数据,防止原数据集被意外修改。
内容的提问来源于stack exchange,提问作者tina
相关产品推荐
相关产品推荐

