使用sklearn.TargetEncoder处理价格预测时遇类型错误及维度问题求助
问题解决:TargetEncoder编码时的目标类型错误及维度不匹配问题
问题背景
我手头有一个包含21列的产品数据集,其中manufacturer是包含30+类别的分类特征,目标变量是连续型的price(价格)。因为用OneHotEncoding会触发维度诅咒,所以选择用TargetEncoder对该特征编码,但运行代码时遇到了一系列错误:
原代码片段
f = data['manufacturer'].to_numpy().reshape(-1, 1) g = data['price'].to_list() enc_auto = TargetEncoder(smooth="auto") f_trans = enc_auto.fit_transform(f, g)
首次报错
ValueError: Target type was inferred to be 'multiclass'. Only ('binary', 'continuous') are supported.
后续尝试操作引发的错误:
- 转置特征替代reshape:
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
- 使用
reshape(1, -1):
ValueError: Found input variables with inconsistent numbers of samples: [1, 675413]
- 分开执行fit和transform,仍出现类似错误。
错误原因及解决办法
1. 目标变量类型识别错误(核心问题)
报错里说目标被识别成了多分类类型,但price是连续数值,问题出在你把目标变量转成了列表(to_list()),TargetEncoder无法正确识别这种格式的连续型数据。
解决:直接传入Pandas Series或Numpy数组格式的目标变量,不要转成列表。
2. 特征维度处理错误
manufacturer是单特征,用reshape(-1,1)是完全正确的操作——它把一维数组转成了(n_samples, 1)的二维格式,符合编码器对输入特征的要求。转置或者用reshape(1,-1)会把特征变成(1, n_samples)的形状,相当于1个样本对应675413个特征,和目标变量的675413个样本完全不匹配,必然报错。
修正后的完整代码
# 特征处理保持正确的reshape方式 f = data['manufacturer'].to_numpy().reshape(-1, 1) # 直接传入原Series或转为numpy数组,不转列表 g = data['price'] # 或者 g = data['price'].to_numpy() enc_auto = TargetEncoder(smooth="auto") f_trans = enc_auto.fit_transform(f, g)
额外检查项
- 确认
price列的数据类型是数值型(int或float),如果是字符串格式,先做类型转换:data['price'] = pd.to_numeric(data['price'], errors='coerce') # 记得处理转换后产生的缺失值,比如用中位数填充 data['price'] = data['price'].fillna(data['price'].median()) - 如果你用的是
category_encoders库的TargetEncoder,建议更新到最新版本,旧版本对目标类型的判断逻辑可能存在问题。
内容的提问来源于stack exchange,提问作者Nouri Muhammad
相关产品推荐
相关产品推荐

