Creo que M0rkHaV tiene la idea correcta. Scikit-learn de la clase de tuberías es una herramienta útil para encapsular varios transformadores diferentes junto con un estimador en un solo objeto, por lo que sólo tiene que llamar a sus métodos importantes una vez ( fit()
, predict()
, etc.). Analicemos los dos componentes principales:
Los transformadores son clases que implementan fit()
y transform()
. Es posible que esté familiarizado con algunas de las herramientas de preprocesamiento de sklearn, como TfidfVectorizer
y Binarizer
. Si observa los documentos de estas herramientas de preprocesamiento, verá que implementan ambos métodos. Lo que me parece bastante interesante es que algunos estimadores también se pueden usar como pasos de transformación, por ejemplo LinearSVC
.
Los estimadores son clases que implementan fit()
y predict()
. Descubrirá que muchos de los clasificadores y modelos de regresión implementan ambos métodos y, como tal, puede probar fácilmente muchos modelos diferentes. Es posible utilizar otro transformador como estimador final (es decir, no necesariamente implementa predict()
, pero definitivamente implementa fit()
). Todo esto significa que no podrá llamar predict()
.
En cuanto a su edición: veamos un ejemplo basado en texto. Usando LabelBinarizer, queremos convertir una lista de etiquetas en una lista de valores binarios.
bin = LabelBinarizer() #first we initialize
vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized
Ahora, cuando el binarizador se ajusta a algunos datos, tendrá una estructura llamada classes_
que contiene las clases únicas que el transformador 'conoce'. Sin llamar, fit()
el binarizador no tiene idea de cómo se ven los datos, por lo que llamar transform()
no tendría ningún sentido. Esto es cierto si imprime la lista de clases antes de intentar ajustar los datos.
print bin.classes_
Recibo el siguiente error al intentar esto:
AttributeError: 'LabelBinarizer' object has no attribute 'classes_'
Pero cuando encaja el binarizador en la vec
lista:
bin.fit(vec)
e intenta de nuevo
print bin.classes_
Obtengo lo siguiente:
['cat' 'dog']
print bin.transform(vec)
Y ahora, después de llamar a transform en el vec
objeto, obtenemos lo siguiente:
[[0]
[1]
[1]
[1]]
En cuanto a los estimadores que se utilizan como transformadores, usemos el DecisionTree
clasificador como ejemplo de extractor de características. Los árboles de decisión son excelentes por muchas razones, pero para nuestros propósitos, lo importante es que tienen la capacidad de clasificar las características que el árbol encontró útiles para predecir. Cuando llama transform()
a un árbol de decisión, tomará sus datos de entrada y encontrará lo que cree que son las características más importantes. Entonces, puede pensar en transformar su matriz de datos (n filas por m columnas) en una matriz más pequeña (n filas por k columnas), donde las k columnas son las k características más importantes que encontró el árbol de decisión.