Tratando Valores Ausentes e Categóricos de Forma Ingênua
Random Forest Regression é robusto o suficiente para permitir que a gente ignore muitas etapas de preparação de dados que são demoradas e tediosas. Embora algumas implementações de Random Forest lidem automaticamente com valores ausentes e categóricos, a do PySpark não. A matemática, no entanto, continua a mesma, então podemos usar algumas substituições simples de valores.
Para valores ausentes, como nossos dados são estritamente positivos, vamos atribuir -1. A random forest vai dividir com base nesse valor e tratá-lo de forma diferente do restante dos valores na mesma feature.
Para valores categóricos, podemos apenas mapear os valores de texto para números e, novamente, a random forest vai tratá-los adequadamente ao dividir neles. Neste exemplo, vamos tirar o pó de pipelines da Introduction to PySpark para escrever nosso código de forma mais concisa. Observe que o exercício começará exibindo os dtypes das colunas no dataframe; compare-os com os resultados ao final deste exercício.
NOTA: Pipeline e StringIndexer já foram importados para você. A lista categorical_cols também está disponível.
Este exercício faz parte do curso
Feature Engineering com PySpark
Instruções do exercício
- Substitua os valores em
WALKSCOREeBIKESCOREpor -1 usandofillna()e o parâmetrosubset. - Crie uma lista de
StringIndexers usando list comprehension para iterar por cada coluna emcategorical_cols. - Aplique
fit()etransform()ao pipelineindexer_pipeline. - Remova as
categorical_colsusandodrop()já que não são mais necessárias. Inspecione os tipos de dados resultantes usandodtypes.
Exercício interativo prático
Experimente este exercício completando este código de exemplo.
# 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)