Proste podejście do brakujących i kategorycznych wartości
Regresja Random Forest jest na tyle odporna, że pozwala pominąć wiele czasochłonnych kroków przygotowania danych. Niektóre implementacje Random Forest obsługują brakujące i kategoryczne wartości automatycznie – implementacja w PySparku tego jednak nie robi. Matematyka pozostaje ta sama, więc możemy sobie pozwolić na proste zastępowanie wartości.
Ponieważ nasze dane są ściśle dodatnie, brakującym wartościom przypiszemy -1. Random Forest podzieli dane względem tej wartości i potraktuje ją inaczej niż pozostałe wartości w tej samej cesze.
W przypadku wartości kategorycznych możemy po prostu odwzorować wartości tekstowe na liczby – Random Forest odpowiednio sobie z nimi poradzi, dzieląc na ich podstawie. W tym ćwiczeniu odświeżymy znajomość pipelines z kursu Introduction to PySpark, żeby napisać kod bardziej zwięźle. Zwróć uwagę, że ćwiczenie zaczyna się od wyświetlenia dtypes kolumn w ramce danych – porównaj je z wynikami na końcu tego ćwiczenia.
UWAGA: Pipeline i StringIndexer są już zaimportowane. Lista categorical_cols jest również dostępna.
To ćwiczenie jest częścią kursu
Inżynieria cech z PySpark
Instrukcje do ćwiczenia
- Zastąp brakujące wartości w kolumnach
WALKSCOREiBIKESCOREwartością -1, używającfillna()z parametremsubset. - Utwórz listę obiektów
StringIndexer, korzystając z list comprehension, aby iterować po każdej kolumnie wcategorical_cols. - Zastosuj
fit()itransform()do potokuindexer_pipeline. - Usuń kolumny
categorical_colsza pomocądrop(), ponieważ nie są już potrzebne. Sprawdź wynikowe typy danych, używającdtypes.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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)