¿Diferencia entre fit y fit_transform en modelos scikit_learn?


110

Soy novato en la ciencia de datos y no entiendo la diferencia entre fity fit_transformmétodos en scikit-learn. ¿Alguien puede simplemente explicar por qué podríamos necesitar transformar los datos?

¿Qué significa ajustar el modelo en los datos de entrenamiento y transformarlos en datos de prueba? ¿Significa, por ejemplo, convertir variables categóricas en números en el tren y transformar un nuevo conjunto de características para probar datos?



@sds La respuesta de arriba da el enlace a esta pregunta.
Kaushal28

Aplicamos fiten la training datasety utilizamos el transformmétodo de both- la formación de datos y los datos de prueba
Prakash Kumar

Respuestas:


117

Para centrar los datos (hacer que tengan una media cero y un error estándar de la unidad), resta la media y luego divide el resultado por la desviación estándar.

x=xμσ

Lo haces en el conjunto de datos de entrenamiento. Pero luego debe aplicar la misma transformación a su conjunto de pruebas (por ejemplo, en validación cruzada), o a ejemplos recién obtenidos antes del pronóstico. Pero debe usar los mismos dos parámetros y (valores) que usó para centrar el conjunto de entrenamiento.σμσ

Por lo tanto, cada transformación de sklearn fit()solo calcula los parámetros (por ejemplo, y en el caso de StandardScaler ) y los guarda como un estado de objetos internos. Luego, puede llamar a su método para aplicar la transformación a un conjunto particular de ejemplos.σμσtransform()

fit_transform()se une a estos dos pasos y se usa para el ajuste inicial de parámetros en el conjunto de entrenamiento , pero también devuelve una transformada . Internamente, solo llama primero y luego con los mismos datos.x xxfit()transform()


1
Muchas gracias por su respuesta. Solo una cosa. ¿Por parámetros en el modelo no significa para la pendiente de ejemplo e intercepción para la regresión? cuando encaja, digamos una regresión lineal, por ejemplo, ¿qué parámetros se ajustan en el método de ajuste? Parámetros de normalización o parámetros del modelo como pendiente e intercepción?
Kaggle

1
Me refiero a los parámetros internos de las transformaciones ( y en el caso de StandardScaler). Cualquier método de transformación devuelve. Vea este capítulo sobre imputación, por ejemplo: scikit-learn.org/stable/modules/…σμσget_params()
K3 --- rnc

2
Mi comentario anterior es realmente incorrecto. En caso de regresión lineal, los parámetros ajustados son coef_(es decir, pendiente e intersección), no los devueltos por get_params()(que, en cambio, devuelve el conjunto de argumentos del constructor del modelo con sus valores asociados).
K3 --- rnc

¡Gran respuesta! Encontré tu publicación mientras buscaba este tema, pero necesito aclararlo. ¿Eso significa que si suponemos que queremos transformar cada conjunto de ejemplos posteriores, nunca deberíamos llamar fit_transform()ya que no nos permitiría acceder al estado de los objetos internos, para transformar ejemplos posteriores con los mismos parámetros que se obtuvieron usando fit()el conjunto de datos inicial? Esto surge, por ejemplo, cuando tiene un conjunto de datos de prueba y desea transformar el conjunto de prueba para pasarlo a su clasificador entrenado.
AKKA

Después de llamar t.fit_transform(train_data), t está equipado, para que pueda usarlo de manera segura t.transform(test_data).
K3 --- rnc

10

La siguiente explicación se basa en la fit_transformde Imputerla clase, pero la idea es la misma para fit_transformlas otras clases scikit_learn gusta MinMaxScaler.


transformreemplaza los valores faltantes con un número. Por defecto, este número es el medio de las columnas de algunos datos que elija. Considere el siguiente ejemplo:

imp = Imputer()
# calculating the means
imp.fit([[1, 3], [np.nan, 2], [8, 5.5]])

Ahora el ordenador ha aprendido a usar una media (1 + 8) / 2 = 4.5 para la primera columna y una media (2 + 3 + 5.5) / 3 = 3.5 para la segunda columna cuando se aplica a datos de dos columnas:

X = [[np.nan, 11], 
     [4,      np.nan], 
     [8,      2],
     [np.nan, 1]]
print(imp.transform(X))

obtenemos

[[4.5, 11], 
 [4, 3.5],
 [8, 2],
 [4.5, 1]]

Entonces, fitel imputador calcula los medios de las columnas a partir de algunos datos, y transformaplica esos medios a algunos datos (que simplemente reemplaza los valores faltantes con los medios). Si ambos datos son iguales (es decir, los datos para calcular las medias y los datos a los que se aplican las medias), puede utilizarlos, fit_transformque es básicamente un fitseguido de a transform.

Ahora tus preguntas:

¿Por qué podríamos necesitar transformar datos?

"Por varias razones, muchos conjuntos de datos del mundo real contienen valores faltantes, a menudo codificados como espacios en blanco, NaN u otros marcadores de posición. Sin embargo, estos conjuntos de datos son incompatibles con los estimadores de aprendizaje de scikit que suponen que todos los valores en una matriz son numéricos" ( fuente )

¿Qué significa ajustar el modelo en los datos de entrenamiento y transformarlos en datos de prueba?

El uso fitde una impresora no tiene nada que ver con el fitutilizado en el ajuste del modelo. Por lo tanto, usar los fitdatos de entrenamiento de la computadora solo calcula los medios de cada columna de datos de entrenamiento. El uso transformde datos de prueba reemplaza los valores faltantes de datos de prueba con medios que se calcularon a partir de los datos de entrenamiento.


3

En términos simples, fit_transform significa hacer algunos cálculos y luego hacer la transformación (por ejemplo, calcular el promedio de las columnas a partir de algunos datos y luego reemplazar los valores faltantes). Entonces, para el conjunto de entrenamiento, debe calcular y hacer la transformación.

Pero para el conjunto de prueba, el aprendizaje automático aplica la predicción en función de lo aprendido durante el conjunto de entrenamiento y, por lo tanto, no necesita calcular, solo realiza la transformación.


3

Estos métodos se utilizan para las transformaciones de conjuntos de datos en scikit-learn:

Tomemos un ejemplo para los valores de escala en un conjunto de datos:

Aquí, el método de ajuste , cuando se aplica al conjunto de datos de entrenamiento, aprende los parámetros del modelo (por ejemplo, media y desviación estándar). Luego, debemos aplicar el método de transformación en el conjunto de datos de entrenamiento para obtener el conjunto de datos de entrenamiento transformado (escalado). También podríamos realizar ambos pasos en un solo paso aplicando fit_transform en el conjunto de datos de entrenamiento.

Entonces, ¿por qué necesitamos 2 métodos separados: ajuste y transformación ?

En la práctica, necesitamos tener un conjunto de datos de capacitación y prueba por separado, y ahí es donde tener un método de transformación y ajuste por separado ayuda. Aplicamos el ajuste en el conjunto de datos de entrenamiento y utilizamos el método de transformación en ambos: el conjunto de datos de entrenamiento y el conjunto de datos de prueba. Por lo tanto, el entrenamiento y el conjunto de datos de prueba se transforman (escalan) usando los parámetros del modelo que se aprendieron al aplicar el método de ajuste al conjunto de datos de entrenamiento.

Código de ejemplo:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 

2

Esta no es una respuesta técnica pero, con suerte, es útil desarrollar nuestra intuición:

En primer lugar, todos los estimadores reciben capacitación (o "ajuste") en algunos datos de capacitación. Esa parte es bastante sencilla.

En segundo lugar, todos los estimadores de scikit-learn pueden usarse en una tubería y la idea con una tubería es que los datos fluyan a través de la tubería. Una vez que se ajusta a un nivel particular en la tubería, los datos se pasan a la siguiente etapa en la tubería, pero obviamente los datos deben cambiarse (transformarse) de alguna manera; de lo contrario, no necesitaría esa etapa en la tubería en absoluto. Por lo tanto, transformar es una forma de transformar los datos para satisfacer las necesidades de la siguiente etapa en la tubería.

Si no está utilizando una tubería, sigo pensando que es útil pensar en estas herramientas de aprendizaje automático de esta manera porque, incluso el clasificador más simple todavía está realizando una función de clasificación. Toma como entrada algunos datos y produce una salida. Esta es una tubería también; Solo una muy simple.

En resumen, fit realiza el entrenamiento, transform cambia los datos en la tubería para pasarlos a la siguiente etapa de la tubería, y fit_transform realiza el ajuste y la transformación en un paso posiblemente optimizado.


"" Aplicamos el ajuste en el conjunto de datos de entrenamiento y utilizamos el método de transformación en ambos: el conjunto de datos de entrenamiento y el conjunto de datos de prueba "" :) Niza
Prakash Kumar

2
Creo que querías comentar a continuación. Lo enviaré a Prasad Nageshkar. (Bueno ... lo hubiera hecho si tuviera la reputación).
Eric McLachlan

1

Al aplicar las transformaciones, está tratando de hacer que sus datos se comporten normalmente, por ejemplo, si tiene dos variables, y miden las distancias, pero tiene las unidades como centímetros y tiene las unidades en kilómetros, por lo que para comparar estos dos, tienen que convertirlos a las mismas unidades ... así como Transformar es hacer un comportamiento similar o hacer que se comporte como una distribución normalV1V2V1V2

Volviendo a otra pregunta, primero construye el modelo en el conjunto de entrenamiento que es (el modelo aprende los patrones o el comportamiento de sus datos del conjunto de entrenamiento) y cuando ejecuta el mismo modelo en el conjunto de prueba, trata de identificar patrones o comportamientos similares Una vez que se identifica, llega a sus conclusiones y da los resultados correspondientes.


0

Considere una tarea que requiere que normalicemos los datos. Por ejemplo, podemos usar una normalización min-max o una normalización de puntaje z. Hay algunos parámetros inherentes en el modelo. Los valores mínimo y máximo en la normalización min-max y la desviación media y estándar en la normalización de la puntuación z. La función fit () calcula los valores de estos parámetros.

Efecto de ajuste ()

La función de transformación aplica los valores de los parámetros en los datos reales y proporciona el valor normalizado.

Efecto de transform ()

La función fit_transform () realiza ambas en el mismo paso.

Efecto de fit_transform ()

Tenga en cuenta que se obtiene el mismo valor si realizamos en 2 pasos o en un solo paso.


0

"fit" calcula la media y el estándar que se utilizarán para una escala posterior . (solo un cálculo), no se te da nada .

"transform" utiliza una media calculada previamente y std para escalar automáticamente los datos (restar la media de todos los valores y luego dividirla por std).

"fit_transform" hace ambas cosas al mismo tiempo. Entonces puede hacerlo con 1 línea de código en lugar de 2.

Ahora veámoslo en la práctica:

Para el conjunto de entrenamiento X , hacemos "fit_transform" porque necesitamos calcular la media y el estándar, y luego usarlo para escalar automáticamente los datos. Para el conjunto de pruebas X , bueno, ya tenemos la media y el estándar, así que solo hacemos la parte de "transformación".

Es super simple. Lo estás haciendo genial. Sigan con su buen trabajo amigo :-)