No puedo entender cómo sklearn.pipeline.Pipeline
funciona exactamente.
Hay algunas explicaciones en el documento . Por ejemplo, ¿qué quieren decir con:
Pipeline de transformaciones con un estimador final.
Para aclarar mi pregunta, ¿cuáles son steps
? ¿Cómo trabajan?
Editar
Gracias a las respuestas puedo aclarar mi pregunta:
Cuando llamo a la 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.
python
machine-learning
scikit-learn
neuraxle
farhawa
fuente
fuente
Respuestas:
Transformador en scikit-learn: alguna clase que tiene el método de ajuste y transformación, o el método de ajuste y transformación.
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 AA, es necesario realizar una secuencia de diferentes transformaciones (encontrar un conjunto de características, generar nuevas características, seleccionar solo algunas buenas características) del conjunto de datos sin procesar antes de aplicar el estimador final.
Este es un buen ejemplo del uso de Pipeline. Pipeline le ofrece una única interfaz para los 3 pasos de la transformación y el estimador resultante. Encapsula transformadores y predictores en su interior, y ahora puede hacer algo como:
Con solo:
Con las canalizaciones, puede realizar fácilmente una búsqueda en cuadrícula sobre un conjunto de parámetros para cada paso de este metaestimador. Como se describe en el enlace anterior. Todos los pasos excepto el último deben ser transformados, el último paso puede ser transformador o predictor. Respuesta para editar : Cuando llame
pipln.fit()
, cada transformador dentro de la tubería se instalará en 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 los métodos fit_transform o transformar y ajustar por separado), puede llamar a fit_predict () o predecir () en la tubería solo si su último estimador es el predictor. Por lo tanto, no puede llamar a fit_transform o transform on pipeline, cuyo último paso es el predictor.fuente
predicted = pipeline.fit(Xtrain).predict(Xtrain)
?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()
ytransform()
. 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 bastante interesante es que algunos estimadores también se pueden usar como pasos de transformación, por ejemploLinearSVC
.Los estimadores son clases que implementan
fit()
ypredict()
. 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 implementapredict()
, pero definitivamente implementafit()
). Todo esto significa que no podrá llamarpredict()
.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.
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 llamartransform()
no tendría ningún sentido. Esto es cierto si imprime la lista de clases antes de intentar ajustar los datos.Recibo el siguiente error al intentar esto:
Pero cuando encaja el binarizador en la
vec
lista:e intenta de nuevo
Obtengo lo siguiente:
Y ahora, después de llamar a transform en el
vec
objeto, obtenemos lo siguiente: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 llamatransform()
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.fuente
fit()
ytransform()
son los Transformers? , ¿cómo se pueden utilizar los estimadores como transformadores?fit()
es el método al que llama para ajustar o 'entrenar' su transformador, como lo haría con un clasificador o modelo de regresión. En cuanto atransform()
, ese es el método al que llama para transformar realmente los datos de entrada en datos de salida. Por ejemplo, llamarBinarizer.transform([8,2,2])
(¡después de ajustar!) Podría resultar en[[1,0],[0,1],[0,1]]
. En cuanto al uso de estimadores como transformadores, editaré un breve ejemplo en mi respuesta.¿Qué son las canalizaciones de ML y cómo funcionan?
Una canalización es una serie de pasos en los que se transforman los datos. Viene del antiguo patrón de diseño de "tubería y filtro" (por ejemplo, podría pensar en comandos bash de Unix con tuberías "|" o operadores de redireccionamiento ">"). Sin embargo, las canalizaciones son objetos del código. Por lo tanto, puede tener una clase para cada filtro (también conocido como cada paso de canalización) y luego otra clase para combinar esos pasos en la canalización final. Algunas tuberías pueden combinar otras tuberías en serie o en paralelo, tener múltiples entradas o salidas, etc. Nos gusta ver las canalizaciones de Machine Learning como:
Métodos de una canalización de Scikit-Learn
Las canalizaciones (o pasos en la canalización) deben tener esos dos métodos :
También es posible llamar a este método para encadenar ambos:
Problemas de la clase sklearn.pipeline.Pipeline
Scikit-Learn tuvo su primer lanzamiento en 2007, que fue una era previa al aprendizaje profundo . Sin embargo, es una de las bibliotecas de aprendizaje automático más conocidas y adoptadas, y aún está creciendo. Además de todo, utiliza el patrón de diseño de tuberías y filtros como estilo de arquitectura de software: es lo que hace que Scikit-Learn sea tan fabuloso, además del hecho de que proporciona algoritmos listos para usar. Sin embargo, tiene problemas enormes cuando se trata de hacer lo siguiente, que ya deberíamos poder hacer en 2020:
Soluciones que hemos encontrado para los problemas de Scikit-Learn
Sin duda, Scikit-Learn es muy conveniente y está bien construido. Sin embargo, necesita una actualización. ¡Aquí están nuestras soluciones con Neuraxle para hacer que Scikit-Learn sea nuevo y utilizable en proyectos informáticos modernos!
Funciones y métodos de canalización adicionales ofrecidos a través de Neuraxle
Nota: si un paso de una canalización no necesita tener uno de los métodos de ajuste o transformación, podría heredar de NonFittableMixin o NonTransformableMixin para recibir una implementación predeterminada de uno de esos métodos para no hacer nada.
Como punto de partida, es posible que las canalizaciones o sus pasos también definan opcionalmente esos métodos :
Los siguientes métodos se proporcionan de forma predeterminada para permitir la gestión de hiperparámetros:
RandInt(1, 3)
que significa de 1 a 3 capas. Puedes llamar.rvs()
utilizar este dict para elegir un valor al azar y enviarlo a "set_hyperparams" para intentar entrenarlo.Para obtener más información sobre nuestras soluciones sugeridas, lea las entradas en la lista grande con enlaces arriba.
fuente