Enkel hantering av saknade och kategoriska värden
Random Forest Regression är tillräckligt robust för att vi ska kunna bortse från många av de mer tidskrävande och omständliga förberedelsestegen. Vissa implementationer av Random Forest hanterar saknade och kategoriska värden automatiskt, men inte PySpark:s. Matematiken är dock densamma, så vi kan klara oss med några enkla ersättningsvärden.
Eftersom våra data är strikt positiva tilldelar vi saknade värden -1. Random forest-modellen kommer att dela på det här värdet och behandla det annorlunda än övriga värden i samma särdrag.
För kategoriska värden kan vi helt enkelt mappa textvärden till tal – random forest hanterar dem på lämpligt sätt genom att dela på dem. I det här exemplet plockar vi fram pipelines från Introduktion till PySpark för att skriva koden mer koncist. Observera att övningen börjar med att visa dtypes för kolumnerna i dataramen – jämför dem med resultaten i slutet av övningen.
OBS: Pipeline och StringIndexer är redan importerade. Listan categorical_cols är också tillgänglig.
Den här övningen är en del av kursen
Feature Engineering med PySpark
Övningsinstruktioner
- Ersätt värdena i
WALKSCOREochBIKESCOREmed -1 med hjälp avfillna()och parameternsubset. - Skapa en lista med
StringIndexers genom listomfattning för att iterera över varje kolumn icategorical_cols. - Använd
fit()ochtransform()på pipelinenindexer_pipeline. - Ta bort
categorical_colsmeddrop()eftersom de inte längre behövs. Inspektera resultatets datatyper meddtypes.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
# 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)