欠損値とカテゴリ値の素朴な扱い方
Random Forest Regression は堅牢なので、時間がかかって面倒な前処理の多くを省略できます。Random Forest の一部の実装は欠損値やカテゴリ値を自動で処理しますが、PySpark の実装はそうではありません。とはいえ数理的には同じなので、素朴な値置換で対応できます。
欠損値については、今回のデータはすべて正の値なので、-1 を代入します。random forest はこの値で分割し、同じ特徴量内の他の値とは別扱いにします。
カテゴリ値については、テキスト値を数値にマップすれば、やはり random forest がそれらで分割して適切に扱います。この例では、コードを簡潔に書くため、Introduction to PySpark で扱った pipelines を再び使います。演習の冒頭でデータフレームの各列の dtypes が表示されます。演習の最後の結果と見比べてください。
NOTE: Pipeline と StringIndexer はすでにインポート済みです。リスト categorical_cols も利用できます。
この演習はコースの一部です
PySparkで学ぶ特徴量エンジニアリング
演習の手順
fillna()とsubsetパラメータを使って、WALKSCOREとBIKESCOREの値を -1 に置き換えてください。- リスト内包表記で
categorical_colsの各列を反復し、StringIndexerのリストを作成してください。 - パイプライン
indexer_pipelineに対してfit()とtransform()を適用してください。 - もはや不要な
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)