【问题标题】:SciKit-Learn CustomTransformer: TypeError: 'numpy.ndarray' object is not callableSciKit-Learn CustomTransformer:TypeError:'numpy.ndarray'对象不可调用
【发布时间】:2020-02-06 10:52:09
【问题描述】:

我需要创建一个自定义转换器以输入到分级机中。

分级器将字典列表传递给我的估计器的 predict 或 predict_proba 方法,而不是 DataFrame。这意味着模型必须使用这两种数据类型。出于这个原因,我需要提供一个自定义的 ColumnSelectTransformer 来代替 scikit-learn 自己的 ColumnTransformer。

这是我的自定义转换器的代码,旨在删除提供的列中的空值。

simple_cols = ['BEDCERT', 'RESTOT', 'INHOSP', 'CCRC_FACIL', 'SFF', 'CHOW_LAST_12MOS', 'SPRINKLER_STATUS', 'EXP_TOTAL', 'ADJ_TOTAL']

class ColumnSelectTransformer(BaseEstimator, TransformerMixin):
    def __init__(self, columns):
        self.columns = columns

    def fit(self, X, y=None):
        return self

    def transform(self, X):
        if not isinstance(X, pd.DataFrame):
            X = pd.DataFrame(X)
        X.dropna(inplace=True)
        return X[self.columns].values()

simple_features = Pipeline([
    ('cst', ColumnSelectTransformer(simple_cols)),
])

但是,我无法通过以下断言测试

assert data['RESTOT'].isnull().sum() > 0
assert not np.isnan(simple_features.fit_transform(data)).any()

我生成了一个类型错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-44-922f08231b1f> in <module>()
      1 assert not data['RESTOT'].isnull().sum() > 0
----> 2 assert not np.isnan(simple_features.fit_transform(data)).any()

/opt/conda/lib/python3.7/site-packages/sklearn/pipeline.py in fit_transform(self, X, y, **fit_params)
    391                 return Xt
    392             if hasattr(last_step, 'fit_transform'):
--> 393                 return last_step.fit_transform(Xt, y, **fit_params)
    394             else:
    395                 return last_step.fit(Xt, y, **fit_params).transform(Xt)

/opt/conda/lib/python3.7/site-packages/sklearn/base.py in fit_transform(self, X, y, **fit_params)
    551         if y is None:
    552             # fit method of arity 1 (unsupervised transformation)
--> 553             return self.fit(X, **fit_params).transform(X)
    554         else:
    555             # fit method of arity 2 (supervised transformation)

<ipython-input-42-e20ea4310864> in transform(self, X)
     12             X = pd.DataFrame(X)
     13         X.dropna(inplace=True)
---> 14         return X[self.columns].values()
     15 
     16 simple_features = Pipeline([

TypeError: 'numpy.ndarray' object is not callable

如果有人想访问,这里是实际数据。

%%bash
mkdir data
wget http://dataincubator-wqu.s3.amazonaws.com/mldata/providers-train.csv -nc -P ./ml-data
wget http://dataincubator-wqu.s3.amazonaws.com/mldata/providers-metadata.csv -nc -P ./ml-data

data = pd.read_csv('./ml-data/providers-train.csv', encoding='latin1')

【问题讨论】:

    标签: python pandas machine-learning scikit-learn


    【解决方案1】:

    正如日志所指出的,错误在X[self.columns].values() 中。 values 是一个 numpy 数组,因此您不能将其作为方法调用(在其后加上括号)。你应该试试X[self.columns].values。

    【讨论】:

    • 请注意,OP 没有必要的投票特权(15 分)
    猜你喜欢
    • 2019-06-18
    • 2019-08-14
    • 2019-04-07
    • 2019-09-04
    • 2021-06-11
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多