如何在 Scikit-learn 的 OneHotEncoder 中获取维数

How to get number of dimensions in OneHotEncoder in Scikit-learn

我在我的项目中使用来自 Scikit-learn 的 OneHotEncoder。我需要知道当 n_value 设置为 auto 时每个单热向量的大小是多少。我以为 n_value_ 会证明这一点,但似乎除了尝试训练样本外我别无选择。我制作了这个玩具示例代码来显示问题。您知道其他解决方案吗?

from sklearn.preprocessing import OneHotEncoder

data = [[1], [3], [5]] # 3 different features

encoder = OneHotEncoder()
encoder.fit(data)

print(len(encoder.transform([data[0]]).toarray()[0])) # 3 number of dimensions in one-hot-vector
print(encoder.n_values_) # [6] == len(range(5))

这是您要找的吗?

>>> encoder.active_features_
array([1, 3, 5])

>>> len(encoder.active_features_)
3

我认为更好的解决方案是在 n_values 中定义矢量大小。因为与超出范围的特征编号相比,自动选项会产生缺少特征的奇怪行为。再次尝试这个例子,它为缺失的数字生成零向量:

from sklearn.preprocessing import OneHotEncoder

data = [[1], [3], [5]] 

encoder = OneHotEncoder()
encoder.fit(data)

print(encoder.transform([
            [0],
            [1],
            [2],
            [3],
            [4],
            [5]
        ]).toarray()) 

结果如下:

[[ 0.  0.  0.]
 [ 1.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  1.]]

如果我尝试 6它只会抛出错误:

print(encoder.transform([[6]]).toarray()) 

结果:

ValueError: unknown categorical feature present [6] during transform.

正如我之前提到的,最佳实践是从一开始就定义向量的大小:

from sklearn.preprocessing import OneHotEncoder

data = [[1], [3], [5]] 

encoder = OneHotEncoder(n_values=50) # maximum size for my vocabulary, fits for my memory and my future development.
encoder.fit(data)

请记住,在这种情况下,encoder 将不再有任何 active_features_ 属性。