python - preprocessing - onehotencoder pandas
Usar mĂșltiples clases personalizadas con Pipeline sklearn(Python) (1)
Este error surge porque en el Pipeline la salida del primer estimador va al segundo, luego la salida del segundo estimador va al tercero y así sucesivamente ...
De la documentación de Pipeline :
Ajuste todas las transformaciones una tras otra y transforme los datos, luego ajuste los datos transformados utilizando el estimador final.
Entonces, para su canalización, los pasos de ejecución son los siguientes:
- Descr_df.fit (X) -> no hace nada y regresa a sí mismo
- newX = Descr_df.transform (X) -> debe devolver algún valor para asignar a newX que se debe pasar al próximo estimador, pero su definición no devuelve nada (solo se imprime). Entonces, nada se devuelve implícitamente
- Fillna.fit (newX) -> no hace nada y regresa a sí mismo
- Fillna.transform (newX) -> Llama a newX.columns. Pero newX = None desde el paso2. De ahí el error.
Solución : cambie el método de transformación de Descr_df para devolver el marco de datos tal como está:
def transform (self, X):
print ("Structure of the data: /n {}".format(X.head(5)))
print ("Features names: /n {}".format(X.columns))
print ("Target: /n {}".format(X.columns[0]))
print ("Shape of the data: /n {}".format(X.shape))
return X
Sugerencia : haga que sus clases hereden de las clases de Estimador base y Transformador en scikit para confirmar la buena práctica.
es decir, cambie la class Descr_df(object)
a la class Descr_df(BaseEstimator, TransformerMixin)
, Fillna(object)
a Fillna(BaseEstimator, TransformerMixin)
y así sucesivamente.
Vea este ejemplo para más detalles sobre clases personalizadas en Pipeline:
Intento hacer un tutorial sobre Pipeline para estudiantes pero bloqueo. No soy un experto, pero estoy tratando de mejorar. Así que gracias por tu indulgencia. De hecho, intento en una canalización ejecutar varios pasos para preparar un marco de datos para un clasificador:
- Paso 1: descripción del marco de datos
- Paso 2: Rellene los valores NaN
- Paso 3: Transformar los valores categóricos en números
Aquí está mi código:
class Descr_df(object):
def transform (self, X):
print ("Structure of the data: /n {}".format(X.head(5)))
print ("Features names: /n {}".format(X.columns))
print ("Target: /n {}".format(X.columns[0]))
print ("Shape of the data: /n {}".format(X.shape))
def fit(self, X, y=None):
return self
class Fillna(object):
def transform(self, X):
non_numerics_columns = X.columns.difference(X._get_numeric_data().columns)
for column in X.columns:
if column in non_numerics_columns:
X[column] = X[column].fillna(df[column].value_counts().idxmax())
else:
X[column] = X[column].fillna(X[column].mean())
return X
def fit(self, X,y=None):
return self
class Categorical_to_numerical(object):
def transform(self, X):
non_numerics_columns = X.columns.difference(X._get_numeric_data().columns)
le = LabelEncoder()
for column in non_numerics_columns:
X[column] = X[column].fillna(X[column].value_counts().idxmax())
le.fit(X[column])
X[column] = le.transform(X[column]).astype(int)
return X
def fit(self, X, y=None):
return self
Si ejecuto los pasos 1 y 2 o paso 1 y 3 funciona, pero si ejecuto los pasos 1, 2 y 3 al mismo tiempo. Tengo este error:
pipeline = Pipeline([(''df_intropesction'', Descr_df()), (''fillna'',Fillna()), (''Categorical_to_numerical'', Categorical_to_numerical())])
pipeline.fit(X, y)
AttributeError: ''NoneType'' object has no attribute ''columns''