Python sklearn OneHotEncoder:如何跳过列表中不存在的值
Posted
技术标签:
【中文标题】Python sklearn OneHotEncoder:如何跳过列表中不存在的值【英文标题】:Python sklearn OneHotEncoder: how to skip values that do not exist in the list 【发布时间】:2020-05-26 00:08:51 【问题描述】:我想对这个列表进行一次热编码:
[0 0 1 1 1 2 2 2 4]
当我这样做时,one-hot 编码器将我的 4 转换为 3。也就是说,我得到了这个:
(0, 0) 1.0
(1, 0) 1.0
(2, 0) 1.0
(3, 1) 1.0
(4, 1) 1.0
(5, 1) 1.0
(6, 2) 1.0
(7, 2) 1.0
(8, 2) 1.0
(9, 3) 1.0
我想要这个(注意最后一行已更改):
(0, 0) 1.0
(1, 0) 1.0
(2, 0) 1.0
(3, 1) 1.0
(4, 1) 1.0
(5, 1) 1.0
(6, 2) 1.0
(7, 2) 1.0
(8, 2) 1.0
(9, 4) 1.0
完成 MWE:
import numpy as np
from sklearn.preprocessing import OneHotEncoder
idvals = [0, 0, 0, 1, 1, 1, 2, 2, 2, 4]
hot = OneHotEncoder()
h1 = hot.fit_transform(np.asarray(idvals).reshape(10, 1))
print(np.asarray(h1))
使用 Python 2.7.14 |Anaconda 自定义(64 位)| (默认,2017 年 12 月 7 日,17:05:42)
我怎样才能让最后一行是 (9, 4) 而不是 (9, 3)?
【问题讨论】:
【参考方案1】:您可以生成感兴趣的 ndarray,将 vals
与一个直到 max
值的范围进行比较,并使用 broadcasting
从结果中获取矩阵:
vals = np.asarray(idvals)
u = np.unique(vals)
vals_b = vals[:,None]
a = (np.arange(max(u)+1) == vals_b).view('i1')
print(a)
array([[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 1]], dtype=int8)
如果我们从数组中构建一个稀疏矩阵,我们确实会得到指定的结果:
from scipy import sparse
print(sparse.csr_matrix(a))
(0, 0) 1
(1, 0) 1
(2, 0) 1
(3, 1) 1
(4, 1) 1
(5, 1) 1
(6, 2) 1
(7, 2) 1
(8, 2) 1
(9, 4) 1
【讨论】:
感谢您的回复,但我想这样做的原因是因为值 3 稍后可以存在于不同的列表中,我也希望对其进行一次热编码,这样两种编码一旦转换为 numpy 数组,将具有相同的形状。因此,两种编码在转换时都应该具有形状 (10, 5)。 这似乎不是一个正确的方法。如果您正在使用列表,我会查看 pandas 和get_dummies
@stats
谢谢@yatu,我查看了这里的页面:pandas.pydata.org/pandas-docs/stable/reference/api/…,它似乎仍然只编码“它所看到的”,而不是“它可以看到的,它可以从现有数据中合理推断” "。
实际上做了一些不必要的事情,现在检查@StatsSorceress
抱歉,因为我不知道 i1 是什么,所以还是不行?以上是关于Python sklearn OneHotEncoder:如何跳过列表中不存在的值的主要内容,如果未能解决你的问题,请参考以下文章