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

使用sklearn FunctionTransformer时遇DataFrame dtype属性错误求助

问题:FunctionTransformer触发AttributeError错误

运行以下代码时触发AttributeError:

transformer = preprocessing.FunctionTransformer(func=np.log1p, inverse_func=np.expm1)
scaler = preprocessing.StandardScaler()
X1_t = transformer.fit_transform(X_t)

错误信息如下:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In [103], line 3
      1 transformer = preprocessing.FunctionTransformer(func=np.log1p, inverse_func=np.expm1)
      2 scaler = preprocessing.StandardScaler()
----> 3 X1_t = transformer.fit_transform(X_t)
      4 X2_t = scaler.fit_transform(X1_t)
      5 print(X2_t.shape)

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/sklearn/base.py:867, in TransformerMixin.fit_transform(self, X, y, **fit_params)
    863 # non-optimized default implementation; override when a better
    864 # method is possible for a given clustering algorithm
    865 if y is None:
    866     # fit method of arity 1 (unsupervised transformation)
---> 867     return self.fit(X, **fit_params).transform(X)
    868 else:
    869     # fit method of arity 2 (supervised transformation)
    870     return self.fit(X, y, **fit_params).transform(X)

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/sklearn/preprocessing/_function_transformer.py:195, in FunctionTransformer.fit(self, X, y)
    193 X = self._check_input(X, reset=True)
    194 if self.check_inverse and not (self.func is None or self.inverse_func is None):
---> 195     self._check_inverse_transform(X)
    196 return self

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/sklearn/preprocessing/_function_transformer.py:160, in FunctionTransformer._check_inverse_transform(self, X)
    157 idx_selected = slice(None, None, max(1, X.shape[0] // 100))
    158 X_round_trip = self.inverse_transform(self.transform(X[idx_selected]))
---> 160 if not np.issubdtype(X.dtype, np.number):
    161     raise ValueError(
    162         "'check_inverse' is only supported when all the elements in `X` is numerical."
    163     )
    166 if not _allclose_dense_sparse(X[idx_selected], X_round_trip):

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/generic.py:5575, in NDFrame.__getattr__(self, name)
   5568 if (
   5569     name not in self._internal_names_set
   5570     and name not in self._metadata
   5571     and name not in self._accessors
   5572     and self._info_axis._can_hold_identifiers_and_holds_name(name)
   5573 ):
   5574     return self[name]
-> 5575 return object.__getattribute__(self, name)

AttributeError: 'DataFrame' object has no attribute 'dtype'

代码此前可正常运行,重装Jupyter Notebook及相关库后出现此问题,怀疑与Jupyter、pandas、sklearn的版本组合有关。


解决思路
  • 关闭逆变换检查:初始化FunctionTransformer时添加check_inverse=False参数,跳过逆变换验证步骤,避免代码直接访问DataFrame没有的dtype属性:

    transformer = preprocessing.FunctionTransformer(func=np.log1p, inverse_func=np.expm1, check_inverse=False)
    
  • 转换为numpy数组输入:将DataFrame格式的X_t转为numpy数组后传入方法,确保sklearn处理的是兼容的数据类型:

    X1_t = transformer.fit_transform(X_t.to_numpy())
    
  • 调整库版本:检查当前scikit-learn和pandas版本,回退到之前能正常运行的版本组合,或升级到最新稳定版修复兼容性问题。查看版本命令:

    pip show scikit-learn pandas
    

内容的提问来源于stack exchange,提问作者Fideiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:15:52