为什么sklearn.preprocessing.OneHotEncoder如此缓慢?

4
为什么sklearn提供的one-hot编码器速度如此缓慢?
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(sparse=False, handle_unknown='ignore')
categories = np.expand_dims(np.array(list(map(chr, np.arange(97,123)))), axis=1)
enc.fit(categories)
vec = np.expand_dims(list(map(chr, np.random.randint(97,123,1000))), axis=1)
%timeit enc.transform(np.array([['b']]))
%timeit (categories == 'b')[:,0] *1

输出:

569 µs ± 3.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
3.23 µs ± 58.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

相对于朴素的做法,这种方法慢了100倍,但实际上可以通过利用“categories”元素是唯一的知识来加速。


1
我猜这个方法太笼统了。你的方法可能更具体地针对问题,因此更快,因为更通用的方法必须考虑更多可能的情况,使其变慢。此外,解决一般情况通常比解决此一般情况的子集更困难,因此 OneHotEncoder 可能正在解决比您实际需要的问题更难的问题。 - ForceBru
如果我将代码示例复制粘贴到 Python 解释器中,则无法正常工作:缺少“import numpy as np”。你使用的是哪个版本的 Python?以及 Scikit-learn 的哪个版本? - Roman Orac
1
Transform接受一个样本列表。你正在测试一个样本,所以常数时间开销可能会占主导地位。尝试使用1000个或更多的样本再次进行测试,这对于数据集来说更加典型。此外,你应该将numpy数组的构建放在测试之外。 - Jon Nordby
@jonnor,好的观点,但不是。 - Bastiaan
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接