Kaggleのデータセットを使って特徴量を観察する その1

最近、特徴量の観察、選択がとても大事だと実感した。
それもあって深層学習の勉強とは別に、データサイエンスの勉強もしようと思ってこの本を読んでいる。

www.amazon.co.jp

まだ7章ほどだけどもためになることが結構書いてあっていい。自分の言語処理能力が低いのか翻訳が少し難しい気がする。

この本で得た現状の知識を残したいのとインターンでの経験を忘れないようにするため自分で特徴を選択してモデルを作るということをやって見た。

まずは何のデータセットを使うか。成り行きでKaggleのアカウントを作成したのでKaggleにあるダウンロードして良いデータセットを探してくる。
選んだのはキノコの分類のデータセット。食用か毒ありかの2クラス分類のようだ。

https://www.kaggle.com/uciml/mushroom-classification

本によるとデータマイニングは以下のようなサイクルで行われる。

f:id:Owatank:20170920154317p:plain

折角なのでこのサイクルの流れに沿ってく

ビジネスの理解

解決すべき問題を理解する。今回このステップでは特に悩む必要もないかな。
あるキノコのデータからそれが食用か、毒ありかを判定する分類問題を解くくらいでいいだろう。

データの理解

データは問題を解決するための材料になる。でもこのステップでは問題に必要なデータ取得にかかるコスト、そこから得られる利益を見積もるなどを考えるステップっぽいので今回は利益として分類モデルを解決することで毒キノコに当たる人が減って(・∀・)イイ!! ということにしよう。

データの準備

分析ができるようにデータを表形式に変換する処理や欠損値を除外する処理などを行うステップ。ここが一番大事なステップ。
データの中から重要な情報価値のある変数や属性を見つけたり選択することがデータマイニングの基本らしい。情報価値のある属性とは予測値をより確実なものにすることができる属性のこと。相関に似ている。

というわけで分析していこう。コードはいつも通りここ

目的は2クラス分類に使えそうな特徴を発見、選ぶこと。

ノートブックを見ればわかる通り、キノコのCSVファイルを読み込むと以下のようなデータセットがあることがわかる。
f:id:Owatank:20170920155757p:plain

cap-shapeとかが何を表すのかはこのサイトを参考にすれば理解できる。

https://edu.deepanalytics.jp/datasets/19

最初つぼとかつばとかわからなかった。そういえばつぼ焼きとかありましたね・・・

データセットは全8124件で、そのうち食用が4208件、毒ありが3916件。あまり偏りがなくてよかった。

数値データとして扱いたいので数値データに直しつつ、散布図で相関を見ていく。
f:id:Owatank:20170920160253p:plain

cap-shape,bruises, odor, gill-spacing, stalk-surface-below-ring, ring-type, spore-print-color, populationあたりが使えそうなことがわかったのでこれらにまずは絞ってみることにする。

絞ったのはいいが、選んだ特徴量がどれだけ情報価値を持っているかのわからない。
この問題に対しては情報価値の指標として、エントロピーを用いることができるようだ。

エントロピーといえば最近リリースしたアプリのマスコットキャラクターしか思い浮かばないが、ここでのエントロピーはある属性で絞ったデータの集まりにおいての乱雑さを測る尺度として使われる。乱雑さというのは絞ったデータの集まりにおいて、クラスAとクラスBがどれだけ別れているかの具合。

f:id:Owatank:20170920161959p:plain

上の画像だとある属性で分けた結果、ほぼ綺麗にクラスが分けられているのでエントロピーが小さくなる。

数式ではこう定義される
f:id:Owatank:20170920162453p:plain

logの底は2。p_i はデータセットに存在するクラスの目的変数(ラベル)が i という値である確率(相対的な割合)。
あるデータセットに10個のデータが存在して、全てラベルが同じなら、 p_i = 10 / 10 = 1 になりこの時、log(p_i)は最小の値 0 となる。

計算したエントロピーから情報価値(IG)は次のように計算する。
元のデータセットを親として、属性で分割したデータセットを子と表すとして、

IG(親、子) = エントロピー(親) - { p(c1)エントロピー(c1)+p(c2)エントロピー(c2)+.. }

ある子セット c_i のエントロピーに、その子セット中のインスタンスの数(割合)に応じた重み付けを行っている。
この重みによって分割したデータセットのデータが1個の場合、重みは小さくなるからIGにはあまり影響を与えなくなるんだな。

これらの式に従い、選んだ各特徴のIGを計算していくと次のようになった
f:id:Owatank:20170920164242p:plain

IG値を見る限りcap-shapegill-spacingは特徴として使わなくても良さそうなことがわかった。
またodorなどがかなり分類に対して貢献できそうなこともわかる。

次はcap-shapegill-spacingを除いた選んだ特徴でモデルを構築して見る。