機械学習

決定木とは?PythonとRで実装してみよう!

こんにちは!デジタルマーケターのウマたん(@statistics1012)です。

有名な機械学習手法の一つに決定木があります!非常に良く使われる王道な手法です。

今回はそんな決定木について見ていきましょう~!

ウマたん
ウマたん
決定木は非常に分かりやすくてよく使われる手法だよね!
ロボたん
ロボたん
決定木は機械学習手法の基本となる手法だね!決定木について詳しく見ていきその特徴を学んでいこう!そしてRとPythonで実装していこう!

さて、決定木について徹底的に見ていきましょう!

決定木とは

比較的新しい文献から決定木に関する記述を引用してみましょう!2009年の論文です。

CART is a rule-based method that generates a binary tree through binary recursive partitioning that splits a subset (called a leaf) of the data set into two subsets (called sub-leaves) according to the minimization of a heterogeneity criterion computed on the resulting sub-leaves. Each split is based on a single variable; some variables may be used several times while others may not be used at all.
引用元:Google-“CART algorithm for spatial data: Application to environmental and ecological data”

決定木の分類アルゴリズムの1つであるCARTの説明について述べてあります。詳しく知りたい方は論文を見てみてください。

決定木っていうのはその名の通り木構造でデータ分類していく手法で、そこそこの精度と結果の視認性から実務の場で良く用いられています!

非常に簡易的ですが、会員か非会員かどうかを多くの変数で判断するような判別を行うとします。その時、まずは性別のよる影響が強いようなので性別で分類、続いて年齢による影響が強いようなので年齢で分類・・・

このように木構造が下に伸びていって分類することができます。

分類された箱をノードと呼びます。そしてもうこれ以上分類されない最後のノードをターミナルノードと呼びます。この図の例だと、男性・子供・大人がターミナルノードですね。

もっと一般的な例で考えてみましょう!

こんな感じ!この例は3つのカテゴリー質的変数をX,Yの説明変数を用いて上手く分類している例です!

こんな感じで分類したあとに視覚的にどんな変数が一番分類に効いているのかなどが分かりやすいのが特徴です!

決定木のアルゴリズム(CART)

それでは、そんな決定木のアルゴリズムを見ていきましょう!決定木のアルゴリズムはいくつかあるんですが、最も有名なのがCART!先ほどの論文でもCARTが用いられていましたね。

CARTは決定木の数あるアルゴリズムの中でも最も良く使われる手法であり、L.Breimanらによって1970年代初めごろから研究が始められ、1980年代の前半に公開されたアルゴリズムです。

元田先生らが書いたデータマイニングの基礎を参考にしてみていきましょう!

CARTは目的変数を最も効果的に分類できるように、 Gini係数という指標を用いて分岐を行います。

Gini係数はクラスの偏り具合を表す指標であり、不純度と表現されます。特定のクラスのデータばかりであるほど0に近く、どのクラスも均等に存在する場合に大きな値を取る性質を持ちます。

Gini係数は以下の式で表され、この値は小さければ小さいほど良いということが分かっています。

\(GINI(t)=1-\displaystyle \sum_{ j = 1 }^{ k } p^2{(j|t)}\)

この時、\(p{(j|t)}\)はノードt内のクラスjの割合を示します。

(引用元:データマイニングの基礎 (IT Text))

Gini係数を計算後、親ノードと子ノードのGini係数の差が大きいものを分岐の条件として選びます。

そして分割できなくなるまで続けていき、最終的にそれぞれのデータが属するノードのことをターミナルノードと呼びます。

Rを使って決定木分析を実装してみよう!

それでは、最後に決定木を用いた分析を行ってみましょう!

データはなんでも良いんですが、簡易的にRにデフォルトで入っているirisデータを使いましょう!あやめの種類を分類したデータで目的変数は3カテゴリーの質的変数、説明変数は花びらの幅とか4つです。

サンプルは150個で、分類しやすいデータなのでどんな手法でも割と簡単に分類できるんですが、どうなるでしょう!

今回は決定木以外にランダムフォレストSVMニューラルネットワークで比較しました。

ちなみにランダムフォレストは決定木とアンサンブル学習を組み合わせた協力な機械学習手法。

 

結果はこんな感じになりました!

どれもいい感じに分類できてますね~!

本来は何回かシミュレーションやって誤判別率の平均取った方がいいんですが、今回は簡易的に行いました!

Pythonを使って決定木分析を実装してみよう!

続いて決定木についてPythonを使って分類していきましょう!

Pythonでもirisデータを使用していきます。

Rの場合はirisデータにそのままデータセットがデータフレーム型で入っていましたが、Pythonの場合は説明変数データとそれに紐づくラベルデータ、変数名などがリストで入っていることに注意しましょう!

そのためirisからデータを取り出す作業をしています。

ロボたん
ロボたん
Pythonでもこんなに簡単に実装が出来るんだね!
ウマたん
ウマたん
RでもPythonでも非常に簡単だよ!それぞれ良いところがあるので気になる場合は以下の記事を見てみるとよいよ!
統計解析を行う上で便利なプログラミング言語を比較!統計学を学ぶにあたって必要なプログラミングのスキル。 世の中にはプログラミング言語を使わずとも統計処理を扱えるソフトウェアが存在し...
ウマたん
ウマたん
Pythonの勉強は以下の記事をチェック!
【入門】初心者が3か月でPythonを習得できるようになる勉強法!当ブログ【統計ラボ】の本記事では、Pythonを効率よく習得する勉強法についてまとめていきます。Pythonはできることが幅広いので自分のやりたいことを明確にして勉強法を選ぶことが大事です。...

決定木 まとめ

決定木は簡単に実装できて、かつ結果も分かりやすい優秀な手法です。

是非使ってみてください!

決定木に関しては以下の書籍を読むといい感じに載っていますので読んでみると良いでしょう!

ちなみに決定木をはじめとした機械学習手法に関して深く勉強したい方はこちらにオススメ本をまとめていますのでご覧ください!

厳選8冊!機械学習を勉強する上でおすすめな本!こんにちは!消費財メーカーでデジタルマーケ&データサイエンティスト的なお仕事をしているウマたん(@statistics1012)です。 ...
Pythonを初学者が最短で習得する勉強法

Pythonを使うと様々なことができます。しかしどんなことをやりたいかという明確な目的がないと勉強は捗りません。

Pythonを習得するためのロードマップをまとめましたのでぜひチェックしてみてくださいね!