es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo normalizar los datos de prueba y entrenamiento cuando tienen un número diferente de filas.

Tengo un dataframe d y una de las columnas es price (Numérico) con 109248 filas. Dividí los datos en dos partes d_train y d_test. d_train tiene 73196 valores y d_test tiene 36052 valores. Ahora, para normalizar d_train['price'] y d_test['price'], hice algo como esto…

price_scalar = Normalizer()
X_train_price = price_scalar.fit_transform(d_train['price'].values.reshape(1, -1)
X_test_price = price_scalar.transform(d_test['price'].values.reshape(1, -1))

Ahora tengo este problema

ValueError                                Traceback (most recent call last)
<ipython-input-20-ba623ca7bafa> in <module>()
3 X_train_price = price_scalar.fit_transform(X_train['price'].values.reshape(1, -1))
----> 4 X_test_price = price_scalar.transform(X_test['price'].values.reshape(1, -1))
/usr/local/lib/python3.7/dist-packages/sklearn/base.py in _check_n_features(self, X, reset)
394         if n_features != self.n_features_in_:
395             raise ValueError(
397                 f"espera {self.n_features_in_} características como entrada."
398             )
ValueError: X tiene 36052 características, pero Normalizer espera 73196 características como entrada.

Haciendo el cambio: reshape(-1,1) en lugar de reshape(1,-1) se ejecuta correctamente, pero establece todos los valores de la columna price en 1.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema que enfrenta el usuario se debe a la forma incorrecta de la entrada pasada a los métodos fit_transform y transform de la clase Normalizer.

    El fragmento de código X_train_price = price_scalar.fit_transform(d_train['price'].values.reshape(1, -1) intenta redimensionar la columna price de d_train en una matriz de forma (1, -1), lo que significa un vector de fila con un número desconocido de columnas. De manera similar, X_test_price = price_scalar.transform(d_test['price'].values.reshape(1, -1)) intenta redimensionar la columna price de d_test a la misma forma.

    Sin embargo, la forma correcta para los datos de entrada a Normalizer es (n_samples, n_features), donde n_samples es el número de muestras y n_features es el número de características en los datos. En este caso, n_samples debería ser el número de filas en la columna price y n_features debería ser 1, ya que solo hay 1 característica en la columna.

    Para lograr esta forma, se debe utilizar reshape(-1, 1) en lugar de reshape(1, -1) de la siguiente manera:

    X_train_price = price_scalar.fit_transform(d_train['price'].values.reshape(-1, 1))
    X_test_price = price_scalar.transform(d_test['price'].values.reshape(-1, 1))
    

    Esto redimensionará la columna price en un vector columna de forma (n_samples, 1), que es la forma de entrada correcta para Normalizer.

    Sin embargo, el usuario debe tener en cuenta que usar Normalizer de esta manera puede no ser apropiado para sus datos, ya que normaliza cada muestra (es decir, fila) de manera independiente para que tenga una norma unitaria. Esto puede no ser el método de normalización deseado para la columna price, que puede beneficiarse de otras técnicas de normalización como la escala min-max, la normalización z-score, etc. El usuario debe elegir la técnica de normalización apropiada para su caso específico basado en la distribución de los datos y los requisitos del algoritmo de aprendizaje automático que se está utilizando.

Comments are closed.