Tubería Scikit-Learn: Búsqueda de cuadrículas sobre los parámetros del transformador para generar datos -- python campo con scikit-learn campo con cross-validation campo con grid-search camp Relacionados El problema

scikit-learn pipeline: grid search over parameters of transformer to generate data


4
vote

problema

Español

Me gustaría usar el primer paso de una tubería de Scikit-Learn para generar un conjunto de datos de juguete para evaluar el rendimiento de mi análisis. Una solución AS-SIMPLE-AS-IT-GET-ELEMPERO, me parece lo siguiente:

  import numpy as np from sklearn.pipeline import Pipeline from sklearn.grid_search import GridSearchCV from sklearn.base import TransformerMixin from sklearn import cluster  class FeatureGenerator(TransformerMixin):      def __init__(self, num_features=None):         self.num_features = num_features      def fit(self, X, y=None, **fit_params):         return self      def transform(self, X, **transform_params):         return np.array(             range(self.num_features*self.num_features)         ).reshape(self.num_features,                   self.num_features)      def get_params(self, deep=True):         return {"num_features": self.num_features}      def set_params(self, **parameters):         self.num_features = parameters["num_features"]         return self   

Este transformador en acción sería. gramo. ser llamado así:

  pipeline = Pipeline([     ('pick_features', FeatureGenerator(100)),     ('kmeans', cluster.KMeans()) ])  pipeline = pipeline.fit(None) classes = pipeline.predict(None) print classes   

Se vuelve complicado para mí tan pronto como intento buscar cuadrículas en esta tubería:

  parameter_sets = {     'pick_features__num_features' : [10,20,30],     'kmeans__n_clusters' : [2,3,4] }  pipeline = Pipeline([     ('pick_features', FeatureGenerator()),     ('kmeans', cluster.KMeans()) ])  g_search_estimator = GridSearchCV(pipeline, parameter_sets)  g_search_estimator.fit(None,None)   

La búsqueda de la cuadrícula espera las muestras y las etiquetas como entrada y no es tan robusta como la tubería, que no se queja de None como parámetro de entrada:

  TypeError: Expected sequence or array-like, got <type 'NoneType'>   

Esto tiene sentido, porque la búsqueda de la cuadrícula necesita dividir los datos establecidos en diferentes particiones de CV.


Otro que en el ejemplo anterior, tengo muchos parámetros, que se pueden ajustar en el paso de generación de datos de datos. Por lo tanto, necesito una solución para incluir este paso en mi selección de parámetros de validación cruzada.

Pregunta: ¿Hay alguna forma de configurar el X6 S y y S del Learchearch desde dentro del primer transformador? ¿O cómo se veía una solución, que llama a la redesearch con múltiples conjuntos de datos diferentes (preferiblemente paralelos)? ¿O alguien ha intentado personalizar GridSearchCV o puede señalar algunos materiales de lectura en este?

Original en ingles

I would like to use the first step of a scikit-learn pipeline to generate a toy data set in order to evaluate the performance of my analysis. An as-simple-as-it-gets-example solution I came up with looks like the following:

import numpy as np from sklearn.pipeline import Pipeline from sklearn.grid_search import GridSearchCV from sklearn.base import TransformerMixin from sklearn import cluster  class FeatureGenerator(TransformerMixin):      def __init__(self, num_features=None):         self.num_features = num_features      def fit(self, X, y=None, **fit_params):         return self      def transform(self, X, **transform_params):         return np.array(             range(self.num_features*self.num_features)         ).reshape(self.num_features,                   self.num_features)      def get_params(self, deep=True):         return {"num_features": self.num_features}      def set_params(self, **parameters):         self.num_features = parameters["num_features"]         return self 

This transformer in action would e. g. be called like this:

pipeline = Pipeline([     ('pick_features', FeatureGenerator(100)),     ('kmeans', cluster.KMeans()) ])  pipeline = pipeline.fit(None) classes = pipeline.predict(None) print classes 

It gets tricky for me as soon as I try to grid search over this pipeline:

parameter_sets = {     'pick_features__num_features' : [10,20,30],     'kmeans__n_clusters' : [2,3,4] }  pipeline = Pipeline([     ('pick_features', FeatureGenerator()),     ('kmeans', cluster.KMeans()) ])  g_search_estimator = GridSearchCV(pipeline, parameter_sets)  g_search_estimator.fit(None,None) 

The grid search expects the samples and the labels as input and is not as robust as the pipeline, which does not complain about None as input parameter:

TypeError: Expected sequence or array-like, got <type 'NoneType'> 

This makes sense, because the grid search needs to divide the data set in to different cv-partitions.


Other than in the above example, I have a lot of parameters, that can be adjusted in the data set generation step. I thus need a solution to include this step into my parameter selection cross-validation.

Question: Is there a way to set the Xs and ys of the GridSearch from inside the first transformer? Or how could a solution look like, that calls the GridSearch with multiple different data sets (preferably parallel)? Or has anyone tried to customize GridSearchCV or can point to some reading materials on this?

           

Lista de respuestas

0
 
vote

Su código está muy limpio, por lo que es un placer ofrecerle esta solución rápida y sucia:

  g_search_estimator.fit([1., 1., 1.],[1., 0., 0.]) g_search_estimator.best_params_   

Salida:

  [tons of int64 to float64 conversion warnings] {'kmeans__n_clusters': 4, 'pick_features__num_features': 10}   

Nota Necesita 3 muestras porque está haciendo una validación cruzada (predeterminada) 3 veces.

El error que se obtiene debido a un cheque realizado por el objeto GridSearchCV2 para que suceda antes de que su transformador tenga la posibilidad de hacer algo. Así que diría "No" a su primera pregunta:

¿Hay alguna manera de establecer el XS y YS de la búsqueda de redes dentro de la primer transformador?

Editar:
Me doy cuenta de que esto fue innecesariamente confuso, las tres líneas siguientes son equivalentes: g_search_estimator.fit ([1., 1., 1.], [1., 0., 0.]) g_search_estimator.fit ([1., 1., 1.], ninguno) g_search_estimator.fit ([1., 1., 1.])

Perdón por lanzar apresuradamente y S allí.

Algunas explicaciones sobre cómo la búsqueda de la cuadrícula calcula las puntuaciones para los diferentes puntos de la cuadrícula: cuando pasa scoring=None al constructor (este es el valor predeterminado, así que eso es lo que tiene Aquí), le pide al estimador una función de puntuación. Si hay una función que se usa para anotar. Para KMeans La función de puntaje predeterminada es esencialmente lo opuesto a la suma de distancias a los centros de racimo.
Esta es una métrica sin supervisión, por lo que y no es necesario aquí.

Envolviéndolo, siempre podrá:

Configure el XS de la HIJA DE LA PIERRA DENTRO DEL PRIMER TRANSFORMER

Simplemente 'transformar' la entrada X en algo totalmente sin relación, nadie se quejará de ello. Usted necesita Algunos Entrada random_X .
Ahora, si desea utilizar las métricas supervisadas (tengo este sentimiento de su pregunta), deberá especificar [tons of int64 to float64 conversion warnings] {'kmeans__n_clusters': 4, 'pick_features__num_features': 10} 0 también.
Un escenario fácil es uno en el que tiene un vector fijo [tons of int64 to float64 conversion warnings] {'kmeans__n_clusters': 4, 'pick_features__num_features': 10} 111
y desea probar varios [tons of int64 to float64 conversion warnings] {'kmeans__n_clusters': 4, 'pick_features__num_features': 10} 2
con eso. Entonces puedes simplemente hacer:

  [tons of int64 to float64 conversion warnings] {'kmeans__n_clusters': 4, 'pick_features__num_features': 10} 3  

y debería correr bien. Si desea buscar en diferentes valores de [tons of int64 to float64 conversion warnings] {'kmeans__n_clusters': 4, 'pick_features__num_features': 10} 4 , probablemente será un poco más complicado.

 

Your code is very clean so it is a pleasure to offer you this quick and dirty solution:

g_search_estimator.fit([1., 1., 1.],[1., 0., 0.]) g_search_estimator.best_params_ 

Output:

[tons of int64 to float64 conversion warnings] {'kmeans__n_clusters': 4, 'pick_features__num_features': 10} 

Note you need 3 samples because you're doing a (default) 3-fold cross validation.

The error you get happens because of a check performed by the GridSearchCV object so it happens before your transformer has a chance of doing anything. So I would say "no" to your first question:

Is there a way to set the Xs and ys of the GridSearch from inside the first transformer?

EDIT:
I realize this was unnecessarily confusing, the three following lines are equivalent: g_search_estimator.fit([1., 1., 1.], [1., 0., 0.]) g_search_estimator.fit([1., 1., 1.], None) g_search_estimator.fit([1., 1., 1.])

Sorry for hastily throwing random ys in there.

Some explanations about how the grid search computes scores for the different grid points: when you pass scoring=None to the GridSearchCV constructor (this is the default so that's what you have here), it asks the estimator for a score function. If there is such a function it is used for scoring. For KMeans the default score function is essentially the opposite of the sum of distances to cluster centers.
This is an unsupervised metrics so y is not necessary here.

Wrapping it up, you will always be able to:

set the Xs of the GridSearch from inside the first transformer

Just 'transform' the input X into something totally unrelated, no one will complain about it. You do need some input random_X though.
Now if you want to use supervised metrics (I have this feeling from your question) you'll need to specify y as well.
An easy scenario is one where you have a fixed y vector and you want to try several X with that. Then you can just do:

g_search_estimator.fit(random_X, y, scoring=my_scoring_function) 

and it should run fine. If you want to search over different values of y it will probably be a bit trickier.

 
 
   
   

Relacionados problema

0  Tuning de parámetros en Microsoft R  ( Parameter tuning in microsoft r ) 
¿Hay alguna función para realizar el ajuste de parámetros en Microsoft R? La función equivalente en R es trenes () , que hace una red de cuadrícula bastant...

2  GridSearchcv para regresión polinomial  ( Gridsearchcv for polynomial regression ) 
Era nuevo para el aprendizaje automático y me quedé atrapado con esto. Cuando intentaba implementar la regresión polinomial en el modelo lineal, como usar v...

3  Tabule la precisión y la media para cada pliegue en GridSearchcv de Scikit-Learn  ( Tabulate accuracy and mean for each fold in gridsearchcv from scikit learn ) 
Estoy haciendo una búsqueda de cuadrícula sobre mi modelo en Scikit-Learn, Python3, con dos conjuntos de parámetros A y B. El código se ve así: parameterA ...

11  Use una métrica después de un clasificador en una tubería  ( Use a metric after a classifier in a pipeline ) 
Sigo investigando sobre la tubería. Mi objetivo es ejecutar cada paso del aprendizaje de la máquina solo con tubería. Será más flexible y más fácil adaptar mi...

3  Cómo acceder a columnTransformer Elements en GridSearchcv  ( How to access columntransformer elements in gridsearchcv ) 
Quería averiguar la convención de nombramiento correcto cuando se refiere al preprocesador individual incluido en columnTransformer (que forma parte de una tu...

0  Error de parámetro no válido al hacer el método de búsqueda de cuadrícula de Python Scikit-Learn  ( Invalid parameter error when doing python scikit learn grid search method ) 
Estoy tratando de aprender a encontrar los hiperparameters óptimos en el clasificador de árboles de decisión utilizando el método de GridSearchCV () de Scikit...

1  Realización de la búsqueda de cuadrícula con un conjunto de validación predefinido Sklearn  ( Performing grid search with a predefined validation set sklearn ) 
Esta pregunta se ha formulado varias veces antes. Pero recibo un error al seguir la respuesta Primero, especifico qué parte es el conjunto de entrenamiento ...

2  Python, aprendizaje de la máquina - Realice una búsqueda de cuadrícula en el conjunto de validación personalizada  ( Python machine learning perform a grid search on custom validation set ) 
Estoy tratando con un problema de clasificación desequilibrado, donde mi clase negativa es 1000 veces más numerosos que mi clase positiva. Mi estrategia es ca...

10  Búsqueda de cuadrículas de Hyperas con una red con múltiples entradas  ( Hyperas grid search with a network with multiple inputs ) 
Actualmente tengo problemas usando hyeras optimiser en mi red con múltiples entradas. Así es como lo he implementado: def data(): X_train, Y_train ...

0  Medición de rendimiento de GridSearchcv  ( Gridsearchcv performance measurement ) 
Tengo una tarea y me pide que: Mejorar el rendimiento de los modelos desde el paso anterior con Sintonización del hiperparameter y seleccione un modelo ópt...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos