我认为M0rkHaV有正确的想法。 Scikit-learn的管道类是一个有用的工具,用于将多个不同的转换器与一个估计器一起封装到一个对象中,因此您只需要调用一次重要的方法( fit()
, predict()
等)。让我们分解两个主要部分:
变形器是同时实现
fit()
和transform()
。你可能会熟悉一些sklearn预处理工具,像TfidfVectorizer
和Binarizer
。如果查看这些预处理工具的文档,就会发现它们实现了这两种方法。我觉得很酷的是,一些估算器也可以用作转换步骤,例如LinearSVC
!估计器是同时实现
fit()
和predict()
。您会发现许多分类器和回归模型都实现了这两种方法,因此您可以轻松地测试许多不同的模型。可以使用另一个转换器作为最终估计器(即,它不一定实现predict()
,但肯定实现fit()
)。所有这些意味着您将无法调用predict()
。
至于您的编辑:让我们来看一个基于文本的示例。使用LabelBinarizer,我们希望将标签列表转换为二进制值列表。
bin = LabelBinarizer() #first we initialize
vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized
现在,当二进制化器适合某些数据时,它将具有一个名为classes_
的结构,其中包含转换器“知道”的唯一类。如果不调用fit()
,二进制化器将不知道数据是什么样的,因此调用transform()
将毫无意义。如果在尝试拟合数据之前打印出类的列表,则为true。
print bin.classes_
尝试此操作时出现以下错误:
AttributeError: 'LabelBinarizer' object has no attribute 'classes_'
但是,当您将二值化器放在vec
列表上时:
bin.fit(vec)
然后再试一次
print bin.classes_
我得到以下内容:
['cat' 'dog']
print bin.transform(vec)
现在,在vec
对象上调用transform之后,我们得到以下信息:
[[0]
[1]
[1]
[1]]
至于用作转换器的估计器,让我们使用DecisionTree
分类器作为特征提取器的示例。决策树之所以出色,有很多原因,但是出于我们的目的,重要的是决策树能够对那些认为对预测有用的特征进行排名。当您在决策树上调用transform()
时,它将获取您的输入数据并查找其认为最重要的功能。因此,您可以考虑将数据矩阵(n行乘m列)转换为较小的矩阵(n行乘k列),其中k列是决策树发现的k个最重要的特征。
0
我不知道
sklearn.pipeline.Pipeline
是如何工作的。文档中有一些解释。例如,它们的意思是:
为了使我的问题更清楚,有哪些
steps
?它们如何工作?编辑
由于有了答案,我可以使我的问题更清楚:
当我调用管道并通过时,需要两个转换器和一个估计器,例如:
我叫这个怎么办?
我不知道估算器如何成为变压器以及如何装配变压器。