決定木分析のやり方(実践練習)

この記事を読んでわかること

・決定木分析の意味
・決定木分析のやり方
・決定木分析のサンプルコード

この記事は、実際に決定木分析を手を動かしながら覚えたいという方向けに書いているので、理論のところの説明は省きいきなり実践方法を説明するようにしました。
今回実践練習として扱う例題はあやめの種類の分類です。

※決定木分析とは?
決定木分析とは与えられた数値データから、それが何であるかを分類・予測する分析手法です。
例えば、身長や体重、年齢や血圧の数値から、その人が女性であるか男性であるかを分類・予測する手法です。

用意するパッケージ

まずは以下のパッケージを用意しましょう。

・numpy … 数値の計算を効率化するパッケージ
・pandas … 集めたデータをcsvファイル化するパッケージ
・matplotlib … より直感的なグラフを表示するパッケージ
・scikit-learn … 決定木分析を行うパッケージ
・pydotplus、IPython、export_graphviz … 決定木分析のグラフを見やすくするパッケージ

※注意…pydotplusとexport_graphvizのインポートでエラーが出る際は、ターミナルで以下のコードを入力して実行してください

pip install pydotplus
brew install graphviz

決定木分析は以下の手順で進めてください。

決定木分析の流れ

① 必要なパッケージのインストール
② scikit-learnから「あやめ」のデータを取得し俯瞰
③ データの加工
④ 決定木分析の実施
⑤ 決定木精度の確認

1つずつ見ていきましょう。

① 必要なパッケージのインストール

#基本的に必要なパッケージ
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt#決定木分析するパッケージ
import sklearn
from sklearn.tree import DecisionTreeClassifier#「あやめ」のデータサンプルのあるパッケージ
from sklearn import datasets#データの分割を行うパッケージ
from sklearn.model_selection import train_test_split




#決定木のモデルを描画するためのパッケージ
from sklearn.tree import export_graphviz
import pydotplus
from IPython.display import Image

#混合行列するためのパッケージ
from sklearn.metrics import confusion_matrix

 今回用いるデータは機械学習御用達モジュールであるscikit-learnに、初心者データサイエンティストの練習のためにもともと付属してある「あやめ」のデータサンプルを用いて分類します。

また、混合行列についてはのちに説明します

② scikit-learnから「あやめ」のデータを取得し俯瞰

#scikit-learnから「あやめ」のデータを取得
data = datasets.load_iris()#あやめデータの俯瞰
print(data.DESCR)
.. _iris_dataset:
Iris plants dataset——————–
**Data Set Characteristics:**
:Number of Instances: 150 (50 in each of three classes)
:Number of Attributes: 4 numeric, predictive attributes and the class
:Attribute Information:        – sepal length in cm
        – sepal width in cm
        – petal length in cm
        – petal width in cm

        – class:
          – Iris-Setosa
          – Iris-Versicolour
          – Iris-Virginica

    :Summary Statistics:

============== ==== ==== ======= ===== ====================

                    Min  Max Mean    SD Class Correlation

============== ==== ==== ======= ===== ====================

sepal length:   4.3 7.9 5.84   0.83 0.7826
sepal width:    2.0 4.4 3.05   0.43 -0.4194
petal length:   1.0 6.9 3.76   1.76 0.9490 (high!)
petal width:    0.1 2.5 1.20   0.76 0.9565 (high!)

============== ==== ==== ======= ===== ====================

    :Missing Attribute Values: None

    :Class Distribution: 33.3% for each of 3 classes.

    :Creator: R.A. Fisher

    :Donor: Michael Marshall (MARSHALL%[email protected])

    :Date: July, 1988

The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken

from Fisher’s paper. Note that it’s the same as in R, but not as in the UCI

Machine Learning Repository, which has two wrong data points.

This is perhaps the best known database to be found in the

pattern recognition literature.  Fisher’s paper is a classic in the field and

is referenced frequently to this day.  (See Duda & Hart, for example.) The

data set contains 3 classes of 50 instances each, where each class refers to a

type of iris plant.  One class is linearly separable from the other 2; the

latter are NOT linearly separable from each other.

.. topic:: References

   – Fisher, R.A. “The use of multiple measurements in taxonomic problems”

     Annual Eugenics, 7, Part II, 179-188 (1936); also in “Contributions to

     Mathematical Statistics” (John Wiley, NY, 1950).

   – Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.

     (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1. See page 218.

   – Dasarathy, B.V. (1980) “Nosing Around the Neighborhood: A New System

     Structure and Classification Rule for Recognition in Partially Exposed

     Environments”.  IEEE Transactions on Pattern Analysis and Machine

     Intelligence, Vol. PAMI-2, No. 1, 67-71.

   – Gates, G.W. (1972) “The Reduced Nearest Neighbor Rule”.  IEEE Transactions

     on Information Theory, May 1972, 431-433.

   – See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al”s AUTOCLASS II

     conceptual clustering system finds 3 classes in the data.

   – Many, many more …

これらから、「あやめ」はセトナ(Setosa)、バーシクル(Versicolour)、バージニカ(Virginica)の三種類あることがわかります。

それぞれがく片の長さ(sepal length)、がく片の幅(sepal width)、花びらの長さ(petal length)、花びらの幅(petal width)のデータが収められています。

今回はこれらのがく片の長さ&幅、花びらの長さ&幅から「あやめ」の種類を分類する決定木アルゴリズムを作成します。

③ データの加工

#「あやめ」の数値データをXで取得する
X = pd.DataFrame(data=data.data,columns=data.feature_names)
X.head()
#「あやめ」の種類データをYで取得する
Y = pd.DataFrame(data=data.target)
Y = Y.rename(columns={0: 'Ayame'})
Y.head()

Xには「あやめ」のがく片の長さ&幅、花びらの長さ&幅の数値データを取得しYには「あやめ」の種類データを取得させます

④ 決定木分析の実施

#データを訓練データと検証データに分ける(8:2)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)

訓練データで学習させ、検証データで精度を確認するためにそれぞれ8対2の割合で分割します

#決定木アルゴリズムの測定器を作成
clf = DecisionTreeClassifier()

決定木アルゴリズムの測定器をclfで作成します

#訓練の実施
clf.fit(X_train,Y_train)

訓練データを決定木に学習します

#決定木のグラフを出力
dot_data = export_graphviz(clf,out_file=None,feature_names=data.feature_names,class_names=data.target_names,filled=True,rounded=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())

このグラフよって、決定木分析では視覚的も簡単に判別基準がわかります。
次は決定木モデルの精度を確認していきます。

⑤ 決定木モデルの精度の確認

#混同行列の表示
df = pd.DataFrame(confusion_matrix(Y_test,clf.predict(X_test).reshape(-1,1)))
df = df.rename(columns={0: '予測:Setosa',1: '予測:Veriscolour',2: '予測:Virginica'}, index={0: '実際:Setosa',1: '実際:Veriscolour',2: '実際:Virginica'})
df

混合行列は上の表のことを指し、列にはこの決定木モデルが分類したデータ数を表し、行には実際にその種類のデータ数を表します。
簡単にいうと、予測と実際で同じ種類のセルにデータ数が多いほど精度が高いです。

#検証データで検証した精度の合致確率
clf.score(X_test,Y_test)
0.9666666666666667

数値的にも精度の合致確率は高いですね。

まとめ

以上が決定木分析の実践練習です。

このコードはそのまま他のデータでもお使い可能なので、エラーが出るところだけ修正して使ってみてもいいかもしれないですね!

ぜひみなさんの決定木分析ライフを応援しています!

それでは最後に今回使ったコードを下に載せておきます。

今回使用したコード

#必要なパッケージのインストール
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#決定木分析するパッケージ
import sklearn
from sklearn.tree import DecisionTreeClassifier

#あやめのデータサンプルのあるパッケージ
from sklearn import datasets

#データの分割を行うパッケージ
from sklearn.model_selection import train_test_split

#決定木のモデルを描画するためのパッケージ
from sklearn.tree import export_graphviz
import pydotplus
from IPython.display import Image

#混合行列するためのパッケージ
from sklearn.metrics import confusion_matrix

#scikit-learnから「あやめ」のデータを取得
data = datasets.load_iris()

#あやめデータの俯瞰
print(data.DESCR)

#「あやめ」の数値データをXで取得する
X = pd.DataFrame(data=data.data,columns=data.feature_names)
X.head()

#「あやめ」の種類データをYで取得する
Y = pd.DataFrame(data=data.target)
Y = Y.rename(columns={0: 'Ayame'})
Y.head()

#データを訓練データと検証データに分ける(8:2)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)

#決定木アルゴリズムの測定器を作成
clf = DecisionTreeClassifier()

#訓練の実施
clf.fit(X_train,Y_train)

#決定木のグラフを出力
dot_data = export_graphviz(clf,out_file=None,feature_names=data.feature_names,class_names=data.target_names,filled=True,rounded=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())

#混同行列の表示
df = pd.DataFrame(confusion_matrix(Y_test,clf.predict(X_test).reshape(-1,1)))
df = df.rename(columns={0: '予測:Setosa',1: '予測:Veriscolour',2: '予測:Virginica'}, index={0: '実際:Setosa',1: '実際:Veriscolour',2: '実際:Virginica'})
df

#検証データで検証した精度の合致確率
clf.score(X_test,Y_test)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA