【AI】機械学習 by Python:分類編⑨~その他の手法③:決定木~

AI・機械学習

 前回

にて線形分離が不可能な2項問題に対する手法である非線形SVMを見てきた。

 今回は、多項分類問題を解くためのメジャーな手法である決定木を扱う。

環境は下記を想定。
OS:Windows10(64bit版)
Pythonインストール環境:Anaconda3
Pythonバージョン:3.7
エディタ:Jupyter Notebook


仕組み

 イメージは「if文の連続」だ。

 目的変数と説明変数の関係に着目し、目的変数が変化する説明変数の閾値を探し出して分岐を繰り返す。

 最初は大きな分岐からスタートし、徐々に小さい分岐に移っていく。

実装例

実装例

# モジュールのインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from matplotlib.colors import ListedColormap
import sklearn
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics

# データセットのインポート
file=pd.read_csv('tree.csv')

# データの割り振り
X=file.iloc[:,0:2]
Y=file.iloc[:,2]

# データセットを学習データ(8割)とテストデータ(2割)に分割(random_stateは0)
X_train, X_test, Y_train, Y_test = sklearn.model_selection.train_test_split(X, Y, test_size=0.2, random_state=0)
# 分割の確認
print('分割の確認:',X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)

# 学習実行
# インスタンスの作成
model = DecisionTreeClassifier(max_depth=2)
# モデルの作成
model.fit(X_train, Y_train)

# 学習データからの予測値
pred_train = model.predict(X_train)
# テストデータからの予測値
pred_test = model.predict(X_test)

# 学習データを用いた分類モデルの評価
print('正解率(学習データ) = ', metrics.accuracy_score(Y_train, pred_train))

# テストデータを用いた分類モデルの評価
print('正解率(テストデータ) = ', metrics.accuracy_score(Y_test, pred_test))

# データセットの図示
plt.figure(figsize=(4,4))
plt.scatter(file.iloc[:,0], file.iloc[:,1], c=file.iloc[:,2], cmap=ListedColormap(['#FF0000', '#0000FF','#00FF00','#808080']))
plt.show()

出力例

分割の確認: (80, 2) (20, 2) (80,) (20,)
正解率(学習データ) =  1.0
正解率(テストデータ) =  1.0

 実際にプログラムを実行したい場合は、下記ボタンよりcsvファイル「tree.csv」をダウンロードしてプログラムの保存先に保存すること。

詳説

 こちらもロジスティック回帰、SVMのプログラムと構成はほとんど変わらない。

 ただし二項分類ではないため、適合率、再現率、F値の計算はない。

 

from sklearn.tree import DecisionTreeClassifier

⇒決定木モデルのクラスである「DecisionTreeClassifier」をインポートするためのコード。

 

file=pd.read_csv('tree.csv')

⇒「tree.csv」というcsvファイルをプログラム内に読み込み、それを変数「file」に格納するためのコード。
 データ構造は先の二項分類用の手法で使用したデータセットと同じであり、x-y座標上の点に対して「0」、「1」、「2」、「3」の値を割り振ったデータが100個集まったものになっている。

 

model = DecisionTreeClassifier(max_depth=2)

⇒クラス「DecisionTreeClassifier」を、「model」という名前のインスタンスに作り変えるコード。
 引数「max_depth」は決定木の深さを決めるパラメータである。
 「max_depth」を指定しないと、データによっては分岐を必要以上に繰り返してしまい、過学習になる可能性がある。

次回予告

 次回は決定木と同様、多項分類に用いられる手法である「k近傍法」を扱う。

参考文献

Pythonで学ぶ機械学習入門講座

 私が受講した通信講座。
 機械学習とはなんぞやという体系的な話からPython操作の基礎、各アルゴリズムの理論、プログラムの実装例まで取り上げ、短期間で最低限の実用レベルまで学ぶことができるようになっている。
 最低限の知識で全体を俯瞰しながら実装レベルまで学びたかった私にとって、最適な「足掛かり」となる講座だった。

 

 END


コメント

タイトルとURLをコピーしました