Menangani Nilai Hilang dan Kategorikal secara Naif
Random Forest Regression cukup tangguh sehingga kita dapat mengabaikan banyak langkah penyiapan data yang memakan waktu dan membosankan. Meskipun beberapa implementasi Random Forest menangani nilai hilang dan nilai kategorikal secara otomatis, PySpark tidak. Namun, perhitungannya tetap sama sehingga kita bisa menggunakan penggantian nilai yang sederhana.
Untuk nilai hilang, karena data kita sepenuhnya bernilai positif, kita akan menetapkan -1. Random forest akan melakukan pemisahan (split) pada nilai ini dan menanganinya berbeda dari nilai lainnya dalam fitur yang sama.
Untuk nilai kategorikal, kita dapat memetakan nilai teks ke angka, dan random forest akan menanganinya dengan tepat dengan melakukan split berdasarkan nilai tersebut. Pada contoh ini, kita akan kembali menggunakan pipelines dari Introduction to PySpark agar kode lebih ringkas. Perhatikan bahwa latihan akan dimulai dengan menampilkan dtypes dari kolom dalam dataframe; bandingkan dengan hasil di akhir latihan ini.
CATATAN: Pipeline dan StringIndexer sudah diimpor untuk Anda. Daftar categorical_cols juga tersedia.
Latihan ini adalah bagian dari kursus
Rekayasa Fitur dengan PySpark
Petunjuk latihan
- Ganti nilai pada
WALKSCOREdanBIKESCOREdengan -1 menggunakanfillna()dan parametersubset. - Buat daftar
StringIndexerdengan list comprehension untuk mengiterasi setiap kolom dalamcategorical_cols. - Terapkan
fit()dantransform()pada pipelineindexer_pipeline. - Hapus
categorical_colsmenggunakandrop()karena tidak lagi diperlukan. Periksa tipe data hasilnya menggunakandtypes.
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
# 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)