テクノロジー

2024年11月15日

決定木とは

決定木は、属性 の組{属性1:値1,属性2:値2, 属性3:値3,…,属性n:値n}によって表現されたデータを、条件分岐を繰り返すことであるクラスに割り当てることができる木構造のグラフです

著者プロフィール

IT分野における教育の先駆者として、多くのエンジニアを育成するプログラミングスクールの運営、Web開発やAI研修を行なっています。幅広いレベルの受講生に対して実践的なスキルを提供。生徒の成長を第一に考え、効果的で魅力的な教育プログラムの設計に情熱を注いでいます。

ゴール

  • 「機械学習スクラッチ 決定木」決定木分析の実装に必要な知識や技術について理解する

目的

  • 決定木を理解する
  • 決定木をスクラッチ開発するのに必要な概念を理解する

どのように学ぶか

「課題 決定木」の目次と照らし合わせながら、進めていきましょう。

決定木(けっていぎ・ディシジョンツリー・decision tree)のイメージ

決定木は、属性 の組{属性1:値1,属性2:値2, 属性3:値3,…,属性n:値n}によって表現されたデータを、条件分岐を繰り返すことであるクラスに割り当てることができる木構造のグラフです

例1

例えば、イベント当日の気温とイベント開催の可否を示す次の表が与えられたとします。

気温 開催か否か
36.0 開催しない
32.9 開催する
30.8 開催する
41.5 開催しない
26.2 開催する
25.5 開催する
33.1 開催する
23.4 開催する
39.7 開催しない
40.3 開催しない

以下の例は会場の気温という属性の値によって、開催と中止のクラスに割り当てるグラフです。「会場の気温という属性の値は35以上かどうか」という条件分岐1回による決定木による分類が行えます。例えば36度がこの決定木にインプットされれば、中止というアウトプット(判断)ができます。

Image from Gyazo

以上のように、フローチャートの分岐を使って結果を予測する方法を「決定木」と呼びます。

例2

では、もう少し複雑な決定木の例を見てみましょう。
次の例は、「雨量」「屋内かどうか」「風の強さ」の3種類の属性を特徴量として、イベントが開催できるかどうかを分類する決定木です。

Image from Gyazo

丸で囲われたひとつひとつを ノード と呼びます。ノードには親子関係を考えることができ、例えば(0)のノードは(1)(2)(3)のノードの 親ノード と呼びます。逆に、(1)(2)(3)のノードは(0)のノードの 子ノード と呼びます。

一番上の(0)は ルートノード(根ノード(ねノード)) 、 末端の(1)(4)(5)(7)(8)(9)のような分類結果を表すノードは 葉ノード と呼びます。

条件分岐の矢印は エッジ と呼びます。あるノードから根ノードまでのエッジの数が 深さ です。(3)の深さは1、(6)の深さは2、(9)の深さは3です。そして、この決定木の最大の深さは3と数えます。

これは(0)に対して(1)(2)(3)の3つのノードが分かれている多岐分岐の決定木ですが、機械学習では2つにしか分かれないものが一般的です。学習時の複雑さを減らすためです。

スクラッチコードのひな形

class  ScratchDecesionTreeClassifier ():
  def __init__(self, verbose=False):
      self.verbose = verbose
  def fit(self):
      pass      
  def predict(self):
      pass
  def _calc_gini(self):
      psaa
  def _calc_ig(self):
      pass

1行目:クラスの定義
2行目:コンストラクタの定義。引数として次を渡しています。verbose(学習過程を出力するか否か)
3行目:verboseのメンバ変数化
4行目から5行目:学習関数です。ひな形なのでpassで関数定義しています。
6行目から7行目:予測関数です。
8行目から9行目:ジニ不純度の計算をする関数です。
10行目から11行目:情報利得の計算をする関数です。

まとめ

  • 決定木は、木構造のグラフを用いた機械学習法です。
  • ルートノードから条件分岐を繰り返してエッジをたどることでクラスを予測します。

ディープロで学んでみませんか?