名義特徴量と順序特徴量の話

毎日学ぶことがあるので昨日の宿題を日記に残しておく暇がなかった。相関と回帰の違い、分散と共分散の違いはなんとなく理解できたぞということだけメモしておいて、今日は「sklearnでロジスティック回帰分析をする際にカテゴリ型を数値型データに置き換える(ダミー変数にする)」ことについて書くことにする。長い。今回も例によって別の先輩とぎゃーすかやりながら勉強しました。


ロジスティック回帰分析

ってそもそも何よということから。

簡単に言うと、ある物事が「起こるか」「起こらないか」について、他の要因から推測する分析方法。例えば「今日はアイスが売れるか・売れないか」について推測するために、これまで売れた日・売れなかった日のデータ(「その日の気温」「その日の天気」「その日通りがかった人数」など)から予測を立てる方法である。


カテゴリ型を変換する理由

上のような分析をするにあたって、データの持ち方について考える必要がある。いわゆる「データ型」、数値型とか文字列型とかいうものである。

今回特に目をつけたいのは、アイス屋の例えを引き継ぐのであれば「晴れ」「曇り」「雨」のようにデータの入っている「天気」カラムだとか、「成人」「未成年」のようなデータの入った(あるいは年齢だけが入った)「店員の年齢」カラムだとか。機械は数字でしかものの価値を判断できないので、これらのデータは(0,1)の二値か、(0,1,2,3…)のような間接的にカテゴリを示す数値に置き換える必要がある。


順序特徴量と名義特徴量

しかし注意点として、それらのカテゴリの間に優劣があるか、といった問題がある。

たとえば、その日売っていたアイスの種類。全てのアイスが同じ味、しかし日ごとにS,M,Lサイズのどれかしか売らないアイス屋があったとしたら(ないだろうが……)、そのサイズには価値の優劣があるとはっきり考えられる。値段がサイズによって変わるとすれば、Sは安く、売れやすくなるだろうし、Lは高く、売れにくくなるだろう。この場合はデータに与える数値に価値の重みをつける必要がある。こうした「優劣を持つ」カテゴリのデータを「順序特徴量」という。

一方で、その日の看板の色が何色だったか、というような、価値に優劣のない(と考えられる)カテゴリのデータは、単純に(0,1)の二値で表してしまって構わない。「黄色」「赤」「青」三種類だとすれば、それぞれに(0,1), (0,1), (0,1)の判定を行っていく。結果、どれかひとつだけに1がつくことになるだろう。こういったカテゴリのデータを「名義特徴量」という。


それぞれへの対応

実際にどうしていくかという話。処理をする順番としては、「順序特徴量のダミー変数化」→「名義特徴量のダミー変数化」の順に行うのが良い。理由は後述。

順序特徴量のダミー変数化は、マッピングと呼ばれる手法で、手動で行う必要がある。

ice_mapping = {’S’: 3, ‘M’: 2, ‘L’:1}
df[‘ice_size’] = df[‘ice_size’].map(ice_mapping)

こんな感じ。この例では、S,M,Lに辞書型で数値のvalue(価値)を与え、データフレームにそれを投影している。

名義特徴量についてはpandasを使って自動的に行ってもらう。

df_dammies = pd.get_dummies(df)

こんな。get_dummies()は賢いので、数値型になっているものは素通りしてくれるが、そうでないものは一気にダミー変数に置き換える。順序特徴量のダミー変数化(手動の価値付け)より後に行ったほうが良いのはこのため。細かいところは人力で、あとは機械任せ、という感じ。

 

機械学習、少しづつ理解できてきている自覚がある。明日も一日がんばるぞい(眠いので見出しの設定は明日やります)。