始める無料で始める

欠損値とカテゴリ値の素朴な扱い方

Random Forest Regression は堅牢なので、時間がかかって面倒な前処理の多くを省略できます。Random Forest の一部の実装は欠損値やカテゴリ値を自動で処理しますが、PySpark の実装はそうではありません。とはいえ数理的には同じなので、素朴な値置換で対応できます。

欠損値については、今回のデータはすべて正の値なので、-1 を代入します。random forest はこの値で分割し、同じ特徴量内の他の値とは別扱いにします。

カテゴリ値については、テキスト値を数値にマップすれば、やはり random forest がそれらで分割して適切に扱います。この例では、コードを簡潔に書くため、Introduction to PySpark で扱った pipelines を再び使います。演習の冒頭でデータフレームの各列の dtypes が表示されます。演習の最後の結果と見比べてください。

NOTE: PipelineStringIndexer はすでにインポート済みです。リスト categorical_cols も利用できます。

この演習はコースの一部です

PySparkで学ぶ特徴量エンジニアリング

コースを見る

演習の手順

  • fillna()subset パラメータを使って、WALKSCOREBIKESCORE の値を -1 に置き換えてください。
  • リスト内包表記で categorical_cols の各列を反復し、StringIndexer のリストを作成してください。
  • パイプライン indexer_pipeline に対して fit()transform() を適用してください。
  • もはや不要な categorical_colsdrop() で削除してください。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)
コードを編集して実行