Acho que M0rkHaV tem a ideia certa. Classe pipeline da scikit-learn é uma ferramenta útil para encapsular vários transformadores diferentes ao lado de um estimador em um objeto, de modo que você só tem que chamar seus métodos importantes uma vez ( fit()
, predict()
, etc). Vamos dividir os dois componentes principais:
Transformers são classes que implementam fit()
e transform()
. Você deve estar familiarizado com algumas das ferramentas de pré-processamento do sklearn, como TfidfVectorizer
e Binarizer
. Se você olhar a documentação dessas ferramentas de pré-processamento, verá que elas implementam ambos os métodos. O que eu acho muito legal é que alguns estimadores também podem ser usados como etapas de transformação, por exemplo LinearSVC
!
Estimadores são classes que implementam ambos fit()
e predict()
. Você descobrirá que muitos dos classificadores e modelos de regressão implementam esses dois métodos e, como tal, pode testar prontamente muitos modelos diferentes. É possível usar outro transformador como o estimador final (ou seja, não necessariamente implementa predict()
, mas definitivamente implementa fit()
). Tudo isso significa que você não conseguiria ligar predict()
.
Quanto à sua edição: vamos examinar um exemplo baseado em texto. Usando LabelBinarizer, queremos transformar uma lista de rótulos em uma lista de valores binários.
bin = LabelBinarizer() #first we initialize
vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized
Agora, quando o binarizador for encaixado em alguns dados, ele terá uma estrutura chamada classes_
que contém as classes exclusivas que o transformador 'conhece'. Sem chamar fit()
o binarizador não tem ideia de como os dados se parecem, então chamar transform()
não faria sentido. Isso é verdade se você imprimir a lista de classes antes de tentar ajustar os dados.
print bin.classes_
Recebo o seguinte erro ao tentar isso:
AttributeError: 'LabelBinarizer' object has no attribute 'classes_'
Mas quando você coloca o binarizador na vec
lista:
bin.fit(vec)
e tente novamente
print bin.classes_
Eu obtenho o seguinte:
['cat' 'dog']
print bin.transform(vec)
E agora, depois de chamar transform no vec
objeto, obtemos o seguinte:
[[0]
[1]
[1]
[1]]
Quanto aos estimadores sendo usados como transformadores, vamos usar o DecisionTree
classificador como um exemplo de extrator de características. Árvores de decisão são ótimas por vários motivos, mas, para nossos objetivos, o importante é que elas têm a capacidade de classificar recursos que a árvore considerou úteis para previsão. Quando você chama transform()
uma árvore de decisão, ela pega seus dados de entrada e encontra o que pensa ser os recursos mais importantes. Portanto, você pode pensar em transformar sua matriz de dados (n linhas por m colunas) em uma matriz menor (n linhas por k colunas), onde as k colunas são as k características mais importantes que a Árvore de Decisão encontrou.