Tratamiento ingenuo de valores ausentes y categóricos
Random Forest Regression es lo bastante robusto como para permitirnos ignorar muchos de los pasos de preparación de datos más tediosos y que consumen tiempo. Aunque algunas implementaciones de Random Forest gestionan automáticamente los valores ausentes y categóricos, la de PySpark no lo hace. Sin embargo, las matemáticas son las mismas, así que podemos apañarnos con algunos reemplazos sencillos.
Para los valores ausentes, como nuestros datos son estrictamente positivos, asignaremos -1. El random forest dividirá sobre este valor y lo tratará de forma diferente al resto de valores de la misma característica.
Para los valores categóricos, podemos mapear los valores de texto a números y, de nuevo, el random forest los tratará adecuadamente dividiendo sobre ellos. En este ejemplo, recuperaremos pipelines de Introduction to PySpark para escribir el código de forma más concisa. Ten en cuenta que el ejercicio empezará mostrando los dtypes de las columnas del dataframe; compáralos con los resultados al final de este ejercicio.
NOTA: Pipeline y StringIndexer ya están importados para ti. La lista categorical_cols también está disponible.
Este ejercicio forma parte del curso
Ingeniería de características con PySpark
Instrucciones del ejercicio
- Sustituye los valores en
WALKSCOREyBIKESCOREpor -1 usandofillna()y el parámetrosubset. - Crea una lista de
StringIndexerusando una list comprehension para iterar por cada columna encategorical_cols. - Aplica
fit()ytransform()al pipelineindexer_pipeline. - Elimina
categorical_colsusandodrop()porque ya no son necesarias. Inspecciona los tipos de datos resultantes condtypes.
ejercicio interactivo práctico
Prueba este ejercicio completando este código de ejemplo.
# Replace missing values
df = df.____(____, ____=[____, ____])
# Create list of StringIndexers using list comprehension
indexers = [____(inputCol=____, outputCol=____+"_IDX")\
.setHandleInvalid("keep") for ____ in ____]
# Create pipeline of indexers
indexer_pipeline = Pipeline(stages=indexers)
# Fit and Transform the pipeline to the original data
df_indexed = ____.____(df).____(df)
# Clean up redundant columns
df_indexed = df_indexed.____(*____)
# Inspect data transformations
print(df_indexed.dtypes)