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 估计器的实例而不是一个类的主要内容,如果未能解决你的问题,请参考以下文章