機械学習 - デシジョンツリー


決定木(Decision Tree)

この章では、「決定木」を作成する方法をお見せします。決定木は、過去の経験に基づいて決定を助けるプロセス図です。

この例では、ある人がコメディショーに参加すべきかどうかを決定しようと試みます。

幸いなことに、私たちの例の人物は、町でコメディショーを開催するたびに登録を行い、コメディアンの情報を登録し、かつ訪問経験があるかどうかも記録しています。

年齢 エクスペリエンス Rank Nationality Go
36 10 9 UK NO
42 12 4 USA NO
23 4 6 N NO
52 4 4 USA NO
43 21 8 USA YES
44 14 5 UK NO
66 3 7 N YES
35 14 9 UK YES
52 13 7 N YES
35 5 9 N YES
24 3 5 USA NO
18 3 7 UK YES
45 9 9 UK YES

今、このデータセットに基づいて、Pythonが決定木を作成することができます。この決定木は、新しい公演に参加する価値があるかどうかを決定するために使用できます。

動作原理

まず、必要なモジュールをインポートし、pandasを使用してデータセットを読み込みます:

インスタンス

データセットを読み込んで表示します:

import pandas
from sklearn import tree
import pydotplus
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import matplotlib.image as pltimg
df = pandas.read_csv("shows.csv")
print(df)

インスタンスを実行

決定木を作成するには、すべてのデータが数値でなければなりません。

私たちは非数字列「Nationality」および「Go」を数値に変換する必要があります。

Pandasには、 map() このメソッドは、値の変換に関する情報を含む辞書を受け取ります。

{'UK': 0, 'USA': 1, 'N': 2}

値 'UK' を 0、'USA' を 1、'N' を 2 に変換することを示しています。

インスタンス

文字列値を数値に変更します:

d = {'UK': 0, 'USA': 1, 'N': 2}
df['Nationality'] = df['Nationality'].map(d)
d = {'YES': 1, 'NO': 0}
df['Go'] = df['Go'].map(d)
print(df)

インスタンスを実行

次に、特徴列と目標列を分ける必要があります。

特徴列は予測を試みる列であり、目標列は予測を試みる値を持つ列です。

インスタンス

X は特徴列、y は目標列です:

features = ['Age', 'Experience', 'Rank', 'Nationality']
X = df[features]
y = df['Go']
print(X)
print(y)

インスタンスを実行

今、私たちは実際の決定木を作成し、私たちの詳細に合わせて、コンピュータ上に.pngファイルとして保存することができます:

インスタンス

決定木を作成し、画像として保存して、その画像を表示します:

dtree = DecisionTreeClassifier()
dtree = dtree.fit(X, y)
data = tree.export_graphviz(dtree, out_file=None, feature_names=features)
graph = pydotplus.graph_from_dot_data(data)
graph.write_png('mydecisiontree.png')
img=pltimg.imread('mydecisiontree.png')
imgplot = plt.imshow(img)
plt.show()

インスタンスを実行

結果の説明

決定木は、コメディアンを見に行くかどうかの確率を計算するために、あなたの先前的な決定を使用します。

決定木の異なる側面を読んでみましょう:


Rank

Rank <= 6.5 ランクが6.5未満のコメディアンは以下のように従います。 True 矢印(左方向)、残りはそれに従います。 False 矢印(右方向)。

gini = 0.497 これは分割の質を示し、常に0.0から0.5の間の数字で、0.0はすべてのサンプルが同じ結果を得たことを示し、0.5は分割が完全に真ん中で行われたことを示します。

samples = 13 この決定のポイントではまだ13人のコメディアンが残っており、これは最初のステップだからです。したがって、彼らはすべてコメディアンです。

value = [6, 7] これは13人のコメディアンのうち6人が"NO"、7人が"GO"を得ることを示しています。

Gini

サンプルを分割する方法はたくさんありますが、このチュートリアルではギニ方法を使用します。

ギニ方法は以下の公式を使用します:

Gini = 1 - (x/n)2 - (y/n)2

ここでは、xは肯定答えの数("GO")、nはサンプルの数、yは否定答えの数("NO")で、以下の公式を使用して計算されます:

1 - (7 / 13)2 - (6 / 13)2 = 0.497


次のステップには2つのボックスがあります。そのうち1つのボックスはランクが6.5またはそれ以下のコメディアン用で、残りは1つのボックスです。

True - ここで5人のコメディアンが終わります:

gini = 0.0 すべてのサンプルが同じ結果を得たことを示しています。

samples = 5 この枝にはまだ5人のコメディアンが残っています(5人のランクは6.5またはそれ以下のコメディアンです)。

value = [5, 0] 5名は「NO」、0名は「GO」を獲得します。

False - 8 名演劇演员続きます:

Nationality(国籍)

Nationality <= 0.5 国籍値が0.5以下の喜劇演员は左の矢印に従います(これはイギリス出身の全員を指します)、それ以外の者は右の矢印に従います。

gini = 0.219 約22%のサンプルが一方の方向に移動します。

samples = 8 この枝にはまだ8名の喜劇演员が残っています(評価が6.5以上の8名の喜劇演员です)。

value = [1, 7] この8名の喜劇演员のうち、1名は「NO」、7名は「GO」を獲得します。


True - 4 名演劇演员続きます:

Age(年齢)

Age <= 35.5 35.5歳以下の喜劇演员は左の矢印に従い、それ以外の者は右の矢印に従います。

gini = 0.375 約37.5%のサンプルが一方の方向に移動します。

samples = 4 この枝にはまだ4名の喜劇演员が残っています(イギリス出身の4名の喜劇演员です)。

value = [1, 3] この4名の喜劇演员のうち、1名は「NO」、3名は「GO」を獲得します。

False - 4 名喜劇演员ここで終わります:

gini = 0.0 すべてのサンプルが同じ結果を得ました。

samples = 4 この枝にはまだ4名の喜劇演员が残っています(イギリス出身の4名の喜劇演员です)。

value = [0, 4] この4名の喜劇演员のうち、0名は「NO」、4名は「GO」を獲得します。


True - 2 名喜劇演员ここで終わります:

gini = 0.0 すべてのサンプルが同じ結果を得ました。

samples = 2 この枝にはまだ2名の喜劇演员が残っています(35.5歳以下の2名の喜劇演员です)。

value = [0, 2] この2名の喜劇演员のうち、0名は「NO」、2名は「GO」を獲得します。

False - 2 名演劇演员続きます:

Experience(経験)

Experience <= 9.5 9.5年またはそれ以上の経験を持つ喜劇演员は左の矢印に従い、それ以外の者は右の矢印に従います。

gini = 0.5 50%のサンプルが一方の方向に移動します。

samples = 2 この枝にはまだ2名の喜劇演员が残っています(35.5歳以上の2名の喜劇演员です)。

value = [1, 1] この2名の喜劇演员のうち、1名は「NO」、もう1名は「GO」を獲得します。


True - 1 名喜劇演员ここで終わります:

gini = 0.0 すべてのサンプルが同じ結果を得ました。

samples = 1 この枝には 1 名のコメディ俳優が残っています(9.5 年以下の経験を持つコメディ俳優がいます)。

value = [0, 1] 0 は「NO」を表し、1 は「GO」を表します。

False - ここまで 1 名のコメディ俳優:

gini = 0.0 すべてのサンプルが同じ結果を得ました。

samples = 1 この枝には 1 名のコメディ俳優が残っています(その中には 9.5 年以上の経験を持つコメディ俳優がいます)。

value = [1, 0] 1 は「NO」を表し、0 は「GO」を表します。

予測値

新しい値を予測するために決定木を使用できます。

例えば:40歳のアメリカのコメディ俳優が主演で、10年間の経験があり、コメディ評価が 7 のショーを見るべきですか?

インスタンス

使用 predict() 新しい値を予測する方法:

print(dtree.predict([[40, 10, 7, 1]]))

インスタンスを実行

インスタンス

コメディレベルが 6 なら、何が答えですか?

print(dtree.predict([[40, 10, 6, 1]]))

インスタンスを実行

異なる結果

十分に多く回実行すると、同じデータを入力しても、決定木は異なる結果を提供します。

これは、決定木が 100% の確信の答えを提供できないためです。結果の可能性に基づいて、答えは異なります。