การเรียนรู้ของคอมพิวเตอร์ - ต้นไม้ตัดสิน


決策樹(Decision Tree)

在本章中,我們將向您展示如何制作“決策樹”。決策樹是一種流程圖,可以幫助您根據以前的经验進行決策。

在這個例子中,一個人將嘗試決定他/她是否應該參加喜劇節目。

幸運的是,我們的例中人物每次在鎮上舉辦喜劇節目時都進行註冊,並註冊一些關於喜劇演員的信息,並且還登記了他/她是否去過。

Age Experience 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 แสดงว่านักแสดงเรียลิตี้ที่ 'Rank' ต่ำกว่า 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 ในบทความนี้

วิธีการ Gini ใช้สูตรดังต่อไปนี้:

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

ในนั้น x คือจำนวนของคำตอบที่ยืนยัน ("GO") น คือจำนวนตัวอย่าง และ y คือจำนวนของคำตอบที่ไม่ยืนยัน ("NO") ใช้สูตรดังต่อไปนี้เพื่อคำนวณ:

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


ขั้นตอนต่อไปประกอบด้วยสองกรอบ หนึ่งกรอบใช้สำหรับนักแสดงเรียลิตี้ที่ 'Rank' คือ 6.5 หรือต่ำกว่า และอีกกรอบหนึ่ง

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 个喜剧演员(8 个喜剧演员的等级高于 6.5)。

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 名喜剧演员(2 名 35.5 岁或更年轻的喜剧演员)。

value = [0, 2] 表示在这 2 位喜剧演员中,0 将获得 "NO",而 2 将获得 "GO"。

False - 2 名戏剧演员继续:

Experience(经验)

Experience <= 9.5 表示具有 9.5 年或以上经验的喜剧演员将遵循左侧的箭头,其余的将遵循右侧的箭头。

gini = 0.5 表示 50% 的样本将朝一个方向移动。

samples = 2 表示此分支中还剩下 2 个喜剧演员(2 个年龄超过 35.5 的喜剧演员)。

value = [1, 1] 表示这两个喜剧演员中,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% ได้ คำตอบของมันขึ้นอยู่กับความเป็นไปได้ของผลลัพธ์ คำตอบจึงจะแตกต่างกัน