我试图用简单的字典比较LabelBinarizersklearn的性能:

from sklearn.preprocessing import LabelBinarizer
import time

sample_list = list('abcdefg')
lb = LabelBinarizer()
lb.fit(dep_tag_list)
lb_t = lb.transform(sample_list)
sample_dict = {key:value for (key,value) in zip(sample_list, lb_t)}


这段代码运行:--- 2.9169740676879883秒-

start_time = time.time()
result = lb.transform(sample_list*1000000)
print("--- %s seconds ---" % (time.time() - start_time))


这段代码运行了--0.6299951076507568秒-

start_time = time.time()
result = [sample_dict[el] for el in sample_list*1000000]
print("--- %s seconds ---" % (time.time() - start_time))


我在比较苹果吗?为什么LableBinarizer这么慢?

最佳答案

LabelBinarizer是label_binarize的包装。并且也可以在内部在其他一些scikit实用程序中使用。因此,需要注意传递给它的数据是否适当。

为此,它对传递的数据执行多次检查。请查看transform() function here的源代码:

y_is_multilabel = type_of_target(y).startswith('multilabel')
if y_is_multilabel and not self.y_type_.startswith('multilabel'):
    raise ValueError("The object was not fitted with multilabel"
                     " input.")

return label_binarize(y, self.classes_,
                      pos_label=self.pos_label,
                      neg_label=self.neg_label,
                      sparse_output=self.sparse_output)


因此,您会看到它检查传递的y是否适合scikit算法可以处理的类型。之后,数据将传递到其source code islabel_binarize,后者将对其执行其他附加检查。我认为这是其缓慢的原因。

08-26 18:05