カテゴリーデータの前処理

こんにちは!なんだかんだ久しぶりの投稿になりました。
今回はカテゴリーデータの前処理について書いていきます。
機械学習において分類問題や回帰問題を扱うにしてもトレーニングデータがすべて数値であれば扱いやすいです。
しかし必ずしもそうとは限りません。文字列などが出てくることも当然あります。
例えば服を例にしましょう。特徴量としていろいろあると思いますが数値特徴量の例は値段ですね。
しかし服の特徴量は当然それ以外にもあります。例えばサイズ。Sサイズ、Mサイズ、Lサイズなどです。
でもこれは数値じゃないだけで並べ替えや順位付けが可能な値です。そのようなものを「順序特徴量」といったりします。
それ以外にも服の色という特徴量もあります。これは赤色、青色、黄色などです。これに関しては順序はありません。そのような特徴量を「名義特徴量」といいます。

このようなものを機械学習で正しく理解させるためには整数に変換させる必要があります。今回はどのようにして変換すればいいのかscikit-learnを使って紹介します

まずはサンプルデータから

結果は以下のように表示されます

今回はこのサンプルを使ってやっていきます

順序特徴量の場合

今回のサンプルの場合ではsizeにあたる部分です。残念ながら今の機械学習のライブラリーの中で順序特徴量を正しく変換してくれるものは私が知る限り存在しません。
なので明示的にしてあげなければなりません。サイズの場合ですと例えばXL = L + 1 = M + 2 = S + 3のような形です

では変換していきましょう

結果以下のようになります

また元に戻したい場合逆マッピングをしてあげればいいです。

クラスラベルのエンコーディングについて

大体の機械学習ではクラスラベルは数字であるほうが好ましいです。scikit-learnの分類用の推定器には内部で整数変換するものもありますがクラスラベルを整数の配列として提供して変換させてあげるほうが技術的ミスを回避してあげられていい方法になります。ではやってみましょう

結果は以下のようになります

名義特徴量の場合

最後に名義特徴量の場合を見ていきましょう。2つの方法を紹介します
1つ目はOneHotEncoderを使う方法です

この時点の結果は以下のようになる

このままだとyellow > red > green > blueと勘違いしてしまう。そこで以下の処理をする

結果は以下のようになる

となり、左からblule,green,red,yellowの順で該当するものが1、それ以外が0の値を持つようになった。

同じような結果を得るにはもう一つpandasを使ったやり方がある

以下が結果です

今回はカテゴリーデータの前処理についてでした。これがちゃんとできないと機械学習がうまく分類できない、回帰できないということになりますね。
参考にしていただければと思います