在 OneHotEncoder 之后取消转换

Posted

技术标签:

【中文标题】在 OneHotEncoder 之后取消转换【英文标题】:Untransform after OneHotEncoder 【发布时间】:2016-10-08 04:33:22 【问题描述】:

我正在使用 sklearn 的 OneHotEncoder,但想取消转换我的数据。知道怎么做吗?

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9])
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

但我希望能够做到以下几点:

>>> enc.untransform(array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]]))
[[0, 1, 1]]

我该怎么做呢?

对于上下文,我已经构建了一个学习 one-hot 编码空间的神经网络,现在想使用 nn 进行需要采用原始数据格式的真实预测。

【问题讨论】:

我注意到 sklearn.feature_extraction.DictVectorizer 有一个 inverse_transform 方法。 刚刚找到这个答案,很详细,但它可以帮助你***.com/questions/22548731/… 【参考方案1】:

用于反转单个热编码项 见:https://***.com/a/39686443/7671913

from sklearn.preprocessing import OneHotEncoder
import numpy as np

orig = np.array([6, 9, 8, 2, 5, 4, 5, 3, 3, 6])

ohe = OneHotEncoder()
encoded = ohe.fit_transform(orig.reshape(-1, 1)) # input needs to be column-wise

decoded = encoded.dot(ohe.active_features_).astype(int)
assert np.allclose(orig, decoded)

有关反转一个热编码项目的数组,请参阅(如 cmets 中所述) 看: How to reverse sklearn.OneHotEncoder transform to recover original data?

给定名为ohc的sklearn.OneHotEncoder实例,调用ohc.fit_transform或ohc.transform输出的编码数据(scipy.sparse.csr_matrix),以及原始数据的形状(n_samples,n_feature),恢复原始数据 X 与:

recovered_X = np.array([ohc.active_features_[col] for col in out.sorted_indices().indices])
            .reshape(n_samples, n_features) - ohc.feature_indices_[:-1]

【讨论】:

自 scikit-learn 0.20 版起,OneHotEncoder 类的active_features_ 属性已被弃用。

以上是关于在 OneHotEncoder 之后取消转换的主要内容,如果未能解决你的问题,请参考以下文章

机器学习入门-数据预处理-数字映射和one-hot编码 1.LabelEncoder(进行数据自编码) 2.map(进行字典的数字编码映射) 3.OnehotEncoder(进行one-hot编码)

Python SKLearn:如何在 OneHotEncoder 之后获取特征名称?

One Hot Encoding:ValueError:无法将字符串转换为float:'是'

Python sklearn OneHotEncoder:如何跳过列表中不存在的值

特征抽取--标签与索引的转化: OneHotEncoder

one-hot 编码的生成与撤销