TECH I.S.

機械学習 - Decision Tree(ディシジョンツリー)





ディシジョンツリー

この章では、「Decision Tree」の作り方を紹介します。意思決定ツリーはフローチャートであり、これまでの経験に基づいて意思決定を行うのに役立ちます。

この例では、人はコメディショーに行くべきかどうかを決めようとします。

幸いなことに、今回の例で、人は町でコメディショーが開かれるたびに登録し、お笑い芸人に関する情報を登録し、行ったかどうかも登録しました。


経験 ランク 国籍 行く
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 は新しいショーに参加する価値があるかどうかを判断するために使用できる決定木を作成できます。



どのように機能しますか?

まず、pandasでデータセットを読み取ります。

データセットを読み取って印刷します。

import pandas df = pandas.read_csv("data.csv") print(df)

実行例(開発準備中) »

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

数値以外の列「国籍」と「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)

実行例(開発準備中) »

これで、実際のデシジョン ツリーを作成し、詳細に適合させることができます。必要なモジュールをインポートすることから始めます。

ディシジョン ツリーを作成して表示します。

import pandas from sklearn import tree from sklearn.tree import DecisionTreeClassifier import matplotlib.pyplot as plt df = pandas.read_csv("data.csv") d = {'UK': 0, 'USA': 1, 'N': 2} df['Nationality'] = df['Nationality'].map(d) d = {'YES': 1, 'NO': 0} df['Go'] = df['Go'].map(d) features = ['Age', 'Experience', 'Rank', 'Nationality'] X = df[features] y = df['Go'] dtree = DecisionTreeClassifier() dtree = dtree.fit(X, y) tree.plot_tree(dtree, feature_names=features)

実行例(開発準備中) »


結果説明

決定木は、以前の決定を使用して、コメディアンに会いに行きたいかどうかのオッズを計算します。

決定木のさまざまな側面を読んでみましょう。

ランク

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は否定的な回答 (「いいえ」) の数であり、次の計算が得られます。

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」を意味します。

False - 8人のコメディアン続き

国籍

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 <= 35.5は、35.5 歳以下のお笑い芸人は左の矢印、それ以外は右の矢印をたどることを意味します。 gini = 0.375サンプルの約 37.5% が一方向に進むことを意味します。 samples = 4このブランチには 4 人のコメディアンが残っていることを意味します (4 人のコメディアンは英国から)。 value = [1, 3]この 4 人のコメディアンのうち、1 人が「NO」、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」になることを意味します。

False - コメディアン 2 人 続き:

経験

Experience <= 9.5つまり、経験年数が 9.5 年以下のコメディアンは左の矢印に従い、それ以外は右の矢印に従います。 gini = 0.5サンプルの 50% が一方向に進むことを意味します。 samples = 2は、このブランチに 2 人のコメディアンが残っていることを意味します (2 人のコメディアンは 35.5 歳以上)。 value = [1, 1]は、これら 2 人のコメディアンのうち、1 人が「NO」、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 人のコメディアンが残っていることを意味します (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% 確実な答えが得られるわけではないためです。それは結果の確率に基づいており、答えはさまざまです。



プログラミング学習を加速させる

プログラミングをプロの講師に教えてもらいませんか。

テックアイエスのプログラミングスクールは初心者も大歓迎です。年齢制限もありません。転職・副業に強く、挫折させない手厚いサポートで稼ぐ力を身につけましょう!

スクールの詳細