機械学習-ディシジョンツリー
デシジョンツリー
この章では、「デシジョンツリー」の作成方法を説明します。デシジョンツリーはフローチャートであり、以前の経験に基づいて意思決定を行うのに役立ちます。
この例では、人はコメディショーに行くべきかどうかを決定しようとします。
幸いなことに、私たちの例の人は、町でコメディショーが行われるたびに登録し、コメディアンに関するいくつかの情報を登録し、彼/彼女が行ったかどうかも登録しました。
年 | 経験 | ランク | 国籍 | 行け |
36 | 10 | 9 | 英国 | いいえ |
42 | 12 | 4 | 米国 | いいえ |
23 | 4 | 6 | N | いいえ |
52 | 4 | 4 | 米国 | いいえ |
43 | 21 | 8 | 米国 | はい |
44 | 14 | 5 | 英国 | いいえ |
66 | 3 | 7 | N | はい |
35 | 14 | 9 | 英国 | はい |
52 | 13 | 7 | N | はい |
35 | 5 | 9 | N | はい |
24 | 3 | 5 | 米国 | いいえ |
18 | 3 | 7 | 英国 | はい |
45 | 9 | 9 | 英国 | はい |
現在、このデータセットに基づいて、Pythonは、新しい番組に参加する価値があるかどうかを判断するために使用できる決定木を作成できます。
それはどのように機能しますか?
まず、必要なモジュールをインポートし、パンダでデータセットを読み取ります。
例
データセットを読み取って印刷します。
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 <= 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人が「いいえ」、7人が「GO」になります。
ジニ
サンプルを分割する方法はたくさんあります。このチュートリアルではGINIメソッドを使用します。
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人のコメディアンが残っていることを意味します(ランク6.5以下の5人のコメディアン)。
value = [5, 0]
5は「NO」を取得し、0は「GO」を取得することを意味します。
誤り-8人のコメディアンが続ける:
国籍
Nationality <= 0.5
国籍の値が0.5未満のコメディアンは、左側の矢印(つまり、英国の全員)をたどり、残りは右側の矢印をたどることを意味します。
gini = 0.219
これは、サンプルの約22%が一方向に進むことを意味します。
samples = 8
このブランチには8人のコメディアンが残っていることを意味します(ランクが6.5より高い8人のコメディアン)。
value = [1, 7]
つまり、これらの8人のコメディアンのうち、1人は「いいえ」、7人は「GO」になります。
真-4人のコメディアンが続く:
年
Age <= 35.5
つまり、35.5歳以下のコメディアンは左の矢印に従い、残りは右の矢印に従います。
gini = 0.375
これは、サンプルの約37.5%が一方向に進むことを意味します。
samples = 4
このブランチには4人のコメディアンが残っていることを意味します(英国からの4人のコメディアン)。
value = [1, 3]
つまり、これら4人のコメディアンのうち、1人は「いいえ」、3人は「GO」になります。
誤り-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」を取得します。
誤り-2人のコメディアンが続ける:
経験
Experience <= 9.5
つまり、9。5年以下の経験を持つコメディアンは左の矢印に従い、残りは右の矢印に従います。
gini = 0.5
これは、サンプルの50%が一方向に進むことを意味します。
samples = 2
このブランチには2人のコメディアンが残っていることを意味します(35.5歳以上の2人のコメディアン)。
value = [1, 1]
つまり、これら2人のコメディアンのうち、1人は「いいえ」、1人は「GO」になります。
True-1コメディアンはここで終わります:
gini = 0.0
すべてのサンプルが同じ結果を得たことを意味します。
samples = 1
このブランチには1人のコメディアンが残っていることを意味します(9。5年以下の経験を持つ1人のコメディアン)。
value = [0, 1]
0は「NO」を取得し、1は「GO」を取得することを意味します。
False-1コメディアンはここで終わります:
gini = 0.0
すべてのサンプルが同じ結果を得たことを意味します。
samples = 1
このブランチには1人のコメディアンが残っていることを意味します(9。5年以上の経験を持つ1人のコメディアン)。
value = [1, 0]
1は「NO」を取得し、0は「GO」を取得することを意味します。
値を予測する
デシジョンツリーを使用して、新しい値を予測できます。
例:10年の経験があり、コメディのランキングが7である、40歳のアメリカのコメディアンが出演するショーを見に行く必要がありますか?
例
新しい値を予測するには、predict()メソッドを使用します。
print(dtree.predict([[40, 10, 7, 1]]))
例
コメディランクが6だったら、答えはどうなるでしょうか。
print(dtree.predict([[40, 10, 6, 1]]))
異なる結果
同じデータをフィードした場合でも、十分な回数実行すると、ディシジョンツリーの結果が異なることがわかります。
これは、ディシジョンツリーが100%確実な答えを提供しないためです。それは結果の確率に基づいており、答えは異なります。