文字列とカテゴリ(ファクター)
ご存じのとおり、Spark でモデリングするには数値データが必要です。ここまでは問題ありませんでした。ブール列は整数に簡単に変換できます。しかし、この先は航空会社(carrier)や目的地(destination)も特徴量として使います。これらは文字列で表現されており、素直に数値型へ変換する方法がありません。
幸い、PySpark には pyspark.ml.features サブモジュールにこれを扱うための関数が用意されています。各フライトの航空会社と目的地を表す「ワンホットベクトル」を作成できます。ワンホットベクトル はカテゴリ特徴量を表現する方法で、各観測値について、すべての要素が 0 で、最大でも 1 つの要素だけが 1 になるベクトルです。
ベクトルの各要素は特徴量の各水準に対応しており、どの要素が 1 になっているかを見ることで、その観測の該当水準が分かります。
カテゴリ特徴量をエンコードする最初のステップは StringIndexer を作ることです。このクラスのオブジェクトは Estimator で、文字列の列を含む DataFrame を受け取り、各ユニークな文字列を数値に対応付けます。その後、この Estimator は Transformer を返し、DataFrame にマッピングをメタデータとして付与し、文字列列に対応する数値列を持つ新しい DataFrame を返します。
2 つ目のステップは、この数値列を OneHotEncoder を使ってワンホットベクトルとしてエンコードすることです。これは StringIndexer とまったく同じ流れで、まず Estimator を作成し、続いて Transformer を得ます。最終的に、Machine Learning の処理に適したベクトルとしてカテゴリ特徴量をエンコードした列が得られます!
少し複雑に見えるかもしれませんが、ご安心ください。覚えるべきことは、StringIndexer と OneHotEncoder を作るという点だけで、あとは Pipeline が処理してくれます。
なぜカテゴリ特徴量をワンホットベクトルにエンコードする必要があるのでしょうか?
この演習はコースの一部です
