ValueError:形状不匹配:如果类别是一个数组,它必须是形状(n_features,)

Posted

技术标签:

【中文标题】ValueError:形状不匹配:如果类别是一个数组,它必须是形状(n_features,)【英文标题】:ValueError: Shape mismatch: if categories is an array, it has to be of shape (n_features,) 【发布时间】:2020-04-18 21:50:46 【问题描述】:

我创建了一个简单的代码来实现OneHotEncoder

from sklearn.preprocessing import OneHotEncoder
X = [[0, 'a'], [0, 'b'], [1, 'a'], [2, 'b']]
onehotencoder = OneHotEncoder(categories=[0])
X = onehotencoder.fit_transform(X).toarray()

我只想将名为fit_transform 的方法用于索引0X,所以它意味着[0, 0, 1, 2],就像您在X 中看到的一样。但它会导致这样的错误:

ValueError: Shape mismatch: if categories is an array, it has to be of shape (n_features,).

谁能解决这个问题?我被卡住了

【问题讨论】:

【参考方案1】:

您需要使用ColumnTransformer 指定列索引而不是categories 参数。

构造函数参数categories 是明确告诉不同的类别值。例如。您可以明确提供[0, 1, 2],但auto 将确定它。此外,您可以改用slice() 对象。

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

X = [[0, 'a'], [0, 'b'], [1, 'a'], [2, 'b']]

ct = ColumnTransformer(
    [('one_hot_encoder', OneHotEncoder(categories='auto'), [0])],   # The column numbers to be transformed (here is [0] but can be [0, 1, 3])
    remainder='passthrough'                                         # Leave the rest of the columns untouched
)

X = ct.fit_transform(X)

【讨论】:

【参考方案2】:

pandas.get_dummies() 方法也可以按以下方式进行:

import numpy as np
import pandas as pd
X = np.array([[0, 'a'], [0, 'b'], [1, 'a'], [2, 'b']])
X = np.array(pd.concat([pd.get_dummies(X[:, 0]), pd.DataFrame(X[:, 1])], axis = 1))

【讨论】:

以上是关于ValueError:形状不匹配:如果类别是一个数组,它必须是形状(n_features,)的主要内容,如果未能解决你的问题,请参考以下文章

Python ValueError:形状不匹配:无法将对象广播到单个形状

SVR ValueError:形状为 (1,1) 的不可广播输出操作数与广播形状 (1,9) 不匹配

Scikit Learn OneHotEncoder 拟合和变换错误:ValueError:X 的形状与拟合期间不同

形状不匹配:无法将对象广播到单个形状如何解决python中的此类错误?

尝试绘制堆积条形图时收到形状不匹配错误消息

TensorFlow:ValueError:形状不兼容