【问题标题】:SciKitlearn ColumnTransformer TypeError: Cannot clone object. You should provide an instance of scikit-learn estimator instead of a classSciKit 学习 ColumnTransformer TypeError:无法克隆对象。您应该提供一个 scikit-learn 估计器的实例而不是一个类
【发布时间】:2020-10-01 10:38:49
【问题描述】:

尝试使用看起来有点像这样的东西:

  CATEGORY | NUMBER VALUE  | ID

   FRUIT   |      15       |  XCD

  VEGGIES  |      12       |  ZYK



from sklearn.preprocessing import LabelEncoder, OneHotEncoder
data = data.iloc[:,:].values
enc = LabelEncoder()
data[:,0]=enc .fit_transform(data[:,0])
data

输出:

array([[1, 15, 'XCD'],
       [2, 12, 'ZYK']])

那么……

from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[('encode',OneHotEncoder,[0])],remainder='passthrough')
dataset = np.array(ct.fit_transform(data))

给予

TypeError: Cannot clone object. You should provide an instance of scikit-learn estimator instead of a class.

【问题讨论】:

    标签: python pandas numpy machine-learning scikit-learn


    【解决方案1】:

    我相信我解决了这个问题。 TypeError 非常不言自明,我很惭愧在发布我的问题之前没有认识到这一点。本质上,我只需要创建一个 OneHotEncoder 类的实例。如下代码所示添加一行解决了我的情况。谢谢!

    from sklearn.preprocessing import LabelEncoder, OneHotEncoder
    from sklearn.compose import ColumnTransformer
    oHe = OneHotEncoder()
    ct = ColumnTransformer(transformers=[('encode',oHe,[0])],remainder='passthrough')
    dataset = np.array(ct.fit_transform(data))
    

    【讨论】:

    • 它节省了我很多时间,有时即使是简单的错误也需要书面解决方案。非常感谢您记下它。
    • 你必须传递一个transformer/estimator的对象:传递OneHotEncoder()而不是OneHotEncoder -> ct = ColumnTransformer(transformers=[('encode',OneHotEncoder(),[0])],remainder='passthrough')
    【解决方案2】:

    我在将RandomizedSearchCV 安装到xgboost 时遇到了类似的问题。就像上面说的,我也为没有发现这个简单的错误而感到羞耻。我输入了

    regressor = xgboost.XGBRegressor 
    

    而不是

    regressor = xgboost.XGBRegressor(). 
    

    阅读这里之后,我花了一些时间来识别这个错误并且它工作正常。

    【讨论】:

      【解决方案3】:

      执行这些步骤后:

      from sklearn.preprocessing import LabelEncoder, OneHotEncoder
      data = data.iloc[:,:].values
      enc = LabelEncoder()
      data[:,0]=enc .fit_transform(data[:,0])
      data
      

      输出:

      array([[1, 15, 'XCD'],
         [2, 12, 'ZYK']])
      

      然后使用这些命令而不是使用你在那里使用的命令:

      from sklearn.compose import ColumnTransformer
      
      ct = ColumnTransformer(
      transformers=[('encode',OneHotEncoder(categories='auto'),[0])],
      remainder='passthrough')
      
      dataset = np.array(ct.fit_transform(data))
      dataset
      

      那么你的代码就不会报错了

      输出

      array([['1.0', '0.0', '15', 'XCD'],
         ['0.0', '1.0', '12', 'ZYK']], dtype='<U32')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-04
        • 1970-01-01
        • 2016-02-08
        • 2020-10-07
        • 2015-05-06
        • 1970-01-01
        • 2014-07-13
        • 2019-01-15
        相关资源
        最近更新 更多