python - sklearn - scikit learn supervised learning
Python: ¿qué es exactamente sklearn.pipeline.Pipeline? (2)
No puedo entender cómo funciona
sklearn.pipeline.Pipeline
exactamente.
Hay algunas explicaciones en el doc . Por ejemplo, ¿qué quieren decir con:
Tubería de transformaciones con un estimador final.
Para aclarar mi pregunta, ¿cuáles son los
steps
?
¿Cómo trabajan?
Editar
Gracias a las respuestas puedo aclarar mi pregunta:
Cuando llamo tubería y paso, como pasos, dos transformadores y un estimador, por ejemplo:
pipln = Pipeline([("trsfm1",transformer_1),
("trsfm2",transformer_2),
("estmtr",estimator)])
¿Qué pasa cuando llamo a esto?
pipln.fit()
OR
pipln.fit_transform()
No puedo entender cómo un estimador puede ser un transformador y cómo se puede instalar un transformador.
Creo que M0rkHaV tiene la idea correcta.
La clase de canalización de Scikit-learn es una herramienta útil para encapsular múltiples transformadores diferentes junto con un estimador en un solo objeto, por lo que solo tiene que llamar a sus métodos importantes una vez (
fit()
,
predict()
, etc.).
Analicemos los dos componentes principales:
-
Los transformadores son clases que implementan tanto
fit()
comotransform()
. Es posible que esté familiarizado con algunas de las herramientas de preprocesamiento de sklearn, comoTfidfVectorizer
yBinarizer
. Si observa los documentos de estas herramientas de preprocesamiento, verá que implementan ambos métodos. Lo que me parece genial es que algunos estimadores también se pueden usar como pasos de transformación, por ejemplo,LinearSVC
. -
Los estimadores son clases que implementan tanto
fit()
comopredict()
. Encontrará que muchos de los clasificadores y modelos de regresión implementan estos dos métodos, y como tal puede probar fácilmente muchos modelos diferentes. Es posible utilizar otro transformador como estimador final (es decir, no necesariamente implementapredict()
, pero definitivamente implementafit()
). Todo esto significa que no podrás llamar apredict()
.
En cuanto a su edición: veamos un ejemplo basado en texto. Con 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 a
fit()
el binarizador no tiene idea de cómo se ven los datos, por lo que llamar a
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_
Me da el siguiente error cuando intento esto:
AttributeError: ''LabelBinarizer'' object has no attribute ''classes_''
Pero cuando encajas el binarizador en la lista
vec
:
bin.fit(vec)
e intenta de nuevo
print bin.classes_
Me sale lo siguiente:
[''cat'' ''dog'']
print bin.transform(vec)
Y ahora, después de llamar a transform en el objeto
vec
, obtenemos lo siguiente:
[[0]
[1]
[1]
[1]]
En cuanto a los estimadores que se usan como transformadores, usemos el clasificador
DecisionTree
como ejemplo de un 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 a
transform()
en un Árbol de decisión, tomará sus datos de entrada y encontrará lo
que
cree que son las características más importantes.
Así que puedes pensar transformando tu 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.
Transformador en scikit-learn: algunas clases que tienen el método de ajuste y transformación, o el método fit_transform.
Predictor : alguna clase que tiene métodos de ajuste y predicción, o método fit_predict.
Pipeline es solo una noción abstracta, no es un algoritmo ml existente. A menudo, en las tareas de ML, debe realizar una secuencia de diferentes transformaciones (encontrar un conjunto de características, generar nuevas características, seleccionar solo algunas características buenas) del conjunto de datos sin procesar antes de aplicar el estimador final.
Here hay un buen ejemplo del uso de Pipeline. Pipeline le ofrece una interfaz única para los 3 pasos de transformación y el estimador resultante. Encapsula transformadores y predictores en su interior, y ahora puede hacer algo como:
vect = CountVectorizer()
tfidf = TfidfTransformer()
clf = SGDClassifier()
vX = vect.fit_transform(Xtrain)
tfidfX = tfidf.fit_transform(vX)
predicted = clf.fit_predict(tfidfX)
# Now evaluate all steps on test set
vX = vect.fit_transform(Xtest)
tfidfX = tfidf.fit_transform(vX)
predicted = clf.fit_predict(tfidfX)
Con tan solo:
pipeline = Pipeline([
(''vect'', CountVectorizer()),
(''tfidf'', TfidfTransformer()),
(''clf'', SGDClassifier()),
])
predicted = pipeline.fit(Xtrain).predict(Xtrain)
# Now evaluate all steps on test set
predicted = pipeline.predict(Xtest)
Con las tuberías, puede realizar fácilmente una búsqueda de cuadrícula en un conjunto de parámetros para cada paso de este metaestimulador.
Como se describe en el enlace de arriba.
Todos los pasos, excepto el último, deben ser transformados, el último paso puede ser transformador o predictor.
Respuesta para editar
: Cuando llame a
pipln.fit()
: cada transformador dentro de la tubería se ajustará a las salidas del transformador anterior (el primer transformador se aprende en el conjunto de datos sin procesar).
El último estimador puede ser transformador o predictor, puede llamar a fit_transform () en la tubería solo si su último estimador es transformador (que implementa fit_transform, o métodos de transformación y ajuste por separado), puede llamar a fit_predict () o predecir () en la tubería solo si Su último estimador es predictor.
Por lo tanto, no puede llamar a fit_transform o transform on pipeline, cuyo último paso es el predictor.