supervised sklearn scikit machine learning learn guide examples python machine-learning scikit-learn

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:

  1. Los transformadores son clases que implementan tanto fit() como 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 genial es que algunos estimadores también se pueden usar como pasos de transformación, por ejemplo, LinearSVC .

  2. Los estimadores son clases que implementan tanto fit() como predict() . 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 implementa predict() , pero definitivamente implementa fit() ). Todo esto significa que no podrás llamar a predict() .

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.