You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义sklearn转换器报错:'function'对象无'transform'属性

问题原因与修正方案

错误根源

  1. 构造函数命名错误:Python类的初始化方法必须用双下划线__init__,你写的_init_(单下划线)不会被Python识别为构造函数,导致类实例化时self.skew_cols未被正确初始化,后续逻辑触发异常。
  2. 方法调用错误:skew_obj.fit.transform(x.train)是错误写法,fit是类的方法,需要先调用fit(x.train)得到实例后再调用transform;或者直接用fit_transform(TransformerMixin提供的默认组合方法)。
  3. 缺失依赖导入:代码中使用了np.log但未导入numpy库,会触发未定义错误。
  4. 修改原数据风险: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:33:23