Python

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

決定木
ウマたん
ウマたん
本記事では、機械学習手法の基本である決定木について見ていきたいと思います。アルゴリズムが分かりやすく実務でもよく使われる手法です。RとPythonでの簡単な実装も合わせておこなっていくので是非チェックしてくださいね!

こんにちは!

データサイエンティストのウマたん(@statistics1012)です。

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

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

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

それでは、決定木について徹底的に見ていきましょう!

決定木の概要を掴んだあと、RとPythonで実装してみて最終的に決定木を使った応用手法も取り上げていきますよ!

Youtubeでも解説しているので、ぜひこちらもチェックしてみてください!

決定木とは

ハテナ

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

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/R/Stan/SQL」を比較していきます。それぞれのプログラミング言語にどのような特徴があるのか、どのように勉強していけばよいのか見てきますよー!...
ウマたん
ウマたん
Pythonの勉強は以下の記事をチェック!
【独学入門】初心者が3か月でPythonを習得できるようになる勉強法!当ブログ【スタビジ】の本記事では、Pythonを効率よく独学で習得する勉強法を具体的なコード付き実装例と合わせてまとめていきます。Pythonはできることが幅広いので自分のやりたいことを明確にして勉強法を選ぶことが大事です。...

決定木を使った応用手法

macとsurface

さて、最後にそんな決定木を応用した手法群について見ていきましょう!

決定木単体ではそれほど高い精度は見込めないのですが、アンサンブル学習という方法と組みわせることで最強の精度を叩きだす手法になります。

アンサンブル学習とは簡単に言うと、複数モデルを作って色んな方法で組み合わせる手法です。

アンサンブル学習とは?バギングとブースティングとスタッキングの違い当サイト【スタビジ】の本記事では、アンサンブル学習についてまとめていきます!アンサンブル学習とは機械学習を学ぶ上で非常に重要な考えであり、いくつかのモデルを組み合わせて汎化能力を上げるもの。有名なランダムフォレストやXgboostなどもアンサンブル学習によって生み出されているんです!...

ここでは、そんな「決定木×アンサンブル学習」としてランダムフォレストXgboostLightGBMについて解説していきます。

ランダムフォレスト

ランダムフォレストでは、決定木を複数個作ってそれらの多数決で最終的な結果を決めます。

バギング ランダムフォレスト

この方法はアンサンブル学習の中でもバギングと呼ばれます。

分類の時は多数決ですし、回帰の時は平均を取ります。

通常の決定木よりも大幅な精度向上が見込めるんです。

詳しくは以下の記事でまとめています!

ランダムフォレストとは?PythonとRで実装してみよう!当サイト【スタビジ】の本記事では、決定木をアンサンブル学習することにより汎化能力を高めた強力な機械学習手法「ランダムフォレスト」について見ていきましょう!アルゴリズムを確認した後にRでもPythonでも実装をおこなっていきますよー!...

XGBoost

続いてはXgboost。

Xgboostでもランダムフォレストと同様に複数の決定木を生成し学習していくのですが、若干学習方法が違います。

ランダムフォレストは並列に複数個の決定木を生成して多数決を取るタイプでしたが、
Xgboostは直列に複数の決定木を生成して精度を改善していくタイプ。

勾配ブースティング

前の決定木では上手く判別できなかった部分に焦点を当てて次の決定木で学習していくイメージです。

単体だと上手く判別できない要素も複数の決定木を直列に組み合わせることで判別できるようになるんですよねー!

ランダムフォレストはバギングと呼ばれるアンサンブル学習を使っていましたが、Xgboostではブースティングと呼ばれるアンサンブル学習を使っています。

ちなみにXgboostの方が高い精度が見込めるので、特に何も考えずXgboostを使うことが多いです。

XGBoostについては以下の記事でまとめています!

XGboostとは?理論とPythonとRでの実践方法!当ブログ【スタビジ】の本記事では、機械学習手法の中でも非常に有用で様々なコンペで良く用いられるXgboostについてまとめていきたいと思います。最後にはRで他の機械学習手法と精度比較を行っているのでぜひ参考にしてみてください。...

LightGBM

XGBoostを改良した最強の手法がこちらのLightGBM!

LightGBMは決定木の学習方法がXGBoostと若干違い、効率よく学習していくことが可能なんです。

そのため学習スピードが圧倒的に速く、Mnistのデータを分類した場合約10倍ほどの差が生まれました。

以下の記事でLightGBMについて詳しくまとめています!

Light GBM
Light GBMの仕組みとPythonでの実装を見ていこう!当ブログ【スタビジ】の本記事では、最強の機械学習手法「Light GBM」についてまとめていきます。Light GBMは決定木と勾配ブースティングを組み合わせた手法で、Xgboostよりも計算負荷が軽い手法として注目を集めています。...

決定木の勉強法

そんな決定木をより深く、そしてさらなる機械学習手法の架け橋となるための勉強方法についてまとめていきます!

書籍で理論を勉強する

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

決定木は機械学習手法の基本のキです。

決定木から他の機械学習手法まで広範に押さえています。

Udemyで実装を勉強する

理論は書籍で勉強するほうがオススメですが、実際のデータを加工して決定木を実装していく過程を学ぶならUdemyのオンライン動画がオススメです!

Udemyは世界最大の教育プラットフォームで、色々な講座を展開しています。

その中でも以下の講座がオススメ!

【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門

Udemy コース データサイエンス
【オススメ度】
【講師】オプトのデータサイエンティスト
【時間】8.5時間
【レベル】初級~中級

データサイエンスにおける非常に重要な要素を基礎から学べます。

簡単な単回帰分析から決定木までを使って回帰と分類問題を解いていくコース。

課題定義や分析において気を付けるべきところについても学べるので実務においても役立つ内容です。

データ分析においては基礎分析が大事なんですよねー!

DescribeやShapeなど基本的なPythonの関数を使ってデータの統計量をながめ→分布にしてみたり、外れ値・欠損値に注意したり、と地味だけど重要なエッセンスがつまっていますよー!

実際に手を動かしながらSignateのコンペにコードを提出します。

8.5時間なのでサクッと学べるけどだいぶ濃い内容でした。

データ解析コンペではKaggleが有名ですが、Signateという国産コンペもあるんですねー!

\30日間返金無料/

決定木 まとめ

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

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

決定木は機械学習に序章にすぎません。

機械学習の世界は決定木をはじまりに大きく広がります。

ロボたん
ロボたん
決定木は機械学習の基本なんだね!
ウマたん
ウマたん
そうなんだ!ぜひ決定木をきっかけに機械学習の世界にのめり込んでいこう!

機械学習手法に関して深く勉強したい方は以下の記事を参考にしてみてください!

機械学習入門に必要な知識と独学勉強方法をPythonとRの実装と一緒に見ていこう!当サイト【スタビジ】の本記事では、入門者向けに機械学習についてカンタンにまとめていきます。最終的にはどのように機械学習を学んでいけばよいかも見ていきます。細かい手法の実装もPython/Rを用いておこなっていくので適宜参考にしてみてください。...

また、機械学習を実装する上で切っても切れない関係であるPythonに関しては以下の記事でまとめています!

【独学入門】初心者が3か月でPythonを習得できるようになる勉強法!当ブログ【スタビジ】の本記事では、Pythonを効率よく独学で習得する勉強法を具体的なコード付き実装例と合わせてまとめていきます。Pythonはできることが幅広いので自分のやりたいことを明確にして勉強法を選ぶことが大事です。...
Pythonを初学者が最短で習得する勉強法

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

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