Наївна обробка пропусків і категоріальних значень
Random Forest Regression є достатньо стійким, тож ми можемо оминути багато трудомістких і нудних кроків підготовки даних. Хоча деякі реалізації Random Forest автоматично працюють з пропущеними та категоріальними значеннями, у PySpark цього немає. Однак математика лишається тією самою, тож ми можемо дозволити собі наївні заміни значень.
Для пропущених значень, оскільки наші дані строго додатні, призначимо -1. Random forest розділятиме за цим значенням і оброблятиме його інакше, ніж решту значень у тій самій ознаці.
Для категоріальних значень ми можемо просто відобразити текстові значення у числа, і знову ж таки random forest коректно їх обробить, виконуючи розбиття за цими значеннями. У цьому прикладі ми знову скористаємося pipelines з Introduction to PySpark, щоб писати код лаконічніше. Зверніть увагу, що вправа розпочнеться з показу dtypes стовпців у датафреймі; порівняйте їх із результатами наприкінці цієї вправи.
ПРИМІТКА: Pipeline і StringIndexer уже імпортовано для вас. Список categorical_cols також доступний.
Ця вправа є частиною курсу
Опрацювання ознак у PySpark
Інструкції до вправи
- Замініть значення у
WALKSCOREіBIKESCOREна -1 за допомогоюfillna()та параметраsubset. - Створіть список
StringIndexerза допомогою спискової генерації, ітеруючись кожним стовпцем уcategorical_cols. - Застосуйте
fit()іtransform()до конвеєраindexer_pipeline. - Видаліть
categorical_colsза допомогоюdrop(), оскільки вони більше не потрібні. Перевірте типи результатних даних за допомогоюdtypes.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
# 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)