【Python】カテゴリーデータの数値化方法(one-hot表現化など)

プログラミング

今回はPythonでデータ解析やる前に必ず必要となるデータの前処理の一つである、カテゴリーデータの数値化方法をご紹介します。今回参考にしたのは、以下の参考書です。

 

 

また、実装はGitHubにあげています。

Daisuke0209/preprocessing
Contribute to Daisuke0209/preprocessing development by creating an account on GitHub.

【Python】テストデータの作成

まずは、今回使うテストデータをpandasのDataFrame形式で定義します。

color size price classlabel
0 green M 10.1 class1
1 red L 13.5 class2
2 blue XL 15.3 class1

データのイメージは、Tシャツのデータと考えてください。各Tシャツごとに色・サイズ・値段・ラベル(文字列)があるイメージです。

【Python】順序特徴量の数値化

まずは順序を持つカテゴリ値を数値化します。ここで順序を持つ特徴量というと、サイズになります(M<L<XL)。これを数字に対応させてやります。

color size price classlabel
0 green 1 10.1 class1
1 red 2 13.5 class2
2 blue 3 15.3 class1

各サイズに対応させて(M=1、L=2、XL=3)、数値化することができました。

【Python】クラスラベルのエンコーディング

次に、各Tシャツのクラス(classlabel)を数値化してみます。まずは各クラスに対して各々数字を割り振ります。

ここで使用しているnp.uniqueは重複しているものを省いて出力する関数になります。下の例を見るとよく分かると思います。

各クラスと数値の対応関係を持つ辞書型のclass_mappingを用いて、classlabelの数値化を行います。

color size price classlabel
0 green 1 10.1 0
1 red 2 13.5 1
2 blue 3 15.3 0

数値化されたクラスを元の文字型に戻すには、class_mappingのキーと値を逆にした辞書型のinv_class_mappingを作り、同様の変換をしてやることでできます。

inv_class_mappingを用いて、

color size price classlabel
0 green 1 10.1 class1
1 red 2 13.5 class2
2 blue 3 15.3 class1

また、以下のようにsklearnのLabelEncoderというクラスを利用することでも、カテゴリーデータの数値化は可能です。

また、元に戻すにはinverse_transformメソッドを使用します。

【Python】カテゴリーデータのone-hot表現化

最後にテストデータのcolor特徴量に対する変換を考えてみる。まず、色には順序が無い。そのため、赤・青・黄で例えば0・1・2という数字を割り振った場合、機械学習モデルは赤よりも青が大きい、青よりも黄色が大きいと考えるようになる。順序が無いカテゴリーデータに対して、このような想定がなされるのは問題であることが分かる。そこで、登場するのがone-hot表現化という手法である。実際にやってみる。pandasのget_dummies関数を使用することで簡単にone-hot表現化が可能となる。

price size color_blue color_green color_red
0 10.1 1 0 1 0
1 13.5 2 0 0 1
2 15.3 3 1 0 0

どういう変換なされたか分かるだろうか。今回のテストデータでは、color特徴量には’blue’、’green’、’red’の3種類があった。この場合、one-hot表現化では、color特徴量を3つの特徴量(color_blue,color_green,color_red)に変換する。例えば、index=0のTシャツのcolorはgreenだった。この場合、color_greenのみ1が入り、color_blue・color_redには0が入る。説明が下手くそだが、これがone-hot表現化といわれる変換方法である。

自然言語解析をする際に、言葉を数値化(ベクトル化)する必要があるが、この場合にもone-hot表現化が使用される場合がある。しかしながら、言葉のword数が増えれば増えるほど、one-hot表現化によってできる特徴量がどんどん増えていってしまう。そのため、新しい言葉に対応するのが難しくなるため、実際にはone-hot表現化は自然言語処理ではあまり使われない。自然言語処理においてよく使われる言葉の数値化(ベクトル化)方法はword2vecと言われるものであり、当ブログでも依然に一度ご紹介したので、興味がある方はぜひ見てください。

【Python】word2vecを使って企業を格付けしてみる
いかにもキャッチー?なタイトルで申し訳ありません。先日、word2vecの存在を知ったので、試しで使ってみました。word2vecは応用範囲が広いですが、今回はかんたーんに、企業の格付けに使ってみたいと思います。

まとめ

今回はPythonにおけるカテゴリーデータの扱い方をご紹介しました!

また、機械学習を勉強するための参考書を以下で紹介しています!よかったら見ていってください。

機械学習を勉強するためのオススメ参考書(理論・Python・Webアプリ)
統計・機械学習に関しては授業で習ったところありますが、結構忘れてしまっています(。また、Rの演習の授業はありましたが、Pythonは学生のころには使っていません。機械学習・データサイエンスを勉強するにあたり、私が参考にしている参考書を一挙ご紹介したいと思います。

コメント