SciKit 学习 ColumnTransformer TypeError:无法克隆对象。您应该提供一个 scikit-learn 估计器的实例而不是一个类

Posted

技术标签:

【中文标题】SciKit 学习 ColumnTransformer TypeError:无法克隆对象。您应该提供一个 scikit-learn 估计器的实例而不是一个类【英文标题】:SciKitlearn ColumnTransformer TypeError: Cannot clone object. You should provide an instance of scikit-learn estimator instead of a class 【发布时间】: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.

【问题讨论】:

【参考方案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')

【讨论】:

以上是关于SciKit 学习 ColumnTransformer TypeError:无法克隆对象。您应该提供一个 scikit-learn 估计器的实例而不是一个类的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn学习基础知识四

[机器学习与scikit-learn-4]:scikit-learn机器学习的一般流程与案例演示

用scikit-learn学习LDA主题模型

scikit-learn学习基础知识三

scikit-learn学习基础知识一

scikit-learn学习基础知识二